Wieso macht hat mein Auto bei 45° so nen komischen Sprung?
-
Hallo!
Ich will son 2D Spiel coden
Jetz muss das ja in 360 verschiedene Richtungen fahren können, also wollte ich zuerst mal die ersten 90° machen, runterladen könnt ihr euch das "Spiel" hier:
http://mitglied.lycos.de/Surkevin2/Debug.zipIch dachte mir das so...bis 45 Grad herrscht ein Ratio von Rotation/90-Rotation, somit wäre bei 45 Grad ein Ratio von 1/1, was auch stimmt. Drüber wäre das Radio das selbe, jedoch für den Y Wert, hier ist mal der Code für die MoveForwardfunktion: (mit VKright und left verändert sich der Radius - UP ruft einfach nur folgenden Code auf)
[cpp]
void MoveForward()
{if(fRotation >= 0.0 && fRotation < 45Grad)
{
RatioX = (90Grad - fRotation) / fRotation;
RatioY = fRotation / (90*Grad - fRotation);if(fRotation == 0.0)
{
RatioY = 0;
RatioX = 1000;
}iMoved++;
_pos.x++;
if((float)iMoved >= RatioX)
{
_pos.y--;
iMoved = 0;
}}
if(fRotation >= 45*Grad && fRotation < 90*Grad)
{
RatioX = (90Grad - fRotation) / fRotation;
RatioY = fRotation / (90Grad - fRotation);if(fRotation == 45.0*Grad)
{
RatioY = 1;
RatioX = 1;}
iMoved++;
_pos.y--;
if((float)iMoved >= RatioY)
{
_pos.x++;
iMoved = 0;
}
}
}[cpp]
Wenn ihr jetzt mit dem Auto grade aus fahrt (nach rechts) und dann versucht nach oben zu 90° zu kommen macht der bei 45° so nen komischen Sprung, als würde er nicht beachten dass er weiter nach rechts muss oder so...mhm..ich wüsste aber nicht was an meinem Code falsch ist
Vielleicht habt ihr bessere Adleraugen
Kevin
-
Also, bei mir zeigt das Programm leider nix an, nur einen dunklen Bildschirm...
-
ich kann dir net so genau folgen. du möchtest dass dein wagen sich in die richtung bewegt, in die er auch rotiert ist?
_pos.x += cos(fRotation*3.141592f/180.f)*Speed; _pos.y += sin(fRotation*3.141592f/180.f)*Speed;
das müßte es eigentlich sein, oder gibt es einen grund für deinen ganzen ratio den ich hier überseh? (könnt ja sein)
rapso->greets();
-
Rapso, ja genau das mein ich.
Zum andern: Hab das Begin/Endscene weggelassen , sorry - scheint deine Graka net zu mögen..ich update es gleich!
Rapso:
Also wie mir scheint kann man sowas nur mit SINUS und COSINUS lösen? BlödDa ich mir auch keine richtige Formel machen kann muss das wohl so sein. Ich dachte ich kann mir da für jeden Radius ein bestimmtes Ratio (wie viel X pro Y) erstellen und dachte das mit 90-Radius/Radius zu schaffen, bei 45 wäre das dann 1 was auch stimmen würde. Denn bei 45 ° würde dann 1X auf 1Y kommen. Aber für andere Werte stimmt das nicht 100%ig, worauf ich auch die krüpplige Bewegung meines "Autos" zurückschließe. Deine Berechnung funktioniert für den Y Wert nicht. Wenn ich das so einsetze bewegt sich das Auto nur nach rechts, aber nicht nach oben!
Da ich das leider in der Schule noch nicht gelernt habe (kommt dieses Jahr) hab ich deine Berechnung mal mit 45 Grad ausprobiert. Du weißt ja es müsste 1 rauskommen, genau wie bei X. Also x = yTest: f(45°):
x = 0,9999 => i.O.
y = 0,014 ungefähr... => nicht in Ordnung
MHM wie berechne ich das jetzt?Man dumm wenn man erst 10. Klasse Gym ist
Kevin
-
So nu sollte das Prog bei allen laufen *bet*
-
Eine Framebramse kannst du auch mal einbauen.
-
1.f = sin(winkel)2+cos(winkel2);
das ist erstmal die formel um das verhältniss auszurechnen. der radius eines kreises den man mit sin/cos bekommt ist 1.f, somit muss die länge x2+y2=1(^2) sein (laut phytagoras).
somit bekommst du auch raus, dass bei 45° die länge von x und y je bei ~0.7 sein müßte, wenn du für x fast 1 und für y fast 0 bekommst, dann stimmt da etwas ganz und garnicht.
kann aber nicht direckt abschätzen wo der fehler liegt,vielleicht hast du dich vertippt?rapso->greets();
-
Da er Y Wert fast immer unter 1 ist kann ich das nicht zum Y Wert dazuzählen (Pixel is ja immer 1 Pixel groß :))
=> Ich brauch ein Ratio wie viele X Pro Y
Jetz is das Ratio
cos(fRadius) / sin(fRadius)Jetz muss ich dich schauen nach wie vielen Aufrufen so viele Fortbewegungen (x++) passiert sind dass meine sin summe an das Ratio kommt (da es ja heißt X pro Y).
BEISPIEL:
20 Grad
cos(20) / sin(20) = 2,74
=> bei 20° muss darf ich 2,74mal auf der X Achse wandern bevor ich 1mal auf der YAchse wandern darf.
=> ich brauch ne variable die die sin(20)s pro aufruf addiert. Sobald die 2,74 erreicht darf ich auf der YAchse wandern.Is da jetz ein Denkfehler drin?
Kevin
-
du könntest für die positionierung zwei variablen-paare haben, einmal float für die berechnungen und zur darstellung weist du diese float den int-variablen zu mit denen du die pixel ausrechnest.
es ist sonst schwer mit deinen ratio richtig zu rechnen, weil mitten in der fahrt die richtung sich verändern könnte und somit das ratio... außerdem könnte es bei
cos(fRadius) / sin(fRadius)
bei 0° einen schlimmen divisionsbug geben.
rapso->greets();
-
Könnte man nicht gleich, dem Beispiel folgend, die 2,74 auf der X Achse addieren und gleichzeitig 1 auf der Y Achse?
-
*** schrieb:
Könnte man nicht gleich, dem Beispiel folgend, die 2,74 auf der X Achse addieren und gleichzeitig 1 auf der Y Achse?
er scheint nur int nutzen zu wollen, mein vorschlag wäre auch so wie deiner
rapso->greets();
-
*DURCHDREH*
MAAN!! Was ist da denn los? Warum ist Moved NIE so groß wie das Ratio? Das KANN doch gar nicht sein!!if(fRotation >= 0.0 && fRotation < 45*Grad) { RatioX = ((float)cos(fRotation/Grad))/((float)sin(fRotation/Grad)); iMoved = (float)iMoved + (float)sin(fRotation/Grad); fprintf(protokoll, "fRotation: %e, Grad: %e, cos: %e , sin: %e, iMoved: %e, RatioX: %e\xd\xa",fRotation, Grad, cos(fRotation/Grad), sin(fRotation/Grad),iMoved, RatioX); _pos.x = (float)_pos.x + (float)cos(fRotation/Grad); if((float)iMoved >= (float)RatioX) { _pos.y++; iMoved = iMoved - RatioX; } }
nach dem projekt muss ich zum Zahnarzt *schenkelklopf*
Kevin
-
Ich weiss nicht, ob es daran liegt, aber du konvertierst doch ständig nach int
iMoved = (float)iMoved + (float)sin(fRotation/Grad);
und int kennt nur Ganzzahlen. Wenn du also einen Wert von 0.43irgentwas addierst, wird tatsächlich nichts addiert. Ist RatioX etwa auch eine int Variable?
-
Versuch doch einfach mla so:
struct point { float x; float y; }; // in Klasse: point pos; // Move: point temp; temp.x = cos(fRotation); // eventuel in Rad umwandeln temp.y = sin(fRotation); // Per Definition ist Länge von Temp = 1: /* soll ne Gerade sein ---| --------/ | cos Rot ---/ | +------------------- sin(Rot) L = cos^2 + sin ^2 = 1 */ // Dann kannste das ganze noch mit speed multiplizieren // dann: pos.x += temp.x; pos.y += temp.y; // Müsste klappen denke ich
-
iMoved = (float)iMoved + (float)sin(fRotation/Grad);
Ja, das bringt nichts, wenn alle 3 int sind, dann werden die nur für die Addition in floats umgewandelt aber von da gleich wieder zurück nach int -> du kannst es dir sparen.
Unabhängig von deinem Problem würde ich dir raten, wenn du sowieso nur mit floats arbeitest, sinf und cosf zu nutzen
MfG MAV
-
Ich hab ma zum Test ob COS und SIN überhaupt funzt cos(1) mal ausgeben lassen - ergebnis: > 26000
Was soll das denn?#include "windows.h"
#include "stdio.h"
#include "math.h"int main()
{
printf("%d", (double)cos(1));return 0;
}na so kann ja gar nichts gehen
Kevin
-
Ich würde sagen, Strg+A, Entf und dann erstmal näher mit Vektorrechnung und Trigonometrie beschäftigen. Bringt doch so echt nix.
Bye, TGGC
-
Bringt doch so echt nix.
Genau wie deine Beiträge
@Surkevins:
Hmm... solltest mal nur float wie schon gesagt nutzen. Aber COS kann doch niemals 26000 ausgeben, soweit ich was maximal PI oder PI*2.Probier dein Test mal mit %f, (float) und cosf(1.0f).
cu
-
Sorry, aber ich stimme TGGC zu. Da fehlt massiv das Grundwissen.
Nun versuchst du eine float-Variable in ein int-Format zu pressen:printf("%d", (double)cos(1));
-
Surkevins schrieb:
Ich hab ma zum Test ob COS und SIN überhaupt funzt cos(1) mal ausgeben lassen - ergebnis: > 26000
Was soll das denn?#include "windows.h"
#include "stdio.h"
#include "math.h"int main()
{
printf("%d", (double)cos(1));return 0;
}na so kann ja gar nichts gehen
Kevin
%d is dezimal
versuch mal %faußerdem ist cos nicht in grad von 0 bis 360, sondern in rad von 0 bis 2PI
deswegen auch die umrechnung Winkel3.141592f/180.frapso->greets();
-
Maxi2, das bringt leider nich viel weil ich nich 0.5 pixel 4example hochwandern kann