Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - zwei kugeln , die sich treffen und voneinander abprallen
-Nala- - Mo 29.01.07 17:26
Titel: zwei kugeln , die sich treffen und voneinander abprallen
hey leute !
Ich hab (mal wieder) ne frage :D
also ...
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type TForm1 = class(TForm) ImReagenzglas: TImage; ImNa1: TImage; Timer1: TTimer; ImNa2: TImage; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private public end;
var Form1: TForm1; vv, vh, n, p:integer;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin ImNa1.canvas.ellipse(0,0,20,20); ImReagenzglas.canvas.ellipse(400,400,380,380); ImNa2.Canvas.ellipse(0,0,20,20); n:=7; p:=8; vv:=5; vh:=4; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin ImNa1.Top:=ImNa1.top+vv; ImNa1.left:=ImNa1.left+vh; ImNa2.top:=ImNa2.top+n; ImNa2.left:=ImNa2.left+p; if (ImNa1.top>400) then vv:=-vv; if (ImNa1.left>400) then vh:=-vh; if (ImNa1.top<20) then vv:=-vv; if (ImNa1.left<20) then vh:=-vh; if (ImNa2.left>400) then p:=-p; if (ImNa2.top>400) then n:=-n; if (ImNa2.left<20) then p:=-p; if (ImNa2.top<20) then n:=-n; end;
end. |
das hab ich programmiert und jetzt wollte ich fragen ob ihr wisst , wie man
das so programmiert, dass sich die beiden kugeln die ich eingefügt habe wenn sie sich berühren gegenseitig abstoßen .
könnt ihr mia helfen ????
THX
Moderiert von
Gausi: Delphi-Tags hinzugefügt
F34r0fTh3D4rk - Mo 29.01.07 17:31
wäre schön, wenn du den code formatieren und in [delphi][/delphi] tags packen könntest, danke
-Nala- - Mo 29.01.07 17:33
so ?
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type TForm1 = class(TForm) ImReagenzglas: TImage; ImNa1: TImage; Timer1: TTimer; ImNa2: TImage; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private public end;
var Form1: TForm1; vv, vh, n, p:integer;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin ImNa1.canvas.ellipse(0,0,20,20); ImReagenzglas.canvas.ellipse(400,400,380,380); ImNa2.Canvas.ellipse(0,0,20,20); n:=7; p:=8; vv:=5; vh:=4; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin ImNa1.Top:=ImNa1.top+vv; ImNa1.left:=ImNa1.left+vh; ImNa2.top:=ImNa2.top+n; ImNa2.left:=ImNa2.left+p; if (ImNa1.top>400) then vv:=-vv; if (ImNa1.left>400) then vh:=-vh; if (ImNa1.top<20) then vv:=-vv; if (ImNa1.left<20) then vh:=-vh; if (ImNa2.left>400) then p:=-p; if (ImNa2.top>400) then n:=-n; if (ImNa2.left<20) then p:=-p; if (ImNa2.top<20) then n:=-n; end;
end. |
perry5 - Mo 29.01.07 18:29
Das musst du mit Vektoren rechnen.
Du musst irgendwie die Verbindungslinie zwischen den Mittelpunkten berechnen und den jeweiligen Richtungsvekotr in 2 Teile aufteilen. Einmal den entlang dieser Verbindung und einmal den auf der verbindung. Jetzt müssen die beiden Kugeln ihre Komponenten trauschen, also die die nicht auf der Verbindungdslinie liegen.
Jetzt kannste damit die neuen Richtungsvektoren zusammenrechnen.
-Nala- - Mo 29.01.07 18:40
sry aber ich bin anfänger und ha´b delphi grad ne woche und ich ken nmich überhaupt nich aus mit vektoren und so weiter ... kannste mia nich einfach sagen was ich wo hinschreiben oder wo hin machen soll???
perry5 - Mo 29.01.07 18:45
nein?
sry, aber das was du bis jetzt hast ist totaler schmu.
Vektorrechnung ist nun einmal nicht gerade einfach. Außerdem haste ja z.b. noch nirgendwo irgendwas wie Radius oder mittelpunkt angegeben, sondern bloß n paar Variablen, mit denen du eine Ellipse zeichnest.
Wenn du ernsthaft ein paar rumfliegende Kugel simulieren willst, solltest du eine Kugelklasse machen, mit Mittelpunkt und Radius, die dann die entsprechende Ellipse zeichnet.
Die Kollisionsabfrag kriegt man damit schon sehr einfach hin, einfach die Radien mit den Abstand der Mittelpunkte vergleichen (mal dir ein paar sich schneidende und nciht schneidende Kreise auf, dann merkste ganz schnell, wie du kollision feststellen kannst).
Die Vektorrechnung für das abstoßen ist dann nochmal bissle schwerer, vor allen wenn du vor hast das auch zu verstehen. Und wenn dus nur abschreiben und nicht verstehen willst, ist programmieren nix für dich, weil du dir nicht alles durch zusammenfragen zurechtfuddeln kannst.
Lern erstmal bisschen weiter, mit klassen und so. Wenn du dann ein wenig weiter bist, kann ich dir bei der Physik helfen.
Bergmann89 - Mo 29.01.07 18:57
@ Nala: Welche Klasse bist du den, Vekorrechnung lernt man in der 11./12.!
perry5 - Mo 29.01.07 19:05
Genau, da siehste auch eine Animation wie das Komponenten tauschen funktioniert.
-Nala- - Di 30.01.07 18:38
ok dankeschön...
ich glaube ich versteh das ganze jeztz ein bisschen
unter was kann ich der kugel einen radius selber bestimmen ???#
EDIT:// ok... ich bin ein idiot den radius kann man an den koordinaten ablesen :D
sry ... aber wie kann ich den abstand zwischen den beiden kugelmittelpunkten als variabel bezeichnen ????
EDIT2:// und mit welchen vokabeln kann ich das formulieren???
und unter was ?????
perry5 - Mi 31.01.07 00:09
äh, wat? Du fragst ernsthaft nach wie du deine Varaiblen nennen sollst?
Hm, mal sehen. Die ENTFERNUNG zwischen 2 Mittelpunkten. Ah, ich habs: Entfernung? oder Distance, wenn dir Englisch mehr Spaß bereitet.
Bergmann89 - Mi 31.01.07 10:07
OK, aber ich glaub eher er will wissen wie er den berechen kann...
Wie wäre es das mit dem Staz des Pytagoras!
Delphi-Quelltext
1: 2:
| Abst := sqrt(delta_x²+delta_y²); |
MfG Bergmann.
€: Abst ist natürlich Real!
perry5 - Mi 31.01.07 16:16
Jop. Allerdings sei an dieser Stelle gesagt, dass man zum Vergleichen von Abständen auch deren Quadrat benutzen kann, sich also das realtiv langsame Wurzel ziehen sparen kann.
-Nala- - Mi 31.01.07 18:21
hi leute
ich hab heute meinen lehrer gefragt und der meinte man könnte es auch mit einem if ...then satz machen z.B
Delphi-Quelltext
1: 2: 3: 4: 5:
| if (ImNa1=ImNa2) then p:=-p; n:=-n; vv:=-vv; vh:=-vh; |
als ichs versucht habe sind ImNa1 und ImNa2 nur herum geeiert
als ich dann nochma meinen lehrer gefragt hab meinte der das
ich das so schreiben soll das nur wenn die koordinaten von ImNa1 und ImNa2 übereinstimmen das passiert aber ich hab bei hilfe nich die richtige vokabel gefunden
ich habs mit place oder position ausprobiert aber es hat nich funktioniert was muss ich schreiben????
also ich mein dieses wort:
if (
POSITION ImNa1=...... t´hen.....
Robinator - Mi 31.01.07 18:43
-Nala- hat folgendes geschrieben: |
hi leute
ich hab heute meinen lehrer gefragt und der meinte man könnte es auch mit einem if ...then satz machen z.B
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (ImNa1=ImNa2) then p:=-p; n:=-n; vv:=-vv; vh:=-vh; |
als ichs versucht habe sind ImNa1 und ImNa2 nur herum geeiert
als ich dann nochma meinen lehrer gefragt hab meinte der das
ich das so schreiben soll das nur wenn die koordinaten von ImNa1 und ImNa2 übereinstimmen das passiert aber ich hab bei hilfe nich die richtige vokabel gefunden
ich habs mit place oder position ausprobiert aber es hat nich funktioniert was muss ich schreiben????
also ich mein dieses wort:
if (POSITION ImNa1=...... t´hen..... |
Hi Nala.
Ich möchte dich an erster stelle einmal warnen. So wie ich deinen Kentnissstand einschätze, hast du dich mit der Aufgabe total übernommen. Du weist weder, wie du das physikalisch korrekt berechnest, geschweige denn wie du es programmiertechnisch umsetzen könntest. Wenn du das trotzdem umsetzen möchtest, kann ich dir
diesen [
http://www.delphi-library.de/viewtopic.php?sid=efec84f2f493ce8be1081f3d31ead44d&t=47305] thread von delphifan nahelegen.
Bitte denk nicht, ich möchte dirch fertigmachen oder ähnliches, es ist nur wenig ratsam sich für den Anfang gleich ein Projekt vorzunehmen, an dem selber erfahrene Programmierer zu knabbern hätten ;)
Grüsse, und (trotz allem) gutes gelingen!
Rob
//EDIT: Der gute Mann heisst natürlich delfiphan, sry :D
-Nala- - Mi 31.01.07 18:58
is ja nett das du mir sowass
sagst aba
unser lehrer hat mir die aufgabe gestellt und
meinte es geht leichter er hat es selbst schon mal geschafft ich habs
gesehnen
du hast nich auf meine frage geantwortet
kann man das auch mit nem if... then satz machen??
Robinator - Mi 31.01.07 19:05
-Nala- hat folgendes geschrieben: |
is ja nett das du mir sowass
sagst aba
unser lehrer hat mir die aufgabe gestellt und
meinte es geht leichter er hat es selbst schon mal geschafft ich habs
gesehnen
du hast nich auf meine frage geantwortet
kann man das auch mit nem if... then satz machen?? |
Ich würde ja auf deine Frage antworte, wenn sie denn irgendeinen sinn machen würde :(
guck dir halt den Thread mal an. An if ... then abfragen kommst du eigentlich in KEINEM programm vorbei.
gruss
JayEff - Mi 31.01.07 19:57
<OT>
Robinator hat folgendes geschrieben: |
An if ... then abfragen kommst du eigentlich in KEINEM programm vorbei.
|
showmessage('hello world');? ;)
</OT>
Nun, ich weiß nicht, ob du Robinators Antwort beleidigend aufgefasst hast, aber so wars sicher nicht gemeint ;)
Fakt ist, dir fehlen Kentnisse! Bist du dir ganz sicher, dass dein Lehrer den elastischen Stoß im Zweidimensionalen von dir verlangt? Wenn ich mir die (qualitativ sehr unaussagekräftige) Aussage deines Lehrers so ansehe (Eine If-Abfrage. jaaaah .. Siehe auch den letzten Post von Robinator), dann vermute ich, dass er etwas im stil von rechteckigen Objekten (bzw. Kreisen, die als Quadrate behandelt werden) erwartet, das würde das ganze nämlich einfacher machen und dir einen Großteil von Trigonometrie ersparen. Alle Trigonometrie sogar. Dann kämst du bei der Kollision 2er Objekte wahrscheinlich mit 2 If-Abfragen aus. Ist ziemlich simpel, dann, da musst du nur ein bisschen im Forum suchen um auf die Antwort zu kommen. Wenn dein Lehrer tatsächlich runde Objekte kollidieren lassen will, (kreise, im einfachsten, ovale/unförmige dinger im schlimmsten fall) wirds schwieriger. Dazu solltest du dir dann diverse Wikipedia Artikel zu Trigonometrie, Vektoren und natürlich dem elastischen Stoß anschauen.
Ich hoffe mal, das wird was! :)
Jakob_Ullmann - Mi 31.01.07 19:59
Entschuldigung, aber wenn ich über deine "Reform der neuen Rechtschreibung" lache, hast du sicher nichts dagegen, oder?
Und in deiner Rechtschreibung wahrscheinlich:
Tschuldschung, aba wenn ich üba deene refoam da neuen reschtschraibung lache, haste sicha nix dagegn, oda?
==> Nicht persönlich nehmen, dass war ja nicht ernst gemeint (Nur ein kleines bisschen).
JayEff - Mi 31.01.07 20:04
Jakob_Ullmann hat folgendes geschrieben: |
Entschuldigung, aber wenn ich über deine "Reform der neuen Rechtschreibung" lache, hast du sicher nichts dagegen, oder?
Und in deiner Rechtschreibung wahrscheinlich:
Tschuldschung, aba wenn ich üba deene refoam da neuen reschtschraibung lache, haste sicha nix dagegn, oda?
==> Nicht persönlich nehmen, dass war ja nicht ernst gemeint (Nur ein kleines bisschen). |
Und es war total Off-Topic. Drum hab ich in meiner Signatur seit einiger Zeit "Wer Rechtschreibfehler findet ..." ihr wisst schon ;) Des weiteren weis kein Mensch, wen du grade meinst, kann gut sein, dass ich mich irgendwo vertippt habe. Tut mir wirklich seeeehr leid :roll:
Um noch was zum Thema beizutragen: Hab den
DELPHI CRASHKURS noch nicht erwähnt oder?
perry5 - Do 01.02.07 17:53
1. Deine Variablen habne mal echt beschissene und extrem unaussagekräftige Namen. ein wenig mehr als vv oder p kann es shcon sein, oder? Wenigstens so: XPosKreis1 oder YSizeKreis2
2. Was meinst du andauernd mit Vokabeln???
3. Was genau sollst du jetzt machen? Will dein Lehrer, dass ihr 2 Rechtecke sich abstoßen lasst, die zufälligerweise aussehen wie Kreise?
So, Rechteckkollisions ist ein wenig schwerer als Kreiskollisiosn, aber so schwer nun auch nicht. Du musst einfach von jedem Punkt des ersten Rechtecks prüfen ob er im zweiten leigt und von jedem Punkt des zweiten ob er im ersten liegt. Wie genau die Bedingungen sind, findest du heraus, wenn du ein Blatt Papeir nimsmt und verschiedene Möglichkeiten aufzeichnest. Das sollte zu schaffen sein, sowas muss man als Programmierer tagtäglich machen, sich zu überlegen, wie man eine bestimmte Bedingung umsetzen und testen kann. Wenn man soetwas nur abschreibt lernt mans nie.Wenn du das also nicht schaffst, sagt deinem Lehrer du hättest die Hausaufgabe nicht gekonnt, und er soll das nochmal gescheit erklären.
Das du die tatsächliche Physikalisch korrekte Kollision von 2 Kugeln berechnen sollst halte ich jetzt mal für ausgeschlossen, das wäre viel zu kompliziert.
JayEff - Do 01.02.07 18:52
perry5 hat folgendes geschrieben: |
So, Rechteckkollisions ist ein wenig schwerer als Kreiskollisiosn |
Blödfug. Bei rechteckkollision reicht eine überprüfung der x und y Achse auf überschneidung, bei kreiskollision musst du mit trigonometrie arbeiten. Bei der Rechteckkollision kommst du sogar um ein mathematisches Vorwissen über Vektoren rum, wenn du dir die ganze sache gut vorstellen kannst. Du kannst, wie schon gesagt, bei 2 Rechtecken die Kollision durch genau 2 If-Abfragen ausdrücken, in denen nicht mehr Berechnung als + und - vorkommt.
Hier [
http://www.delphi-forum.de/viewtopic.php?t=68479] findest du alles, was du wissen musst, was die Kollision 2er Rechtecke betrifft.
Den Link solltest du dir auch anschauen, wenn es um 'echte' Kugeln geht, da er auch Grundlagen für die Kugelkollision enthält.
Jakob_Ullmann - Do 01.02.07 18:58
Eigentlich habe ich Nala gemeint.
Ich konnte nur nicht ahnen, dass du, bevor ich fertig war, einen Beitrag schreibst.
An deiner Rechtschreibung habe ich wirklich nichts zu bemengeln.
Tut mir ebenfalls sehr leid.
-Nala- - Fr 02.02.07 17:23
hey leute!
also ich glaub dieser ganze thread ist ein missverständnis!!
ich habe wohl ziemlich für Verrwirrung gesorgt:D
also das ganze bezieht sich auf quadratische imgs.
das heißt:
ich habe ein quadratisches img erstellt und dann einen kreis dort hinein gezeichnet .
diese quadratischen imgs möchte ich nun von einander abprallen lassen wenn sie sich treffen .
dazu schonmal Sorry !
also nochmal neu
könnt ihr mir sagen ob und wenn ja wie man zwei quadratische img von einander abprallen lassen kann wenn sie sich treffen.
THX
JayEff - Fr 02.02.07 17:35
*wiederhol*
Jakob_Ullmann hat folgendes geschrieben: |
Eigentlich habe ich Nala gemeint.
Ich konnte nur nicht ahnen, dass du, bevor ich fertig war, einen Beitrag schreibst.
An deiner Rechtschreibung habe ich wirklich nichts zu bemengeln.
Tut mir ebenfalls sehr leid. |
Wollte damit nur sagen, dass Rechschreibung völlig egal ist, es versteht ja jeder, und das is das Delphi-Forum, nicht zu verwechseln mit dem Duden-Forum ;)
Bei der Gelegenheit: Bemängeln kommt von "Mangel" und schreibt sich mit einem ä ;)
Man bin ich böse!
-Nala- - So 04.02.07 15:03
hey leute!
danke für eure hilfe !!
also ich hab den folgenden quelltext eingegeben und das abstoßen hat funktioniert !
allerdings funktioniert das abprallen nur an den oberen und unteren seiten rechts und links hat es nicht funktioniert könnt ihr mir helfen??
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: 77:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) ImReagenzglas: TImage; ImNa1: TImage; Timer1: TTimer; ImNa2: TImage; Schnell: TButton; Langsam: TButton; Stopp: TButton; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure SchnellClick(Sender: TObject); procedure LangsamClick(Sender: TObject); procedure StoppClick(Sender: TObject); private public end;
var Form1: TForm1; vv, vh, n, p:integer;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin ImNa1.canvas.ellipse(0,0,20,20); ImReagenzglas.canvas.ellipse(400,400,380,380); ImNa2.Canvas.ellipse(0,0,20,20); n:=7; p:=8; vv:=5; vh:=4; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin ImNa1.Top:=ImNa1.top+vv; ImNa1.left:=ImNa1.left+vh; ImNa2.top:=ImNa2.top+n; ImNa2.left:=ImNa2.left+p; if (ImNa1.top>200) then vv:=-vv; if (ImNa1.left>200) then vh:=-vh; if (ImNa1.top<20) then vv:=-vv; if (ImNa1.left<20) then vh:=-vh; if (ImNa2.left>200) then p:=-p; if (ImNa2.top>200) then n:=-n; if (ImNa2.left<20) then p:=-p; if (ImNa2.top<20) then n:=-n; if ((ImNa1.Top+ImNa1.Height > ImNa2.Top) and (ImNa1.Top<ImNa2.top+ImNa2.Height)) and ((ImNa1.Left < ImNa2.Left+ImNa2.Width) and (ImNa1.Left+ImNa1.Width > ImNa2.Left)) then begin vv:=-vv; vh:=-vh; end; end; |
EDIT//: der fehler is irgendwo beim lezten if satz ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!