| Autor |
Beitrag |
Danny W.
      
Beiträge: 296
Windows XP, WIN 2000
Delphi 2005 PE
|
Verfasst: Do 14.12.06 14:14
Hallo, ich möchte das mein 25x25 pt Kreis mit einem anderen identischen Kreis kollidieren kann.
Ich habe hier im Forum mal was gelesen und zitiere eben:
| Zitat: | | Bei Kreisen reicht es aus abzufragen ob die Entfernung der Mittelpunkte kleiner/gleich der Summe der beiden Radien ist. |
Leider weiß ich nicht wie ich das realisieren soll.
Bis jetzt sieht das bei mir so aus:
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (kreis.Top=player.Top) and (kreis.Left=player.left+24) or (kreis.Top=player.Top) and (kreis.Left=player.left-24) or (kreis.Top=player.Top+24) and (kreis.Left=player.left) or (kreis.Top=player.Top-24) and (kreis.Left=player.left) then Aus; |
nur dann kollidert das "nicht richtig" bzw. garnicht ^^
wie gehe ich hier am besten vor?
_________________ "Ich find den Fehler nicht. Der Artist wird immer als "Syntax Error" gezeigt  "
"Ach verdammt, der Artist heißt wirklich "Syntax Error" xD"
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: Do 14.12.06 14:40
|
|
Danny W. 
      
Beiträge: 296
Windows XP, WIN 2000
Delphi 2005 PE
|
Verfasst: Do 14.12.06 15:00
da steig ich net durch 
_________________ "Ich find den Fehler nicht. Der Artist wird immer als "Syntax Error" gezeigt  "
"Ach verdammt, der Artist heißt wirklich "Syntax Error" xD"
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 14.12.06 16:24
Hallo!
Berechne einfach die Abstände der Kreismittelpunkte voneinander. Ist der Abstand kleiner als die Summe der beiden Kreisradien, so überschneiden sie sich. Das ist es, was Tilo aufzeigen wollte.
Cu,
Udontknow
|
|
Dragonclaw
      
Beiträge: 196
Windows Vista
Delphi 7 Prof.
|
Verfasst: Do 14.12.06 16:54
Also die normaleFormel für den Abstand 2er Punkte ist
Quelltext 1:
| d² = (y2-y1)²+ (x2-x1)² |
Du musst also für x1/x2 y1/y2 die Werte von Kreis1 und Kreis2 eintragen. Wobei
Quelltext 1: 2: 3: 4: 5:
| x1 = Kreis1.left - (Kreis1.width div 2) y1 = Kreis1.top - (Kreis1.heigth div 2)
x2 = KReis2.left - (Kreis2.width div 2) y2 = Kreis2.top - (Kreis2.heigth div 2) |
Dann noch die Abfragen
Quelltext 1:
| Wenn d <= (Kreis1.width div 2) + (Krei2.width div 2) Dann Kollision |
Hoffe das hilft
|
|
Danny W. 
      
Beiträge: 296
Windows XP, WIN 2000
Delphi 2005 PE
|
Verfasst: Do 14.12.06 23:25
| Zitat: | | d² = (y2-y1)²+ (x2-x1)² |
Damit kann ich ehrlich gesagt nichts anfangen :/
_________________ "Ich find den Fehler nicht. Der Artist wird immer als "Syntax Error" gezeigt  "
"Ach verdammt, der Artist heißt wirklich "Syntax Error" xD"
|
|
Dragonclaw
      
Beiträge: 196
Windows Vista
Delphi 7 Prof.
|
Verfasst: Fr 15.12.06 00:54
Mantis1987 hat folgendes geschrieben: | | Zitat: | | d² = (y2-y1)²+ (x2-x1)² |
Damit kann ich ehrlich gesagt nichts anfangen :/ |
Das basiert auf dem Satz des Pytagoras.
Hier mal ein Beispiel:
Hoffe das ist soweit klar.
a errechnest du aus dem x-Wert von P(3/3) - x-Wert von P(1/1).
b errechnest du aus dem y-Wert von P(3/3) - y-Wert von P(1/1).
Dann einfach einsetzen... fertig.
Um das jetzt auf die Kreise zu übertragen müsst du einfach für x und y die Mittelpunktkoordinaten von Kreis1 und Kreis2 einsetzen.
Also die x/y Position vom Rand nehmen (das ist das left und top) und die Hälfte der Höhe/Breit (in diesem Fall den Radius) dazurechnen. Dann wie oben a und b berechnen, die Koords hast du ja jetzt und dann wieder in die Formel für d einsetzen.
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: Fr 15.12.06 09:26
@ Dragonclaw
Hast Recht, habe kurz vergessen die Mittelpunkte zu nehmen/berechnen.
@ Mantis1987 falls Du immer noch nicht durchsteigst frage eine(n) Mathe oder PhysiklehrerIn.
|
|
Danny W. 
      
Beiträge: 296
Windows XP, WIN 2000
Delphi 2005 PE
|
Verfasst: Fr 15.12.06 12:34
habe leider nich die möglichkeit einen mathe bzw. physiklehrer zu fragen. Übrigens.. ich hab das im theoretischen ja schon verstanden. Weiß bloß nicht wie ich das programmtechnisch umsetzen soll.
auf den mittelpunkt komm ich ja, wenn ich die width halbiere und zum left addiere, gleiches gilt für top...aber wie ich den Umriss erechne rall ich net...ich kann ja ohne probleme links rechts oben und unten ausrechnen..aber ich brauch halt die komplette kontur
_________________ "Ich find den Fehler nicht. Der Artist wird immer als "Syntax Error" gezeigt  "
"Ach verdammt, der Artist heißt wirklich "Syntax Error" xD"
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: Fr 15.12.06 13:11
Den Umriss benötigst Du bei Kreisen nicht. Da reicht es den Anstand der Mittelpunkte zu berechnen und ihn mit der Summe der Kreisradien zu vergleichen.
Den Umriss bracuhst Du nur beim Zeichnen, dazu gibt es aber entsprechende fertige Anweisungen.
|
|
Danny W. 
      
Beiträge: 296
Windows XP, WIN 2000
Delphi 2005 PE
|
Verfasst: Fr 15.12.06 13:15
Ok, soweit habe ich es. Wie kann ich denn jetzt noch Abstand der Mittelpunkte berechen?
_________________ "Ich find den Fehler nicht. Der Artist wird immer als "Syntax Error" gezeigt  "
"Ach verdammt, der Artist heißt wirklich "Syntax Error" xD"
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Fr 15.12.06 13:26
Mantis1987 hat folgendes geschrieben: | | ok, das verstehe ich. Wie stelle ich denn aber dann die kollision an? Ich muss ja mit irgendwas vergleichen. Und wie kann ich den Abstand der Mittelpunkte berechen? |
Du hast doch die beiden Koordinaten von beiden Kreismittelpunkten. Jetzt wendest du den Satz des Phytagoras an, wie schon _sehr_ ausführlich von Tilo und Dragonclaw erläutert. Damit hast du also den Abstand. Jetzt addierst du noch die beiden Radian und schon kannst du überprüfen, ob eine Kollision stattgefunden hat.
Wo du das abprüfst, solltest du schon selber wissen. Irgendwo bewegst du ja die Kreise.
Das sollte für einen neunzehnjährigen nicht so schwierig sein!
Edit: Damit es jetzt wirklich klappt... a = sqrt(sqr(x1-x2)+sqr(y1-y2));.
Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Fr 15.12.06 13:28
_________________ Anonymes Eckenkind
|
|
Danny W. 
      
Beiträge: 296
Windows XP, WIN 2000
Delphi 2005 PE
|
Verfasst: Fr 15.12.06 13:43
Ich versteh das doch... das einzige womit ich "programmtechnisch" nichts anfangen kann ist d² = (y2-y1)²+(x2-x1)² Ich mach einfach die Varible d und weise ihr dann (y2-y1)+(x2-x1) zu. Wenn ich den Radius 1 und 2 addiere und mit d vergleiche kommt keine kollision zustande...
_________________ "Ich find den Fehler nicht. Der Artist wird immer als "Syntax Error" gezeigt  "
"Ach verdammt, der Artist heißt wirklich "Syntax Error" xD"
|
|
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Fr 15.12.06 13:46
wenn der abstand kleiner ist, als die beiden radien groß sind, dann überschneiden sich deine kreise hundertprozentig... und wenn die sich überschneiden heißt das, dass die wohl kollidiert sein müssen (und zwar genau in dem moment, wo beide werte exakt gleich waren)... oder nicht?!
_________________ Anonymes Eckenkind
|
|
Danny W. 
      
Beiträge: 296
Windows XP, WIN 2000
Delphi 2005 PE
|
Verfasst: Fr 15.12.06 13:50
| Zitat: | | wenn der abstand kleiner ist, als die beiden radien groß sind, dann überschneiden sich deine kreise hundertprozentig |
Das ist doch garnicht mein Problem.. in der Theorie versteh ich es doch...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| x1 := Kreis.left - (Kreis.width div 2); y1 := Kreis.top - (Kreis.height div 2); x2 := player.left - (player.width div 2); y2 := player.top - (player.height div 2);
d := (y2-y1)+(x2-x1);
if (d <= (x1+x2)) or (d <= (y1+y2)) then aus; |
Bei mir kollidiert er zwischendurch, aber nicht dann wenn er soll
_________________ "Ich find den Fehler nicht. Der Artist wird immer als "Syntax Error" gezeigt  "
"Ach verdammt, der Artist heißt wirklich "Syntax Error" xD"
|
|
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Fr 15.12.06 14:00
Okay, okay... also:
Mantis1987 hat folgendes geschrieben: |
if (d <= (x1+x2)) or (d <= (y1+y2)) then aus;
[/delphi]
|
Wo sind da die Radien?!
Probier mal:
Delphi-Quelltext 1:
| if (d <= (kreis1.width div 2) + (kreis2.width div 2)) then aus; |
_________________ Anonymes Eckenkind
|
|
Danny W. 
      
Beiträge: 296
Windows XP, WIN 2000
Delphi 2005 PE
|
Verfasst: Fr 15.12.06 14:04
jetzt kollidierts, allerdings kollidiert es auch wenn ich mich mit kreis 1 über kreis 2 bewege
_________________ "Ich find den Fehler nicht. Der Artist wird immer als "Syntax Error" gezeigt  "
"Ach verdammt, der Artist heißt wirklich "Syntax Error" xD"
|
|
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Fr 15.12.06 14:05
definiere das "drüber bewegen" mal etwas genauer...
_________________ Anonymes Eckenkind
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Fr 15.12.06 14:08
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|