C++ Vektor Berechnung

Diskutiere C++ Vektor Berechnung im Developer Network Forum im Bereich Hardware & Software Forum; Hallo Früher hab ich mit 3d Gamestudio programmiert. Wenn man da ein Model zu einem bestimmten Punkt ausrichten wollte, schrieb man einfach...
  • C++ Vektor Berechnung Beitrag #1
Niemand!

Niemand!

Bekanntes Mitglied
Dabei seit
18.03.2005
Beiträge
343
Reaktionspunkte
0
Ort
Schweiz
Hallo
Früher hab ich mit 3d Gamestudio programmiert. Wenn man da ein Model zu einem
bestimmten Punkt ausrichten wollte, schrieb man einfach vec_rotate(my.x,you.x);
das war einfach :)
Aber jetzt wirds schwieriger mit C++. Also:
Ich stehe auf Position 90, 110 und bin um 270° gedreht. Ich will zu Punkt 300,100
laufen. Ich will mich aber zuerst drehen und dann nur noch geradeaus laufen.
Wie kann ich berechnen, dass ich zum Punk 300, 100 sehe?

frpx390.jpg


Gibts da spezielle Funktionen oder so?
Hoffe jemand kann mir helfen.
mfg
Niemand
 
  • C++ Vektor Berechnung Beitrag #2
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
C++ ist eine Programmiersprache und kein Wunderwerk, das einem die Notwendigkeit für Grundlagenwissen abnimmt. :)
Zielpunkt minus aktuelle Position, schon hast du einen Vektor, der deine notwendige Bewegungsrichtung angibt. Wenn du den Winkel zu einer der Koordinatenachsen wissen willst, kannst du davon z.B. noch den Arcus-Tangens berechnen.
 
  • C++ Vektor Berechnung Beitrag #3
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
das directx sdk bietet relativ guten überblick zu funktionen welche in zusammenhang mit vektoren, matrizen, koordinaten(systemen) usw brauchbar sind. auch grundlagenwissen wird in der dokumentation recht anschaulich vermittelt.
 
  • C++ Vektor Berechnung Beitrag #4
Niemand!

Niemand!

Bekanntes Mitglied
Dabei seit
18.03.2005
Beiträge
343
Reaktionspunkte
0
Ort
Schweiz
Leider bin ich immer noch nicht weiter. Ich will und kann aus Zeitgründen nicht C++ komplett lernen.
Ich brauche so Mathematische dinge nur sehr selten
bzw noch nie. Nur jetzt hab ich eben dieses Problem.
Es wäre wirklich nett wenn jemand vielleicht etwas konkreteres sagen könnte,
perfekt wäre natürlich etwas Code (wenige Zeilen) aber auch wenn jemand
schnell sagen könnte wie das denn nun gehen soll.
MSDN sagt:
Code:
atan-Methode
Gibt den Arkustangens einer Zahl zurück. 
function atan(number : Number ) Number

Damit kann ich leider überhaupt nichts anfangen.

mfg
 
  • C++ Vektor Berechnung Beitrag #6
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Du brauchst auch von C++ keinerlei Ahnung zu haben. :) Dein Problem ist rein mathematischer Natur. Das sind nur grundlegende Vektor- und Winkelberechnungen, die man mit jedem Taschenrechner machen kann.

Also wenn du nur den neuen Zielrichtungsvektor wissen willst, dann subtrahierst du einfach die aktuelle Position von der gewünschte Zielposition. Je nach Bedarf kannst du den Vektor dann noch normieren. Willst du den Winkel des Zielrichtungsvektors z.B. zur Horizontalen wissen, dann rechnest du atan(richtung.y/richtung.x). Wie üblich ist zu beachten, dass alle Winkelfunktionen mit Rad rechnen; nicht mit Grad.
 
  • C++ Vektor Berechnung Beitrag #7
Niemand!

Niemand!

Bekanntes Mitglied
Dabei seit
18.03.2005
Beiträge
343
Reaktionspunkte
0
Ort
Schweiz
Brauch ich nicht atan2? Denn das ist extra für x, y Koordinaten.
Also hier mein Prototyp:
Code:
float a1, a2, a3 = 0;
a1 = GetPosX(); //"meine" X-Pos
a2 = GetPosY();
//Meinepos mit Zielpos subtrahieren
a1 -= -4194.36; 
a2 -= 1238.04;
a3 = atan2(a1,a2) * 180 / 3.14159;
cout << "ATAN: " << a3 << endl;

Das gibt hier zb -19,9994. Nicht ganz das was ich benötige.
Richtigerweise gäbe es zb 35. Dann muss ich nur noch um 125 drehen und
geradeaus laufen.
Ich frage mich schon lange wie das gehen kann, denn bei atan muss ich ja
nur zwei Werte übergeben wie soll man das berechnen können? Man sollte
doch mindestens Start xy und Ziel xy übergeben müssen, sonst kann man es ja gar nicht berechnen Oo
 
  • C++ Vektor Berechnung Beitrag #8
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
C++ nimmt dir nicht die Notwendigkeit für grundlegendes Verständnis ab, sondern rechnet wie ein Taschenrechner. atan ist einfach die Umkehrfunktion vom Tangens, die hat mit Ausrichtung von Objekten u.ä. auf irgendwas gar nichts zu tun. atan2 berechnet einfach die oft notwendige Division von y/x selbst, sodass du es nicht selber tun musst.
Außerdem hab ich geschrieben, dass die aktuelle Position von der Zielposition zu subtrahieren ist, nicht umgekehrt.
Du musst dann wohl auch noch eine kleine Fallunterscheidung der Vorzeichen dieses Vektors einbauen, da der Tangens nicht um den ganzen 360°-Bereich eindeutig funktioniert.

Ich würde vorschlagen, du liest mal kurz nach, was der Tangens berechnet und nimmst dir Zettel, Bleistift, und Taschenrechner. Dann sollte von selber klar werden, wie das geht.
 
  • C++ Vektor Berechnung Beitrag #9
Niemand!

Niemand!

Bekanntes Mitglied
Dabei seit
18.03.2005
Beiträge
343
Reaktionspunkte
0
Ort
Schweiz
Vielen Dank, jetzt gehts endlich mit atan:
Code:
float x1, x2, y1, y2, a3 = 0;
x1 = GetPosX();
y1 = GetPosY();
x2 = -2652.53;
y2 = -359.45;
a3 = atan((x2- x1)/(y2 - y1)) * 180 / 3.14159;
if (a3 < 0)
{
a3 += 180;
}

Jetzt zeigts den Winkel an, aber etwas merkwürdig. Von der einen Seite her
stimmt er immer genau und von der anderen Seite her ist er immer verkehrt.
Je nach Position ist der Winkel auch einfach um 90° zu gross und manchmal
90° zu klein -.-
 
  • C++ Vektor Berechnung Beitrag #10
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Du musst die vier Quadranten des 360°-Kreises gesondert behandeln und den Winkel entsprechend korrigieren.
Der Arkustangens liefert nur den Winkel zwischen Gegenkathete und Ankathete im Dreieck. Ob das aber im Kreis sozusagen in der linken oder rechten Hälfte liegt ist ihm dabei eher egal. Das ist auch logisch, weil ja durch die Division ein negatives Vorzeichen bei x oder y den selben Effekt hat, nämlich, dass der Bruch negativ wird, und somit der berechnete Winkel ebenfalls. Aus dem negativen Bruch alleine lässt sich aber nicht mehr bestimmen, ob x oder y negativ war. Darüberhinaus kürzt sich das Minus weg, wenn x und y negativ sind, was dann das selbe Resultat hat, wie wenn beide positiv wären. Dadurch stimmt der Winkel dann um 180° nicht.
Du musst also die vier möglichen Fälle (dx>0 && dy>0), (dx<0 && dy>0), usw. abfragen, und das Ergebnis vom Tangens entsprechend interpretieren. (dx = x2-x1 usw.)
Dein Problem mit den 90° liegt daran, dass du x/y rechnest und nicht y/x. Dadurch stimmt der Winkel eigentlich immer um 90° nicht.

PS: Lernt man die Winkelfunktionen bei euch in der Schule nicht? Ich bin mir zwar nicht sicher, in welcher Schulstufe wir die hatten, aber bei uns in Ö. sind die Standardprogramm.
 
  • C++ Vektor Berechnung Beitrag #11
Niemand!

Niemand!

Bekanntes Mitglied
Dabei seit
18.03.2005
Beiträge
343
Reaktionspunkte
0
Ort
Schweiz
Jetzt hab ichs geschafft. Ich hab das ganze Script in AutoIT Script
Umgeschrieben.
Code:
$posx2 = $CurrentX
$posy2 = $CurrentY
$posx1 = -2652.53
$posy1 = -359.45
$radToDeg = -180 / $pi
$result = atan(($posy1-$posy2)/($posx2-$posx1)) * $radToDeg
if $result < 0 Then $result += 180
if $posx2 < $posx1 Then
if $result < 0 Then
$result = 270 + $result	
Else
$result = 270 + $result
EndIf
EndIf
if $posx2 >= $posx1 Then
if $result < 0 Then
$result = 90 + $result	
Else
$result = 90 + $result	
EndIf
EndIf
$result = $result-360
$result = floor(($result - $result) - $result)
if $result = "360" Then $result = 0
if $Result < 0 Then $result += 180
MsgBox(4096, "Result:", $result, 2)

Es funktioniert jetzt perfekt.
Ich hab in den 9 Jahren Schule + 10. Jahr + Vorlehre noch die tan, atan usw
gelernt aber jetzt in der Lehre soll es im Schulstoff sein.
Die "Tangente" kenn ich nur aus der Geometrie, die Strecke die den Kreis
berührt ;)

Danke nochmal
Und schönen Abend :hal:
 
Thema:

C++ Vektor Berechnung

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben