Domanda

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

Chiunque può vedere i problemi immediati con quel codice? Le variabili tr e tb valutano sempre a 0.

Sono felice di fornire ulteriori informazioni se è necessario.

È stato utile?

Soluzione

Non hai dato i tipi per le altre variabili - in particolare, quali sono i tipi di camera.fov_x e camera.fov_y? Se sono entrambi interi, quindi le linee di inizializzazione angx e angy saranno valutati usando aritmetica intera.

Questo può essere risolto da colata uno degli operandi:

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

Le variabili fovy e fovx sono già raddoppia, però, questo non è il problema.

Potrebbe fare un esempio completo di questo, che siamo in grado di compilare e testare noi stessi?

EDIT: edit del Koistya Navin è eccessivo. Hai solo bisogno di un operando di un'espressione di essere una doppia per il tutto da calcolare utilizzo di un doppio aritmetica. (Ha bisogno di essere l'espressione giusta anche se -. Se si fa (a/b) * c e cast c un doppio, la moltiplicazione sarà fatto con doppio aritmetica, ma a / b potrebbe ancora essere fatto come numeri interi)

Ecco la lista cambiato in modo appropriato per assicurarsi doppia aritmetica è utilizzato in tutto il mondo che dovrebbe essere:

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

Altri suggerimenti

E so che non è parte della tua domanda originale, ma usando SetPixel (..) non è molto efficiente e potrebbe essere un problema se avete intenzione di usarlo in un motore di ray-tracing.

Si potrebbe desiderare di utilizzare i LockBits () metodo, vedere questo risposta e questo per ulteriori dettagli. Essi altra strada da percorrere è quella di accedere ai dati utilizzando il codice C # "non sicuro", che consente di utilizza i puntatori ai dati. Vedi questa domanda per ulteriori informazioni, ho ricevuto una ~ x2 speed-up utilizzando " codice non sicuro".

Non dimenticare di lanciare i vostri numeri interi a doppie. Ad esempio:

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

di riferimento rapido:

 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top