Wieder einmal Winkel...

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Der Eisvogel

Betreff: Wieder einmal Winkel...

BeitragSo, Apr 27, 2008 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich habe 2 Kreise. Wenn diese 2 Kreise kolliedieren, sollen sie in einem bestimmten Winkel wieder wo anders hin gehen. Wie kann ich diese Winkel berrechnen.
Ich bin ratlos.
Die Forensuche hat mir auch nicht geholfen.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

Tritium

BeitragSo, Apr 27, 2008 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Das lässt sich mit Trigonometrie lösen:

+--------O
|......../
|....../
|...../
|---/
|°/
|/
O

Die roten Os sind Deine Kreise. Der mit ° gekennzeichnete Winkel heißt jetzt mal alpha. Aus der Trigonometrie sind uns diese Formeln nützlich:

sin(winkel) = Gegenkathete / Hypotenuse
cos(winkel) = Ankathete / Hypotenuse

Für unseren Winkel ist die senkrechte Linie also die Ankathete, die waagerechte die Gegenkathete und die diagonale Linie von oben rechts nach unten ist die Hypotenuse.

Als nächstes müssen wir die Länge dieser Linien ausrechnen. Da in Blitzbasic Graphiken, also auch Kreise, den Punkt (0|0) links oben haben, wir aber mit dem Mittelpunkt der Kreise rechnen, haben die Kreise also jeweils die Koordinaten

(x + Breite/2 | y + Höhe/2)

Wenn ich ab jetzt von x bzw. y spreche, meine ich immer die Koordinaten im Mittelpunkt der Kreise!

Jetzt müssen wir die Länge von Ankathete, Gegenkathete und Hypotenuse bestimmen.

Die Ankathete ist in diesem Fall senkrecht, also subtrahieren wir die y-Koordinaten der Kreise (also der Mittelpunkte der Kreise!!) und nehmen den Betrag davon, da eine Länge immer positiv sein muss:

Ankathete = Abs(y1 - y2) oder Ankathete = Abs(y2 - y1),

das ist egal.

Die Gegenkathete ist waagerecht, also das gleiche wie bei der Ankathete nochmal in grün:

Gegenkathete = Abs(x1 - x2)

oder eben andersrum. Bleibt noch die Hypotenuse. Da sie mit An- und Gegenkathete ein rechtwinkliges Dreieck einschließt, können wir den Satz des Pythagoras benutzen. Dieser besagt ja bekanntlich, dass

Hypotenuse² = Ankathete² + Gegenkathete²

Da Du An- und Gegenkathete bereits berechnet hast, musst Du nur noch einsetzen (und vergiss nicht, die Wurzel zu ziehen!). Hier nochmal mit den Koordinaten:

Hypotenuse = Sqr((y1 - y2)² + (x1 - y2)²)

Den absoluten Wert können wir vernachlässigen, da a² immer positiv ist.

Nachdem wir jetzt also die Längen ausgerechnet haben, rufen wir uns nochmal die Formeln zur Winkelberechnung ins Gedächtnis:

sin(winkel) = Gegenkathete / Hypotenuse
cos(winkel) = Ankathete / Hypotenuse

Da Du aber Winkel (also in °) berechnen willst, musst Du noch jeweils die Gegenfunktion benutzen:

winkel = ASin(Gegenkathete / Hypotenuse)
winkel = ACos(Ankathete / Hypotenuse)

Damit kannst Du also die Winkel berechnen. Und da ich schon so schön am schreiben bin, hier nochmal die kompletten Formeln:

winkel = ASin(Abs(x1 - x2)/Sqr((y1 - y2)² + (x1 - y2)²))

bzw.

winkel = ACos(Abs(y1 - y2)/Sqr((y1 - y2)² + (x1 - y2)²))

Der Eisvogel

BeitragSo, Apr 27, 2008 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wie kann ich dem Kreis dann sagen wie er weiter gehen muss, also x-Koordinate+bla und y-K.+bla?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

Tritium

BeitragSo, Apr 27, 2008 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht, was Du machen willst. Um den Kreis zu verschieben, musst Du x/y-Koordinate ändern, aber das meinst Du doch nicht, oder?

Der Eisvogel

BeitragSo, Apr 27, 2008 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Also die Kreise bewegen sich auf einander zu. Wenn sie dann kollidieren, dann sollen sie von einander abprallen.

EDIT:
user posted image
Wie kann ich denn Weg nach dem Abprallen berechnen bzw. ausführen?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
  • Zuletzt bearbeitet von Der Eisvogel am So, Apr 27, 2008 21:54, insgesamt einmal bearbeitet
 

Tritium

BeitragSo, Apr 27, 2008 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, mmhhh...

Keine Ahnung, wie das geht, ehrlich gesagt Rolling Eyes
 

Dreamora

BeitragSo, Apr 27, 2008 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist simple Vektor mathematik sowie die Nutzung von Vektor Projektion, Vektor Addition und Substraktion und sofern die kreise einen teil des aufschlags absorbieren sollen noch das skalieren eins vektors.

Was du machen musst ist erst den kollisionspunkt der kreise berechnen (einfach, liegt in der mitte zwischen den beiden kreiszentren -> Vektor Addition und skalierung mit 1/2 )
Danach auf Basis dieses Punktes und der originalen bewegungsrichtung die neue Richtung errechnen. Das geht dadurch dass Abprallen eine sehr einfache sache ist: Die neue Richtung ist immer die alte Richtung gespiegelt an der Oberflächen normale, welche bei einem kreis einfach die Richtung von Kreiszentrum zu Kollisionspunkt ist (auf die länge 1 normiert)

Damit sollte es machbar sein das ganze zu machen, wie man einen Vektor an einem anderen spiegelt findest du hier im Board, das habe ich Mal gepostet. Ansonsten stehts auch auf jeder Seite die sich eingehend mit Vektormathematik beschäftigt, da Vektorprojektion eine Grundlagennutzung ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Mo, Apr 28, 2008 15:20, insgesamt einmal bearbeitet

Der Eisvogel

BeitragMo, Apr 28, 2008 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich hab jetzt den Kollisionspunkt. Was muss ich jetzt genau machen. Was meinst du mit Basis? Und deinen Beitrag zur Vektorspiegelung habe ich auch nicht gefunden. Sad
Könntest du mir den Vlt. zeigen. Vlt. auch einen Beispielcode?

Mein Code sieht bis jetzt so aus:
Code: [AUSKLAPPEN]
Graphics 500,500,16,2
x1=16
y1=16
x2=484
y2=484

SetBuffer BackBuffer()
Repeat
Cls

Oval x1-16,y1-16,32,32,1
Oval x2-16,y2-16,32,32,1

x1=x1+3
y1=y1+3
x2=x2-3
y2=y2-3

If x1<-32  x1=516
If x1>516  x1=-32
If y1<-32  y1=516
If y1>516  y1=-32
If x2<-32  x2=516
If x2>516  x2=-32
If y2<-32  y2=516
If y2>516  y2=-32

If RectsOverlap(x1-16,y1-16,32,32,x2-16,y2-16,32,32) Then
   kol_point_x=(x1+x2)/2
   kol_point_y=(y1+y1)/2
   Text 10,10,kol_point_x
   Text 10,20,kol_point_y
EndIf

Flip
Until KeyDown(1)
End

Die Kollision ist nur vorübergehen, ich möchte es erstmal verstehen.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

Dreamora

BeitragMo, Apr 28, 2008 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Vektorspiegelung an einer Normale ist einfach:

1. Vektor ( dir ) auf Normale projizieren -> pn
2. pn von dir abziehen -> dif
3. dir invertieren und dazu 2x dif addieren -> neue Richtung dirNew

und ich meine garnichts mit Basis, das ist ein normaler Ausdruck der deutschen Sprache. "Auf Basis von" -> "basierend auf". Gehört deutsch heute nicht mehr zur Grundausbildung in der Schule?
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

BladeRunner

Moderator

BeitragMo, Apr 28, 2008 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Grundsätzlich, Eisvogel: Weisst Du was Vektoren sind und wie man mit ihnen rechnet ?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Der Eisvogel

BeitragMo, Apr 28, 2008 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry wenn ich frage, aber was ist die Normale?
Und was Deutsch anbelangt. Ich bin nicht sehr gut darin. Embarassed

EDIT:
@BladeRunner: Nein.

Nochmal EDIT:
Ich weis nur was sie sind. Sie sind ein Zeiger auf einen anderen Punkt. Meines wissens.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BladeRunner

Moderator

BeitragMo, Apr 28, 2008 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann solltest Du mal google bemühen, um vielleicht zu verstehen was Dreamora dir da zeigen will. Das problem bei uns alteingesessenen ist dass wir gern mal mit Fachbegrifflichkeiten um uns werfen, da wir manche Grundlagen als selbstverständlich erachten. Wenn Du die noch nicht kennst hast du allerdings keine Chance uns zu folgen.

Such mal nach Vektorrechnung oder so.
http://de.wikipedia.org/wiki/Vektor so als kurzer Einstieg zu den Begrifflichkeiten
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Der Eisvogel

BeitragMo, Apr 28, 2008 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich weiß jetzt was eine Normale ist. Es ist eine Ortogonale Linie zu einer anderen.

Mein Code: [AUSKLAPPEN]
Graphics 500,500,16,2
x1=16
y1=16
x2=484
y2=484

SetBuffer BackBuffer()
Repeat
Cls

Oval x1-16,y1-16,32,32,1
Oval x2-16,y2-16,32,32,1

x1=x1+3
y1=y1+3
x2=x2-3
y2=y2-3

If x1<-32  x1=516
If x1>516  x1=-32
If y1<-32  y1=516
If y1>516  y1=-32
If x2<-32  x2=516
If x2>516  x2=-32
If y2<-32  y2=516
If y2>516  y2=-32

If RectsOverlap(x1-16,y1-16,32,32,x2-16,y2-16,32,32) Then
   kol_point_x=(x1+x2)/2
   kol_point_y=(y1+y1)/2
   Text 10,10,kol_point_x
   Text 10,20,kol_point_y

   ox1 = (x1 + x2) / 2 - Sin(Winkel(x1, y1, x2, y2) - 90) * 400
   oy1 = (y1 + y2) / 2 - Cos(Winkel(x1, y1, x2, y2) - 90) * 400
   ox2 = (x1 + x2) / 2 - Sin(Winkel(x1, y1, x2, y2) + 90) * 400
   oy2 = (y1 + y2) / 2 - Cos(Winkel(x1, y1, x2, y2) + 90) * 400
   Line ox1, oy1, ox2, oy2
   WaitKey
EndIf

Flip
Until KeyDown(1)
End



Function Winkel#(x1#,y1#,x2#,y2#)
Return (360+ATan2(x1#-x2#,y1#-y2#)) Mod 360
End Function
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

PSY

BeitragMo, Apr 28, 2008 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
hoi,
wenn du's richtig machen willst, musst du erstmal die kollidierten kreise (bälle) wieder in den zustand VOR der kollision bringen (meistens ragen sie mindestens 1 pixel (einheit) in den anderen ball rein wegen der bewegungsroutinen).

dein freund ist hier ATAN2, der eigentlich wie ATAN funktioniert, aber dir ein paar logische überlegungen abnimmt...

guggst du hier :
https://www.blitzforum.de/foru...;start=160

das ist mein beitrag zum bbc16 (zu spät halt Very Happy)
der code ist genau das, was du suchst...wenn du fragen hast kann ich dir mal die originalengine von phish umschreiben (massenberechnung rausnehmen und vereinfachen) und die variablen eindeutig benennen, damit du's besser verstehst...

l8er,
PSY

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group