Autor Beitrag
Danny W.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 296

Windows XP, WIN 2000
Delphi 2005 PE
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Do 14.12.06 14:40 
Wie wäre es mit der Berechnung des Abstandes?
ausblenden Quelltext
1:
d²=(K1.top-k2.top)²+(K1.left-K2.left)²					


dann der Vergleich:

ausblenden Quelltext
1:
2:
if d=K1.radius+K2.Radius then Kontakt;
if d<K1.radius+K2.Radius then Kollision;
Danny W. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 296

Windows XP, WIN 2000
Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: Do 14.12.06 16:54 
Also die normaleFormel für den Abstand 2er Punkte ist
ausblenden Quelltext
1:
d² = (y2-y1)²+ (x2-x1)²					



Du musst also für x1/x2 y1/y2 die Werte von Kreis1 und Kreis2 eintragen. Wobei
ausblenden 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

ausblenden Quelltext
1:
Wenn d  <= (Kreis1.width div 2) + (Krei2.width div 2) Dann Kollision					


Hoffe das hilft
Danny W. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 296

Windows XP, WIN 2000
Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: Fr 15.12.06 00:54 
user profile iconMantis1987 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:
user defined image

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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Fr 15.12.06 09:26 
@user profile iconDragonclaw
Hast Recht, habe kurz vergessen die Mittelpunkte zu nehmen/berechnen.

@user profile iconMantis1987 falls Du immer noch nicht durchsteigst frage eine(n) Mathe oder PhysiklehrerIn.
Danny W. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 296

Windows XP, WIN 2000
Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 296

Windows XP, WIN 2000
Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Fr 15.12.06 13:26 
user profile iconMantis1987 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Fr 15.12.06 13:28 
Den Abstand der Punkte hast du hier:

user profile iconDragonclaw hat folgendes geschrieben:
Also die normaleFormel für den Abstand 2er Punkte ist
ausblenden Quelltext
1:
d² = (y2-y1)²+ (x2-x1)²					


Die Mittelpunkte hier:

user profile iconDragonclaw hat folgendes geschrieben:
Du musst also für x1/x2 y1/y2 die Werte von Kreis1 und Kreis2 eintragen. Wobei
ausblenden 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)


Und was du vergleichen musst, steht hier:

user profile iconDragonclaw hat folgendes geschrieben:
Dann noch die Abfragen

ausblenden Quelltext
1:
Wenn d  <= (Kreis1.width div 2) + (Krei2.width div 2) Dann Kollision					



user profile iconDragonclaw hat als vor einiger Zeit schon alles notwendige für dich gepostet!

_________________
Anonymes Eckenkind
Danny W. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 296

Windows XP, WIN 2000
Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 296

Windows XP, WIN 2000
Delphi 2005 PE
BeitragVerfasst: 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...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Fr 15.12.06 14:00 
Okay, okay... also:

user profile iconMantis1987 hat folgendes geschrieben:

if (d <= (x1+x2)) or (d <= (y1+y2)) then aus;
[/delphi]


Wo sind da die Radien?!

Probier mal:
ausblenden Delphi-Quelltext
1:
if (d <= (kreis1.width div 2) + (kreis2.width div 2)) then aus;					

_________________
Anonymes Eckenkind
Danny W. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 296

Windows XP, WIN 2000
Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Fr 15.12.06 14:05 
definiere das "drüber bewegen" mal etwas genauer...

_________________
Anonymes Eckenkind
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Fr 15.12.06 14:08 
user profile iconMantis1987 hat folgendes geschrieben:
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...

ausblenden 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


Schon mal die Formel angesehen? Dort steht d² und hier steht der Rest

user profile iconwulfskin hat folgendes geschrieben:
...

Edit: Damit es jetzt wirklich klappt...a = sqrt(sqr(x1-x2)+sqr(y1-y2));.

Gruß Hape!

Vielleicht noch mal in Delphi zum Mitmeiseln :wink: :
ausblenden Delphi-Quelltext
1:
 d :=  Sqrt(Sqr(x1-x2)+Sqr(y1-y2));					
!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!