Autor Beitrag
cir
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 12.04.05 08:19 
hi, ich muss im infounterricht kugeln programmieren, die kollision mit der wand is ja kein problem gewesen, aber die kollision der kugeln untereinander krieg ich nicht hin, obwohl es mit der formel eigentlich gehen müsste. vllt könnt ihr mir ja helfen.

hier das programm:

ausblenden volle Höhe 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:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
PROGRAM Billard;

uses
uKugel,
msum;

  VAR
   Kugel2,Kugel1: meineKugel;
   mBildschirm: Bildschirm;
   mstift: Buntstift;
   mmaus: maus;
   m1x,m1y,m2x,m2y: real; // die mittelpunkte der kugeln

begin
  randomize;
  mBildschirm:= Bildschirm.init;
  Kugel2 := meineKugel.init(random(962)+30,random(669)+30,random(360),random(5)+1,rot,orange,mBildschirm);
  Kugel1 := meineKugel.init(random(962)+30,random(669)+30,random(360),random(5)+1,blau,hellblau,mBildschirm);
  mstift := Buntstift.init;
  mmaus := maus.init;

repeat
  Kugel1.bewege;
  m1x := mstift.hposition;  // nach dem bewegen von kugel1
  m1y := mstift.vposition;  // den neuen mittelpunkt ermitteln
  Kugel2.bewege;
  m2x := mstift.hposition;  // nach dem bewegen von kugel2
  m2y := mstift.vposition;  // den neuen mittelpunkt ermitteln
    IF (sqr(m2x - m1x) + sqr(m2y - m1y)) < 3600 then begin // mithilfe von pythagoras feststellen, ob eine kollision vorliegt (3600 = radius^2)
      kugel1.kol; // kugel 1 abprallen lassen
      kugel2.kol; // kugel 2 abprallen lassen
    end;
until mMaus.istGedrueckt;

  Kugel2.gibFrei;
  Kugel1.gibfrei;
  mmaus.gibFrei;
  mstift.gibfrei;
  mBildschirm.gibFrei;
end.


und die zugehörige unit:

ausblenden volle Höhe 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:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
unit uKugel;

interface
  uses mSuM;

type
meineKugel = class
  hatStift: Buntstift;
  kenntBS: Bildschirm;
  zGeschw: zahl;
  farbea,farbem: integer;
 constructor init (pXPos,pYPos,pRichtung,pGeschw: real; pFarbea,pFarbem: integer; pBS: bildschirm);
  procedure zeichne;
  procedure loesche;
  procedure bewege;
  procedure kol;
  destructor gibFrei;
end;



implementation

constructor meineKugel.init (pXPos,pYPos,pRichtung,pGeschw: real; pFarbea,pFarbem: integer; pBS: bildschirm);
  begin
  hatstift:= Buntstift.Init;
  farbea := pFarbea;
  farbem := pfarbem;
  hatstift.setzeFuellMuster(gefuellt);
  hatstift.hoch;
  hatstift.bewegeBis(pXPos,pYPos);
  hatstift.dreheBis(pRichtung);
  zGeschw := pGeschw;  
  kenntBS := pBS;
end;

procedure meineKugel.zeichne;
  begin
    hatstift.setzefarbe (farbea);
    hatstift.setzeFuellMuster (1);
    hatStift.zeichneKreis(30);
    hatstift.setzeFarbe (Farbem);
    hatstift.zeichneKreis(15);
  end;

procedure meinekugel.kol;  // kugel nach hinten abprallen lassen 
  begin
    hatstift.dreheum(180);
  end;

procedure meineKugel.loesche;
  begin
    hatStift.radiere;
    hatStift.zeichneKreis(31);
    hatStift.normal;
  end;

procedure meineKugel.bewege;
  begin
    self.loesche;
    hatStift.bewegeUm(zGeschw);
    self.zeichne;
    if (hatStift.hPosition<=31) or (hatStift.hPosition>=993)
      then hatStift.dreheUm(180-2*hatstift.Winkel)
      else if (hatStift.vPosition<=31) or (hatStift.vPosition>=700)
        then hatStift.dreheUm(-2*hatstift.winkel);
        if zGeschw >0 then
          zGeschw := zGeschw-0.00005;
  end;

destructor meineKugel.gibFrei;
  begin 
    hatStift.gibFrei;
  end;

end.


achja, ich hab zwar mit der suche einiges zum thema gefunden, aber nichts, was mir helfen könnte =/

ich hoffe ihr könnt mir helfen

gruß, lukas


Zuletzt bearbeitet von cir am Di 12.04.05 15:40, insgesamt 3-mal bearbeitet
Meillo
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 97

Debian GNU/Linux
PHP, Ruby(-Newbie)
BeitragVerfasst: Di 12.04.05 08:41 
.... hatte keine Lust deinen Code anzuschauen (zu bald morgens) :(

aber vermutlich musst du den Betrag der Kugel-X/Y-Abstände nehmen, sonst kann es passieren, dass unter der Wurzel was Negatives rauskommt...

_________________
Dass es in FORTRAN keine strukturierten IF-, REPEAT...UNTIL- oder CASE- Statements gibt, braucht einen richtigen Programmierer nicht zu sorgen.
Nebenbei, man kann sie nötigenfalls durch zugewiesene GOTOs simulieren.
PattyPur
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: Di 12.04.05 09:06 
Mein Vorschlag: als erstes Mach mal ein Paar Einrückungen in deinem Code dann schauen wir mal weiter.

_________________
Das Leben ist zum Spielen da,
alles andere ist Unsinn
cir Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 12.04.05 13:41 
user profile iconMeillo hat folgendes geschrieben:
.... hatte keine Lust deinen Code anzuschauen (zu bald morgens) :(

aber vermutlich musst du den Betrag der Kugel-X/Y-Abstände nehmen, sonst kann es passieren, dass unter der Wurzel was Negatives rauskommt...


es spielt doch keine rolle ob m2x-m1x bzw. m2y-m1y positiv oder negativ ist, weil es doch quadriert wird und somit immer positiv ist?

die formel müsste eigentlich funktionieren, mein lehrer findet da auch keinen fehler =/

jo, einrücken :D :P mach ich vllt nachher mal, keine zeit nu.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 12.04.05 13:45 
user profile iconcir hat folgendes geschrieben:
aber die kollision der kugeln untereinander krieg ich nicht hin,
Dann solltest Du zumindest sagen, was denn nicht klappt. Ist die Richtung hinterher falsch? Die Geschwindigkeit? Kommt eine Exception (wenn ja, wo und welche)?

Und Du solltest Deinen Code wirklich ganz dringend einrücken, ich habe z.B. keine Lust mich da durch zu quälen. :?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Meillo
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 97

Debian GNU/Linux
PHP, Ruby(-Newbie)
BeitragVerfasst: Di 12.04.05 14:19 
user profile iconcir hat folgendes geschrieben:
es spielt doch keine rolle ob m2x-m1x bzw. m2y-m1y positiv oder negativ ist, weil es doch quadriert wird und somit immer positiv ist?
... da hab ich wohl sqr() und sqrt() verwechselt :oops:
naja, war ja auch noch bald morgens ... da kann ich noch nicht klar denken ...

_________________
Dass es in FORTRAN keine strukturierten IF-, REPEAT...UNTIL- oder CASE- Statements gibt, braucht einen richtigen Programmierer nicht zu sorgen.
Nebenbei, man kann sie nötigenfalls durch zugewiesene GOTOs simulieren.
cir Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 12.04.05 15:28 
user profile iconChristian S. hat folgendes geschrieben:
user profile iconcir hat folgendes geschrieben:
aber die kollision der kugeln untereinander krieg ich nicht hin,
Dann solltest Du zumindest sagen, was denn nicht klappt. Ist die Richtung hinterher falsch? Die Geschwindigkeit? Kommt eine Exception (wenn ja, wo und welche)?

Und Du solltest Deinen Code wirklich ganz dringend einrücken, ich habe z.B. keine Lust mich da durch zu quälen. :?


das problem ist, die kugeln bewegen sich nich, die bleiben immer auf der selben stelle stehen. wenn man ganz genau hinschaut kann man erahnen, dass sich die kugeln immer hin und her bewegen, also immer die "kol" procedure aus der unit ausführen. das ist aber eigentlich nicht möglich =(
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 12.04.05 15:37 
ich habs schon hinbekommen, hab genau das auch mal in nem buch gelesen, an der formel liegts aber wahrscheinlich eher net, aber was passiert wenn die kugeln kollidieren (drehen sie sich um?), physikalisch und ohne reibung oder sonstige energieverluste gesehen, tauschen die kugeln ihre geschwindigkeiten.
reibung muss da dann natürlich auch noch rein, wird das billiard ? dann brauchst du noch ne unterscheidung der kugeln, aber das ist ja momentan unwichtig ^^

mach mal aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    IF (sqr(m2x - m1x) + sqr(m2y - m1y)) < 3600 then begin  
      kugel1.kol;  
      kugel2.kol;  
    end;

das hier:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    IF (sqr(m2x - m1x) + sqr(m2y - m1y)) > 3600 then begin  
      kugel1.kol;  
      kugel2.kol;  
    end;

und sag mir was passiert


bei mir sah das ungefähr so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    IF sqrt((sqr(m2x - m1x) + sqr(m2y - m1y))) <= radius1+radius2 then begin  
      bx:= kugel1.xspeed;
      by:= kugel1.yspeed;
      kugel1.xspeed:= kugel2.xspeed;
      kugel1.yspeed:= kugel2.yspeed;
      kugel2.xspeed:= bx;
      kugel2.yspeed:= by; 
    end;


wie bewegst du denn deine kugeln, ich hab das immer mit xspeed:= xspeed + 1 also x immer um 1 oder mehr erhöht :?


Zuletzt bearbeitet von F34r0fTh3D4rk am Di 12.04.05 16:02, insgesamt 2-mal bearbeitet
cir Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 12.04.05 15:46 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
ich habs schon hinbekommen, hab genau das auch mal in nem buch gelesen, an der formel liegts aber wahrscheinlich eher net, aber was passiert wenn die kugeln kollidieren (drehen sie sich um?), physikalisch und ohne reibung oder sonstige energieverluste gesehen, tauschen die kugeln ihre geschwindigkeiten.
reibung muss da dann natürlich auch noch rein, wird das billiard ? dann brauchst du noch ne unterscheidung der kugeln, aber das ist ja momentan unwichtig ^^

mach mal aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    IF (sqr(m2x - m1x) + sqr(m2y - m1y)) < 3600 then begin  
      kugel1.kol;  
      kugel2.kol;  
    end;

das hier:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    IF (sqr(m2x - m1x) + sqr(m2y - m1y)) > 3600 then begin  
      kugel1.kol;  
      kugel2.kol;  
    end;

und sag mir was passiert


exakten winkel und geschwindigkeitsaustausch nach dem impulserhaltungsgesetz bau ich noch ein, aber erstmal will ich die kollision an sich ans laufen kriegen.

deinen vorschlag hab ich schon längs ausprobiert, tut sich nichts, wär auch seltsam und noch unlogischer ^^




ich hab nochmal kommentare hinter die zeilen gesetzt um die es geht, wenn man diese zeilen raus lässt funzt das programm einwandfrei.
n bisschen eingerückt hab ich auch, obohl ich keine ahnung hat, welche "regeln" man dabei befolgt.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 12.04.05 15:51 
user profile iconcir hat folgendes geschrieben:

deinen vorschlag hab ich schon längs ausprobiert, tut sich nichts, wär auch seltsam und noch unlogischer ^^


nee, wenn es so immer der fall ist, dann ist es das gegenteil wenn die bedingung not ist :?

ich finde deine formel aber komisch, ich hab den pythagoras genommen, aber deiner ist etwas komisch, was ist denn 3600 ?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 12.04.05 15:56 
Ich habs mir nicht im Detail angesehen, aber du schreibst im Source die 3600 ist der Radius^2. Wenn ich das richtig sehe, ist der Radius aber nur 30. Könnte da dein Problem stecken?
cir Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 12.04.05 15:57 
nun, der satz des pythagoras besagt doch, dass im rechtwinkligen dreieck kathete1^2+kathete2^2=hypothenuse^2 ist.
die katheten sind m2y-m1x und m2y-m1y, die hypothenuse ist der doppelte radius, also 30+30=60, daher auch die 3600 (60^2)
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 12.04.05 16:01 
du hättest ja auch die wurzel ziehen und runden können ^^
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 12.04.05 16:08 
Rein rechnerisch korrekt. Sorry.
Hast du es schonmal debuggt? Läuft dein Programm überhaupt in den If-Block hinein? Falls nicht, suchst du das Problem vielleicht an der falschen Stelle.
Ich will jetzt auch nicht zuviel Blödsinn schreiben, da ich auf die schnelle deine Bewegungroutine auch noch nicht ganz nachvollzogen habe.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 12.04.05 16:21 
warum wird eigentlich das .ze von self.zeichne blau gehighlighted ?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 13.04.05 07:34 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
warum wird eigentlich das .ze von self.zeichne blau gehighlighted ?
Vermutlich ein Bug im Parser. Kannst du ja mal unter "Wünsche/Kritik/Anregungen" eintragen.