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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top