Rundungsproblem (doule zu int)
-
Hej,
ich schreibe gerade ein Tetris-Spiel und sitze an der Funktion um die Steine zu drehen. Man soll immer um 90 Grad im Uhrzeigersinn den Stein drehen koennen. Um auch verschiedene Steine (per Zufall erzeugt z.B.) nutzen zu koennen, will ich keine 'vorberechneten' Koordinaten oder so zum drehen benutzen.
Deswegen habe ich eine mathematische Formel benuzt (die aber nicht von mir stammt)
Hier mal die Funktion: int pX=0, pY=0; //Dieser Punkt wird gedreht int xu=0, yu=0; //Um diesen Punkt wird gedreht int eta=-90; //Winkel der Drehung double xs=0, ys=0; //Hier stehen die neuen Koordinaten drin double M_PI = 3.141592654; int i=0; for(i=1;i<4;i++) if(dPiece[i][0]!=-1) { xu = dPiece[0][0]; yu = dPiece[0][1]; pX = dPiece[i][0]; pY = dPiece[i][1]; xs = xu+cos(eta*2.0*M_PI/360.0)* (pX-xu)-(yu-pY) *sin(eta*2.0*M_PI/360.0); ys = yu-sin(eta*2.0*M_PI/360.0)* (pX-xu)-(yu-pY) *cos(eta*2.0*M_PI/360.0); dContents[dPiece[i][0]][dPiece[i][1]] = 0; dPiece[i][0] = (int)xs; dPiece[i][1] = (int)ys; dContents[dPiece[i][0]][dPiece[i][1]] = dColor; } return 0;
Erkalerung:
dPiece[4][2] Hier drin stehen die jeweilige Koordinaten des Steines der gerade faellt (bestehend aus max. 4 einzelnen Steinchen)
dContents[11][20] Das Symbolisiert das gesmte Feld, z.B. 0=leer, 1=roter Stein, 2=blauer Stein usw.Mein Hauptproblem ist, dass die mathematische Formeln nen double zurueckgibt und 'falsch' gerundet wird.
Vielleicht kann mir jmd. helfen oder weiss sogar ne bessere Art nen Stein zu drehen.
MfG, Viking69
-
Hi,
dein Problem liegt wohl hier, oder???
dPiece[i][0] = (int)xs; dPiece[i][1] = (int)ys;
Wenn du einen double zu einem integer castest, dann werden lediglich die Nachkommastellen weggestrichen und nicht gerundet.
Da wirst du wohl nicht darum herumkommen und dir deine eigene Funktion schreiben müssen um deine double Variablen richtig zu Runden und dann in einen integer zu casten.Gruß Wolle
-
Gabs hier auch schon häufiger. Korrekte Rundung beim Cast erreicht man mittels
double gleitkommazahl = ...; int ganzzahl; ganzzahl = int(gleitkommanzahl + 0.5f);
-
Deadlef schrieb:
Gabs hier auch schon häufiger. Korrekte Rundung beim Cast erreicht man mittels
double gleitkommazahl = ...; int ganzzahl; ganzzahl = int(gleitkommanzahl + 0.5f);
es ist falsh, und du kannst es selbst mit der Zahl "-2.0" überpüfen:
double gleitkommazahl = -2.0; int ganzzahl; ganzzahl = int(gleitkommanzahl + 0.5f);// ganzzahl = -1
richtig so:
inline int toInt(double val) { return val < 0 ? val - 0.5f : val + 0.5; }
-
Hej,
ok danke geht soWenn ich durch das Spiel erstmal Reich bin beteilige ich euch
ByeBye, Viking69===================== Kann geschlossen werden ================