Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Aug 01, 2025 21:02

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kollision, mal wieder :)
BeitragVerfasst: Di Sep 28, 2004 13:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
ich muss direkt von vorne rein sagen das ich in Mathe nicht sehr fit bin, also wer mit hohe Mathematik ankommt, da verstehe ich so wieso nichts :cry: , aber ein versuch ist es wert :D .

Also ich habe eine Kugel, mit der Position und dem Radius.
Mit dieser Funktion prüfe ich ob ein bestimmter Punkt im Kreis ist.
Code:
  1.  
  2. function PointInKugel(Kugel: TGLVertex3f; point: TGLVertex3f; r: single): boolean;
  3. begin
  4.   result := (sqr(Kugel.x - point.x) + sqr(Kugel.y - point.y) + sqr(Kugel.z - point.z)) < sqr(r);
  5. end;
  6.  

Nur jetzt wollte ich eine Kollision zwischen einem Kreis und einem Quadrat programmieren.
Nur leider bekomme ich das alleine nicht hin :cry:.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 28, 2004 15:13 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
deine Punkt-Kugel-Kollision ist nicht sehr effizient, da man noch quadrieren muss usw...
so müsste es (wenn ich mich da nicht grad vertue) wesentlich einfacher gehen:
Code:
  1. result := (abs(kugel.x-point.x)<r) and (abs(kugel.y-point.y)<r) and (abs(kugel.z-point.z)<r);

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: kleine zwischenfrage
BeitragVerfasst: Di Sep 28, 2004 15:49 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
bedeutet der operator AND das gleiche wir "+" ??

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 28, 2004 16:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Nein, AND = Logische Und-Verknüpfung, also quasi eine Bedingung.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 28, 2004 16:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
achso die gibt ja bool zurück. das heisst result ist nur true, wenn alle drei bedingungen wahr sind. Danke. :roll:

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 28, 2004 19:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Wenn ich mich nicht täuschen sollte, musst du einfach nur die Eckpunkte deines Rechteckes jeweils um den Kreisradius entlang jeder Achse erweitern. Dann prüfst du einfach, ob der Kreismittelpunkt im Rechteck liegt.
Anschließend musst du noch prüfen, ob ein Eckpunkt des Rechtecks im Kreis liegt.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 28, 2004 21:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Fiji-Fighter hat geschrieben:
deine Punkt-Kugel-Kollision ist nicht sehr effizient, da man noch quadrieren muss usw...
so müsste es (wenn ich mich da nicht grad vertue) wesentlich einfacher gehen:
Code:
  1. result := (abs(kugel.x-point.x)<r) and (abs(kugel.y-point.y)<r) and (abs(kugel.z-point.z)<r);

Nein das würde so wie ich das sehe nicht gehen.
Nehm dir doch mal folgende Werte
Punkt=(0,0,0)
Kugel=(0.9,0.9,0.9)
r=1
Der Punkt läge auserhalb der Kugel, aber innerhalb des Würfels mit der Seitelänge 2r, für den deine Überprüfung gilt.

Auch bei Magellan gibt es einen Haken da das zu überprüfende "Rechteck" runde Ecken hat.

Die erste Methode ist zwar auch vom Ansatz her nicht schlecht, nur könnte auch ein Rechteck/Quadrat einen Kreis auch so schneiden, ohne das ein Eckpunkt des Qudarates im Kreis liegt.

MfG
IFlo

PS: Mir fällt auf die schnelle aber auch nichts ein... :wink:

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 28, 2004 22:32 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
IFlo hat geschrieben:
Nein das würde so wie ich das sehe nicht gehen.

ok hast recht *duck* :oops: 8)

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 29, 2004 07:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Die runden Ecken wurden schon bedacht aber ich habe mich vielleicht etwas undeutlich ausgedrückt.
Zitat:
Anschließend musst du noch prüfen, ob ein Eckpunkt des Rechtecks im Kreis liegt.

Diese Überprüfung würde wenig Sinn machen, wenn man nicht zuvor prüft ob der Mittelpunkt in einem Quadrat zwischen einem originalen Eckpunkt des Rechtecks und dem dazugehörigen Eckpunkt des erweiterten Rechtecks liegt.
Also Schritt für Schritt:

1) prüfen, ob der Kreismittelpunkt im erweiterten Rechteck liegt. Liegt der Mittelpunkt nicht im erweiterten Rechteck, dann findet auch keine Kollision statt.
2) Trifft Fall 1) zu muss geprüft werden ob der Mittelpunkt in einem der Quadrate zwischen den Originaleckpunkten und den erweiterten Eckpunkten des Rechtecks liegt. Trifft dieser Fall nicht zu, findet eine Kollision statt
3) Trifft auch Fall 2) zu, muss geprüft werden ob ein Eckpunkt des Originalrechtecks im Kreis liegt. Trifft dieser Fall zu findet eine Kollision statt. Andernfalls nicht.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 29, 2004 10:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 08, 2003 15:49
Beiträge: 266
Wohnort: Aachen
Also ich habe mir jetzt eine „Billige Kollision“ zusammen gebastelt.
Code:
  1.  
  2. function IsCollision(Ball : TGLVertex3f;BallR : Double;Wall : TGLVertex3f; h,w : Doub-le;Computer : Boolean = False):Boolean;
  3. begin
  4.   if not Computer then
  5.     if (ball.y+BallR < wall.y+h) and (ball.y+BallR > wall.y-h) and (ball.x+BallR >= wall.x) then
  6.       result := true
  7.     else
  8.       result := false
  9.   else
  10.     if (ball.y+BallR < wall.y+h) and (ball.y+BallR > wall.y-h) and (ball.x+BallR <= wall.x) then
  11.       result := true
  12.     else
  13.       result := false;
  14. end;
  15.  

ob die so gut ist :?:, die kann man bestimmt noch verbessern ;) .
Das ist meine Methode für die Richtung
Code:
  1.  
  2. procedure ScheckBall;
  3. var
  4.   v : TGLVertex3f;
  5. begin
  6.   if IsCollision(FBallPos,0.2,FPosition,1,0.2) then begin
  7.     FBallRichtungX := False;
  8. //    FBallRichtungY := True;
  9.   end ;
  10.  
  11.   if IsCollision(FBallPos,0.2,FComputerPos,1,0.2,false) then begin
  12.     FBallRichtungX := True;
  13.     //  FBallRichtungY := False;
  14.   end;
  15.  
  16.   if FBallRichtungX then
  17.     FBallPos.x := FBallPos.x +0.1
  18.   else
  19.     FBallPos.x := FBallPos.x -0.1
  20. end;
  21.  

und hier wird das ganze in der Draw Methode aufgerufen.
Code:
  1.  
  2. procedure glDraw;
  3. begin
  4.   ....
  5.   //User
  6.   glscalef(0.05,1,0.05);
  7.   TexturLoader.BindTextur('raster01.bmp');
  8.  
  9.   DrawQuade(GL_QUADS,1,1);
  10.  
  11.   glPopMatrix;
  12.   glPushMatrix;
  13.  
  14.   //PC
  15.   FComputerPos.y := sin(rot2);
  16.   glTranslatef(FComputerPos.x,FComputerPos.y,FComputerPos.z);
  17.   glscalef(0.05,1,0.05);
  18.  
  19.   TexturLoader.BindTextur('raster01.bmp');
  20.   DrawQuade(GL_QUADS,1,1);
  21.   ....
  22. end;
  23.  

Wenn ihr noch Verbesserungsvorschläge bezüglich der Kollision oder so habt immer her damit :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 30, 2004 13:34 
Offline
DGL Member

Registriert: Di Sep 21, 2004 10:53
Beiträge: 8
Wohnort: München
Das Folgende

Code:
  1.  
  2.     if (ball.y+BallR < wall.y+h) and (ball.y+BallR > wall.y-h) and (ball.x+BallR >= wall.x) then
  3.       result := true
  4.     else
  5.       result := false
  6.  


kann man so

Code:
  1. result := (ball.y+BallR < wall.y+h) and (ball.y+BallR > wall.y-h) and (ball.x+BallR >= wall.x);


vereinfachen.

Gruss,
khm


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]