Entwickler-Ecke

Sonstiges (Delphi) - Kollisionsabfrage von Ellipsen in Delphi 7


MeMo7 - Sa 25.09.10 14:08
Titel: Kollisionsabfrage von Ellipsen in Delphi 7
Hey Leute, da ich z.Z. ein kleines Problem in Delphi habe, dachte ich mir ich wende mich an euch.

Und zwar:

Wir sollen im Informatikunterricht ein Programm schreiben, welches Kugeln zeichnen soll, welche von den "Wänden"(also die von dem Image) abprallen sollen.
Des hab ich soweit sehr schnell geschafft.
Jedoch sollen wir noch die Kugeln untereinander abprallen lassen.D.h. wenn die eine die andere trifft sollen beide abprallen(physikalische Richtigkeit kann etwas vernachlässigt werden).

Genau da scheitere ich:
Bei den Abfragen ob die Kugeln sich treffen fallen mir keine Abfragen ein.
Die, die ich am Anfang hatte, haben das Abstoßverhalten der Kugeln sehr verändert.
Sie sind ohne etwas zu berühren einfach an "nichts" abgeprallt.
Irgendendetwas stimmt also an den Abfragen nicht, und ich weiß auch nicht, wie ich diese wählen soll.

Meine Klasse TBall sieht z.Z. so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
///////////////////////////////////////////////////////////////////////////////////////////////////////////
type
  TBall = class

  // published Attribute
    bRad : Integer;
    xPos : Integer;
    yPos : Integer;
    zx : Integer;//Wert um den sie sich bewegen
    zy : Integer;//Wert um den sie sich bewegen
    kBall : TBall;
    bContainer : TImage;
    Color:TColor;


  public //Methoden
    constructor Ballzeichnen (x: Integer; y: Integer; Container: TImage;Farbe:TColor); virtual;
    procedure BMove; virtual;

    procedure KenntWand; virtual;
    procedure KenntBall(aBall:TBall;bBall:TBall); virtual;

///////////////////////////////////////////////////////////////////////////////////////////////////////////

(Wir sollen das Abprallen als eine Kennt Beziehung deklarieren,daher "KenntWand".)





Meine Frage:

Welche Abfragen für das Abprallen der Kugeln untereinander soll ich wählen?
Meine haben nicht hingehauen.

Moderiert von user profile iconMartok: Delphi-Tags gesetzt


platzwart - Sa 25.09.10 14:21

Erster Gedanke: Die Bälle haben eine Position und einen Durchmesser. Wenn der Abstand zweier Bälle kleiner als die Summe der beiden Durchmesser ist, dann kollidieren sie.


MeMo7 - Sa 25.09.10 14:40

Hmm du meinst also:
bRad+bRad>(Ball1.xPos-Ball2.xPos)+(Ball1.yPos-Ball2.yPos)--->sie kollidieren?

Oder liege ich da falsch?

Achja der Radius ist bei beiden 35


jaenicke - Sa 25.09.10 14:43

Naja, fast. Du hast da nicht wirklich den Abstand berechnet sondern die Summe der Abstände in X- und Y-Richtung. Das ist aber nicht der Abstand.

Kennst du den Satz des Pythagoras? Du hast die beiden Katheten berechnet und musst daraus nun noch die Hypothenuse (den Abstand) errechnen. ;-)


MeMo7 - Sa 25.09.10 14:47

Ja, ich weiß was er bedeutet, aber in diesem Fall handelt es sich doch um ein Viereck, in dem der Kreis gemalt wurde?
Oder was meinst du mit der Hypothenuse?

edit:
http://upload.wikimedia.org/math/c/7/f/c7fc672308bbafea5e21e9cefd0d572f.png

meinst du das?

Aber welchen Abstand berechne ich damit?Den der Bälle?
Problem: Die haben doch 4 Punkte...:/
Muss ich dann die 4 Fälle abfragen?


jaenicke - Sa 25.09.10 14:52

Stell dir die beiden Mittelpunkte und die Abstände in X- und Y-Richtung vor. Schon hast du ein Dreieck. ;-)

Edit: Ja, meine ich.
Und da musst du die beiden Mittelpunkte nehmen. Oder die linken oberen Punkte deines Vierecks, wenn es ohnehin Kreise sind. Wie auch immer.


MeMo7 - Sa 25.09.10 14:56

http://img153.imageshack.us/i/unbenanntnnz.png/

so etwa?


Martok - Sa 25.09.10 14:59

Hallo!

Bitte verwende für Quellcode die entsprechenden [delphi]-Tags, dann wird er "schöner" dargestellt als im Fließtext. Beispiel:

Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG3cd0e9b918a1bce34397b8127234a412}</span></span>                    

Wird:

Delphi-Quelltext
1:
var Test: integer;                    


user profile iconMeMo7 hat folgendes geschrieben Zum zitierten Posting springen:
http://img153.imageshack.us/i/unbenanntnnz.png/

so etwa?

Genau so.

Viele Grüße,
Martok


MeMo7 - Sa 25.09.10 15:15

Neues Problem:

Delphi-Quelltext
1:
2:
  x:=(((aBall.xPos+bRad)/2)-((bBall.xPos+bRad)/2))^2+(((aBall.yPos+bRad)/2)-((bBall.yPos+bRad)/2))^2
  z:=sqrt(x);


der nimmt ^2 nicht an,dabei hat ich das so gelernt.Wie quadriere ich dann?


edit:
[Error] mBall.pas(83): Pointer type required
[Error] mBall.pas(83): Pointer type required
[Error] mBall.pas(84): Missing operator or semicolon --> sqrt(x)


glotzer - Sa 25.09.10 15:21

^ wird in Delphi für pointer verwendet. irgendwo gibts ne function die das amcht, find den namen leider gerade nicht...


Jakob_Ullmann - Sa 25.09.10 15:28

Power aus der Unit Math:

Power(basis, exponent)
("<basis> to the power of <exponent>")

Zitat:
(physikalische Richtigkeit kann etwas vernachlässigt werden)


Wäre mir lieber als mir die Arbeit zu machen, irgendetwas da hinzuschreiben, das irgendwie realistisch wirken soll.


Martok - Sa 25.09.10 17:16

Oder schneller Sqr (für Square)

Ansonsten hast du dich mit den Klammern auch etwas verzettelt... warum diese Form?
(aBall.yPos+bRad)/2 richtiger wäre doch wohl aBall.yPos+bRad/2

Also:

Delphi-Quelltext
1:
2:
  x:=Sqr((aBall.xPos+bRad/2)-(bBall.xPos+bRad/2)) + Sqr((aBall.yPos+bRad/2)-(bBall.yPos+bRad/2));
  z:=sqrt(x);


Davon abgesehen ist die Klasse etwas sehr seltsam aufgebaut. Das will ich hier aber mal nicht weiter kritisieren, wenn das im Unterricht so gemacht wird muss man wohl damit leben. Auch wenns nicht wirklich OOP ist.


MeMo7 - Sa 25.09.10 17:45

Vielen Dank, hat geklappt, auch wenn das Ergebnis immernoch etwas komisch ist.
Warum prallen die Kugel manchmal ab, ohne dass sie sich kommplett berühren?


Edit:Das Abprallen ist nicht richtig umgesetz(muss halt noch unterscheiden von wo die Kugel kommt)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  x:=Sqr((aBall.xPos+bRad/2)-(bBall.xPos+bRad/2)) + Sqr((aBall.yPos+bRad/2)-(bBall.yPos+bRad/2));
  z:=sqrt(x);
  IF z<bRad*2
  then
  begin
  zx:=zx*-1;
  zy:=zx*-1;


MeMo7 - Sa 25.09.10 21:26

So habs erfolgreich beendet.
Läuft 1a und macht alles was ich will.

Natürlich teil ich mit euch das Endergebnis.

Vielen Dank an Alle, die mir die Denkanstöße,Tipps und Hilfen gegeben haben.