Wieder einmal Winkel...
Übersicht

![]() |
Der EisvogelBetreff: Wieder einmal Winkel... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also die Kreise bewegen sich auf einander zu. Wenn sie dann kollidieren, dann sollen sie von einander abprallen.
EDIT: 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Achso, mmhhh...
Keine Ahnung, wie das geht, ehrlich gesagt ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry wenn ich frage, aber was ist die Normale?
Und was Deutsch anbelangt. Ich bin nicht sehr gut darin. ![]() 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. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group