Fehlerhafte C # -Code die Doppel- und ganze Zahlen
Frage
for (iy = 0; iy < h; iy++)
{
double angy = (camera.fov_y / h) * iy;
for (ix = 0; ix < w; ix++)
{
double angx = (camera.fov_x / w) * ix;
//output[ix,iy].r = (int)Math.Round(255 * (angy / camera.fov_y);
//output[ix,iy].b = (int)Math.Round(255 * (angy / camera.fov_y);
double tr = (angx / camera.fov_x) * 255D;
double tb = (angy / camera.fov_y) * 255D;
Console.Write("({0},{1})",Math.Round(tr),Math.Round(tb));
output.SetPixel(ix, iy, Color.FromArgb(Convert.ToInt32(tr), 0, Convert.ToInt32(tb)) );
Console.Write(".");
}
Console.WriteLine();
}
Kann jemand sieht keine unmittelbaren Probleme mit diesem Code?
Die Variablen tr
und tb
immer auf 0 bewerten.
Ich bin glücklich, weitere Informationen zur Verfügung zu stellen, wenn es gebraucht wird.
Lösung
Sie haben nicht die Typen für die anderen Variablen gegeben - insbesondere, was sind die Arten von camera.fov_x
und camera.fov_y
? Wenn sie beide ganze Zahlen sind, dann werden die Linien angx
und angy
Initialisierung Integer-Arithmetik werden ausgewertet.
Dies kann durch Gießen einer der Operanden festgelegt werden:
double angy = ((double) camera.fov_y / h) * iy;
Die fovy
und fovx
Variablen sind bereits verdoppelt, obwohl dies nicht das Problem ist.
Könnten Sie ein komplettes Beispiel dafür geben, was wir können uns kompilieren und testen?
EDIT: Koistya Navins bearbeiten ist übertrieben. Sie benötigen nur einen Operanden eines Ausdrucks ein Doppel für die ganze Sache zu sein Doppel Arithmetik berechnet werden unter Verwendung. (Es muss allerdings den richtigen Ausdruck sein -. Wenn Sie (a/b) * c
tun und Guss c
eine doppelte, wird die Multiplikation mit Doppel Arithmetik durchgeführt werden, aber a / b könnte noch als ganze Zahlen durchgeführt werden)
Hier ist der Eintrag geändert entsprechend sicher Doppel Arithmetik machen verwendet wird, überall sollte es sein:
// Changed loops to declare the variable, for stylistic purposes
for (int iy = 0; iy < h; iy++)
{
// Changed here - cast camera.fov_y
double angy = ((double) camera.fov_y / h) * iy;
for (int ix = 0; ix < w; ix++)
{
// Changed here - cast camera.fov_x
double angx = ((double) camera.fov_x / w) * ix;
//output[ix,iy].r = (int)Math.Round(255 * (angy / camera.fov_y);
//output[ix,iy].b = (int)Math.Round(255 * (angy / camera.fov_y);
double tr = (angx / camera.fov_x) * 255D;
double tb = (angy / camera.fov_y) * 255D;
Console.Write("({0},{1})", Math.Round(tr), Math.Round(tb));
output.SetPixel(ix, iy, Color.FromArgb(Convert.ToInt32(tr),
0,
Convert.ToInt32(tb)) );
Console.Write(".");
}
Console.WriteLine();
}
Andere Tipps
Es weiß, dass es nicht Teil Ihrer ursprünglichen Frage, aber mit SetPixel (..) ist nicht sehr effizient und könnte ein Problem sein, wenn Sie es in einem Raytracing-Engine verwenden planen.
Sie möchten die LockBits verwenden () -Methode finden Sie in diesem Antwort und dieses für weitere Details. Sie anderen Weg zu gehen, ist auf die Daten zuzugreifen „unsicher“ C # -Code verwenden, die Sie Zeiger auf die Daten verwendet werden können. Siehe diese Frage für weitere Informationen, bekam ich ein ~ x2 Speed-up unter Verwendung eines " unsicher“Code.
Vergessen Sie nicht, Ihre ganzen Zahlen Doppel zu werfen. Zum Beispiel:
for (iy = 0; iy < h; iy++)
{
double angy = ((double) camera.fov_y / h) * iy;
for (ix = 0; ix < w; ix++)
{
double angx = ((double) camera.fov_x / (double) w) * (double) ix;
output[ix,iy].r = (int) Math.Round(255 * (angy / camera.fov_y);
output[ix,iy].b = (int) Math.Round(255 * (angy / camera.fov_y);
double tr = (angx / camera.fov_x) * 255D;
double tb = (angy / camera.fov_y) * 255D;
Console.Write("({0},{1})",Math.Round(tr), Math.Round(tb));
output.SetPixel(ix, iy, Color.FromArgb(
Convert.ToInt32(tr), 0, Convert.ToInt32(tb)) );
Console.Write(".");
}
Console.WriteLine();
}
Kurzreferenz:
int * double = double
int / double = double
double * int = double
double / int = double
int * int = int
int / int = int // be carefull here!
1 / 10 = 0 (not 0.1D)
10 / 11 = 0 (not 1)
1D / 10 = 0.1D
1 / 10D = 0.1D
1D / 10D = 0.1D