Autor Beitrag
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 16.06.03 19:31 
Hallo,
ich will prüfen ob ein drieck mit einem kreiß zusammengestoßen ist oder nicht.
ich weiß von beiden objekten nur die x und y position und die größe also breite und höhe.

wer weiß wie ich das am besten bereichnen könnte ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Elayla
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Mo 16.06.03 19:49 
Beim Kreis isses easy.
Du kennst ja Left und Top, daraus kannst du den Mittelpunkt berechnen und vom Mittelpunkt den Radius abzuchecken müsstest du schaffen :)
Beim Dreieck isses kompliziert, mal schauen ob ich ne Möglichkeit finde ...
Am einfachsten isses beim Gleichseitigen...
Du kennst die Höhe und die Breite, also ist der Mittelpunkt 0.5h und 0.5b, klar oder? :)
Die Eckpunkte sind also 0.5b vom Mittelpunkt weg, wenn man von x ausgeht, nicht von y von der Mitte; die Spitze (oben) ist demnach 0.5h vom Mittelpunkt entfernt.
Daraus folgt das die Mitte von jeder Seite 0.25x vom Mittelpunkt weg ist, bzw die Mitte der unteren Seite 0.5h.

Die Berechnung müsste so relativ "einfach" sein, hier nochmal ne Darstellung:
user defined image

Schlimmer wirds bei nem nicht-gleichseitigen Dreieck :?

_________________
Das wahre Ziel des Krieges ist der Frieden.
Sun Tzu
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 16.06.03 19:57 
naja, ich bräuchte eine funktion die in beiden fällen funktioniert, könntes du mir ein beispiel geben wie ich sowas in delphi anstelle ?
weil ich habe nicht so viel mahte wissen.

meine idee wäre folgende gewesen:
ich berechne die fläche vom dreiec und addiere sie zu den x,y positionen hinzu, würde das gehen ? wenn ja, wie geht das ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Elayla
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Mo 16.06.03 20:12 
Oje ich bin selber ne Mathe-Niete :oops:
Also das mit der Fläche wird glaub ich nix...
Oje ne Funktion ...
Hmm wenn due die linke untere Ecke von nem Dreieck nimmst und davon ausgehst das es ein Gleichseitiges(Gleichwinkliges) ist, also alle Winkel 60° haben kannste ne Funktion errechnen die das Dreieck von unten links zur oberen Spitze zeichnet, die Funktion ist etwa y=1.732x
(m = Anstieg = tan(alpha))
Damit hast du die linke Seite...
Ich würde das so kontrollieren (ka obs so geht):

For i:=1 To Dreieck.Width/2 Do
Begin
If (Mittelpunkt.Kreis + Kreis.Width/2) = (1.732 * i) Then
-->bewege Kreis vom Dreieck weg<--
End;

Das geht so garantiert nicht gut, aber ich hab davon kaum Ahnung, sry :wink:

Die rechte Seite ... hmm
Die berechnet sich mit
y= 1/1.732 * x (glaub ich)

Für die rechte Seite wär es dann so:

For i:=1 To Dreieck.Width/2 Do
Begin
If (Mittelpunkt.Kreis + Kreis.Width/2) = (1/1.732 * i) Then
-->bewege Kreis vom Dreieck weg<--
End;

Naja und die untere Kante ist einfach so:

If (Mittelpunkt.Kreis + Kreis.Width/2) = (Dreieck.Top+Dreieck.Height)
AND (Mittelpunkt.Kreis + Kreis.Width/2) >= (Dreieck.Left)
AND (Mittelpunkt.Kreis + Kreis.Width/2) <= (Dreieck.Left+Dreieck.Width)
Then
-->bewege Kreis vom Dreieck weg<--

Hoffe das dient zumindestens als Anhaltspunkt, hab jetzt keinen Nerv das zu testen :wink:
Aber als Denkansporn müsste es hoffentlich reichen :)

_________________
Das wahre Ziel des Krieges ist der Frieden.
Sun Tzu
geronimo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29



BeitragVerfasst: Mo 16.06.03 20:21 
da hätte ich vorher noch ne frage:
hast du ein rechtwinkliges dreieck? oder ein x-beliebiges?
ist es noch irgendwie gedreht? - sprich die untere seite ist nicht waagerecht
und kann der kreis auch schräg kommen? sprich von links oben/rechts oben? dann kannste das ganze nämlich nit einfach über den radius ausrechnen. das geht nur, wenn der kreis entweder oben, links, unten oder rechts berührt. (sprich genau 12,9,6,3 uhr).

wenn ich das weiss kann ich dir die trigon. funktionen dazu aufstellen.
geronimo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29



BeitragVerfasst: Mo 16.06.03 21:03 
Elayla ich glaube du machst das zu allgemein. in deiner rechnung wird davon ausgegangen, dass er kreis ein quadrat ist :wink: - es sei denn du näherst dich mit der 3-uhr spitze dem linken punkt des dreiecks.

deshalb müssen wir die koordinaten des punktes auf dem kreis ausrechnen, der die dreiecksseite berührt. sprich: wir rechnen das über sinus und cosinus und dem winkel des punktes P aus.

hier noch ein bild dazu (ja es ist Paint :D ):
user defined image

alpha_dreieck=60°

der radius des kreises an P ist eine senkrechte zur dreiecksseite. d.h.:

alpha_2 = 90 + 60 = 150°

damit wären wir im einheitskreis ca auf 10-11 uhr. was aber nicht stimmt.
wir brauchen die andere seite. also 180° drauf.

alpha_kreis = 150° + 180° = 330°

dann rechnen wir ( !: einheitskreis geht von 0-1 deshalb *(kreis_radius/2) - und klammern beachten!):

P.x := kreis_mitte.x + (cos(330°)*(kreis_radius/2));
P.y := kreis_mitte.y + (sin(330°)*(kreis_radius/2));

P ist der punkt, der die linke seite des dreiecks (seite b) berührt.
den punkt am dreieck selbst musst du mit Elaylas rechnung ausrechnen:

lauf_v ist meine schleifenvariable

P2.x := dreieck_pA.x + lauf_v;
P2.y := dreieck_pA.y - (1.732 * lauf_v);

die ifs kannst du glaub ich auch allein. ich hoff das war ne erste hilfe. allgemein musst du glaube ich nur den winkel des kreises neu berechnen. in der rechnung dafür ändert sich nur das alpha_dreieck.

mfg geronimo


Zuletzt bearbeitet von geronimo am Mo 16.06.03 21:14, insgesamt 1-mal bearbeitet
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 16.06.03 21:12 
also:
die objekte sehen immer nur in einer richtung. aber es wäre toll wenn es ne funktion geben würde wo man einfach nur sagt: x,y,höhe, breite mehr nicht. weil den mittelpunkt habe ich auch nicht vom Kreiß.
wie kann ich den errechnen?
also mometan ist das dreiec würde ich mal sagen ein gleichwinkels und der kreiß ein ganz normaler kreiß.:)

_________________
MFG
Michael Springwald, "kann kein englisch...."
geronimo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29



BeitragVerfasst: Mo 16.06.03 21:19 
kommt drauf an, womit du den kreis zeichnest. sind deine x/y koordinaten links unten oder links oben? - ich denke dabei an den canvas.ellipse befehl.

allgemein ist der mittelpunkt die x koordinate + (breite/2).
bei der y koordinate hängt es von obiger frage ab. je nachdem musst du dann y + halbe breite oder y - halbe breite machen. damit haste dann den mittelpunkt des kreisen. halbe breite steht hierbei natürlich für radius
Elayla
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Mo 16.06.03 21:33 
Geronimo: Ja ich bin erstmal allgemein rangegangen um es Mimi bissl deutlich zu machen :)
Kreise und Kollision sind sowieso ne Klasse für sich ^^

_________________
Das wahre Ziel des Krieges ist der Frieden.
Sun Tzu
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 16.06.03 21:34 
also ich nutze ne bmp und lade die mit delphiX.
wie sieht denn jetzt die funktion aus die ich brauche ?


ausblenden Delphi-Quelltext
1:
2:
3:
4:
funktion Getcolision(x1,y1,x1,x2,h1,w1,h2,w2:Integer):
begin
.... was muss da hin ?
end;

_________________
MFG
Michael Springwald, "kann kein englisch...."
geronimo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29



BeitragVerfasst: Mo 16.06.03 21:35 
ja schon klar :D
aber jetzt sieht mimi mal, auf was ich in meinem Spiel-Engines Thread eigentlich rauswollte :wink:

[e]
gnarr. bringt das nicht auch die docollision funktion von delphiX? :D
ich schreibe sie dir morgen mal auf. habe heute abend nimmer so viel zeit und kopf dazu.
umpani
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: Di 17.06.03 06:55 
Es gibt auch noch eine ganz andere Methode. Voraussetzung ist jedoch, dass du zwei Bitmaps (oder ähnliches) hast die Du bewegst.

Ich denke ich habe es so verstanden, das in jedem dieser Bitmaps ein Kreis oder ein Quadrat gezeichnet ist. Der Rest der Bitmap besteht aus einer transparenten Farbe.

Jetzt könntest du schauen, wo sich die Bitmaps auf dem Bildschirm befinden, und wenn vorhanden auch ihre überlappungen bestimmen.

Wenn Du den Überlappungsbereich bestimmt hast, sagen wir mal:

bei Bitmap 1:

von (x-coord) 100 bis 110 Pixel
von (y-coord) 0 bis 15 Pixel

Bei Bitmap 2
von (x-coord) 0 bis 10 Pixel
von (y-coord) 90 bis 105 Pixel

(Bitmap1 110*100, Bitmap2 50*105)

dann vergleichst du nur in diesem Überlappungsbereich die Pixelfarben, die relativ gesehen jeweils an der selben Stellle sitzen.

Wen z.B. die farbe der Pixel (bei Bitmap1 Pixel(100,0) und Bei Bitmap2 Pixel(0,105)) beide transparent sind dann gibt es keine Kollision. Wenn nur einer von beiden transparent ist dann gibt es auch keine Kollision. Aber wenn beide mit einer anderen Farbe gefüllt sind. Dann ist eine Kollision gegeben.

Mit dieser Methode ist auch die Möglichkeit gegeben, kompliziertere Objekte als "nur" ein Kreis und ein Dreieck zu bewegen, gegeben.

_________________
Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Di 17.06.03 15:17 
könntes du bitte ein beispiel erstellen, wie du das meinst ?
delphiX hat eine einge collisions abfrage, doch habe ich es mit der auch nicht geschaft in meinen versuchen.

also:
ich habe eine zeichen oberfläche und jetzt lade ich aus 2 verschieden BMP dateien die bilder und zeichne sie.ich weiß nur die höhe und die breite und die x und y Position der objekte mehr nicht.

_________________
MFG
Michael Springwald, "kann kein englisch...."
umpani
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: Di 17.06.03 18:35 
gerne, aber nicht diese Woche.

Ich schaffe es leider auch nicht so schnell mit dem Pseudo 3D - Spiel.

_________________
Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Di 17.06.03 18:58 
Zitat:

Ich schaffe es leider auch nicht so schnell mit dem Pseudo 3D - Spiel

verstehe ich nicht so ganz, aber wenn du mir nächste woche ein beispiel für die collisions erkennung von unterschiedlich großen objekten geben kannst, wäre das auch tolll :)

_________________
MFG
Michael Springwald, "kann kein englisch...."
Elayla
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Di 17.06.03 19:01 
Hmm die Idee mit dem Farbvergleich ist gut, so könnte man die Sache geschickt umgehen irgendwelche Koordinaten zu verwenden.
Einfach abfragen ob die Farbe von Bild1 und die Farbe von Bild2 nicht transparent sind wenn sie zusammentreffen.
Muss ich nachher mal ausprobieren auf die Art :)

_________________
Das wahre Ziel des Krieges ist der Frieden.
Sun Tzu
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Di 17.06.03 19:10 
farb vergleiche sind aber doof. das wäre eine ungenau collisions abfrage :(

_________________
MFG
Michael Springwald, "kann kein englisch...."
Elayla
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Di 17.06.03 19:13 
Das stimmt schon, besonders Reflektion lässt sich damit gar nicht machen, aber die Idee an sich kann man ja mal testen :)

_________________
Das wahre Ziel des Krieges ist der Frieden.
Sun Tzu
umpani
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: Di 17.06.03 19:45 
Ich muss euch da aber wiedersprechen. Farbvergleiche mögen ja etwas langsamer sein, aber sie sind viel genauer als wenn man nur die Körpergeometrie berechnet.

Aber gerade bei sehr "zerklüfteten" objekten ist eine genaue Kollisionsabfrage via Geometrie, so wie ihr das geplant habt nicht mehr möglich.

_________________
Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
Elayla
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Di 17.06.03 19:56 
Stimmt schon, man muss halt Vor- und Nachteile abwägen.
Je nachdem was man mit der Kollisionsabfrage machen möchte.
Wenn Objekte als "Mauer" funkieren sollen ist der Farbvergleich der beste, aber wenn sich die Körper abstoßen sollen geht das nicht mehr, da muss man auf Geometrie umsteigen auch wenns kompliziert wird.

_________________
Das wahre Ziel des Krieges ist der Frieden.
Sun Tzu