| Autor |
Beitrag |
cir
Hält's aus hier
Beiträge: 5
|
Verfasst: 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:
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; 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; m1y := mstift.vposition; Kugel2.bewege; m2x := mstift.hposition; m2y := mstift.vposition; IF (sqr(m2x - m1x) + sqr(m2y - m1y)) < 3600 then begin kugel1.kol; kugel2.kol; end; until mMaus.istGedrueckt;
Kugel2.gibFrei; Kugel1.gibfrei; mmaus.gibFrei; mstift.gibfrei; mBildschirm.gibFrei; end. |
und die zugehörige unit:
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; 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
      
Beiträge: 97
Debian GNU/Linux
PHP, Ruby(-Newbie)
|
Verfasst: 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
      
Beiträge: 80
Win98, WinXP
Delphi 7
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 12.04.05 13:41
Meillo 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  mach ich vllt nachher mal, keine zeit nu.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 12.04.05 13:45
cir 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
      
Beiträge: 97
Debian GNU/Linux
PHP, Ruby(-Newbie)
|
Verfasst: Di 12.04.05 14:19
cir 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
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 
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 12.04.05 15:28
|
|
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4:
| IF (sqr(m2x - m1x) + sqr(m2y - m1y)) < 3600 then begin kugel1.kol; kugel2.kol; end; |
das hier:
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:
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 
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 12.04.05 15:46
F34r0fTh3D4rk 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:
Delphi-Quelltext 1: 2: 3: 4:
| IF (sqr(m2x - m1x) + sqr(m2y - m1y)) < 3600 then begin kugel1.kol; kugel2.kol; end; |
das hier:
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
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Di 12.04.05 15:51
cir 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Di 12.04.05 16:01
du hättest ja auch die wurzel ziehen und runden können ^^
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Di 12.04.05 16:21
warum wird eigentlich das .ze von self.zeichne blau gehighlighted ?
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 13.04.05 07:34
F34r0fTh3D4rk 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.
|
|
|