Pregunta

    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();
    }

Puede alguien ver los problemas inmediatos con ese código? Las variables tr y tb siempre se evalúan como 0.

Estoy feliz de proporcionar más información si es necesario.

¿Fue útil?

Solución

No diste de los tipos para las otras variables - en particular, ¿cuáles son los tipos de camera.fov_x y camera.fov_y? Si los dos son números enteros, entonces las líneas de inicialización angx y angy serán evaluados utilizando la aritmética de enteros.

Esto se puede solucionar mediante colada uno de los operandos:

double angy = ((double) camera.fov_y / h) * iy;

Las variables fovy y fovx ya son dobles sin embargo, este no es el problema.

¿Podría dar un ejemplo completo de este, que podemos compilar y poner a prueba a nosotros mismos?

Editar: permite modificar de Koistya Navin es un exceso. Sólo se necesita un operando de una expresión a ser un doble para todo lo que hay que ser calculada utilizando la aritmética doble. (Tiene que ser la expresión de la derecha, aunque -. Si lo hace (a/b) * c y el reparto c un doble, la multiplicación se realiza con doble aritmética, pero a / b aún podría hacerse como enteros)

Aquí está la lista cambiado apropiadamente para asegurarse de doble aritmética se utiliza en todas partes que debe ser:

// 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();
}

Otros consejos

Se sabe que no es parte de su pregunta original, pero utilizando SetPixel (..) no es muy eficiente y podría ser un problema si usted está planeando para usarlo en un motor de trazado de rayos.

Es posible que desee utilizar los LockBits () método, vea esta respuesta y éste para más detalles. Ellos otra forma de hacerlo es tener acceso a los datos utilizando el código C # "no seguro", que le permite utiliza punteros a los datos. Ver esta pregunta para obtener más información, tengo un x2 ~ acelerar mediante el uso de " inseguros" código.

No se olvide de echar sus números enteros a dobles. Por ejemplo:

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();
} 

Referencia rápida:

 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top