Autor Beitrag
MeMo7
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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:
ausblenden 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


Zuletzt bearbeitet von MeMo7 am Sa 25.09.10 14:41, insgesamt 1-mal bearbeitet
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 25.09.10 14:56 
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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:
ausblenden Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG3cd0e9b918a1bce34397b8127234a412}</span></span>					

Wird:
ausblenden Delphi-Quelltext
1:
var Test: integer;					


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

so etwa?

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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 25.09.10 15:15 
Neues Problem:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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)
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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!