| Autor |
Beitrag |
MeMo7
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 25.09.10 14:08
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
bRad : Integer; xPos : Integer; yPos : Integer; zx : Integer; zy : Integer; kBall : TBall; bContainer : TImage; Color:TColor;
public 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 Martok: Delphi-Tags gesetzt
Zuletzt bearbeitet von MeMo7 am Sa 25.09.10 14:41, insgesamt 1-mal bearbeitet
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: 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.
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
MeMo7 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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:
upload.wikimedia.org...5e21e9cefd0d572f.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?
Zuletzt bearbeitet von MeMo7 am Sa 25.09.10 14:53, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 25.09.10 14:56
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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
Genau so.
Viele Grüße,
Martok
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
MeMo7 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: 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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
MeMo7 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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; |
Einloggen, um Attachments anzusehen!
|
|
MeMo7 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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.
Einloggen, um Attachments anzusehen!
|
|