Вы не указали типы для других переменных - в частности, какие типы camera.fov_x
и camera.fov_y
? Если они оба целые, то строки, инициализирующие angx
и angy
, будут оцениваться с использованием целочисленной арифметики.
Это можно исправить, применив один из операндов:
double angy = ((double) camera.fov_y / h) * iy;
Переменные fovy
и fovx
уже удваиваются, но это не проблема.
Не могли бы вы привести полный пример этого, который мы можем скомпилировать и протестировать сами?
РЕДАКТИРОВАТЬ: редактирование Koistya Navin является излишним. Вам нужен только один операнд выражения, чтобы быть двойным, чтобы все это было вычислено с использованием двойной арифметики. (Это должно быть правильное выражение, хотя - если вы сделаете (a/b) * c
и приведете c
к двойному, умножение будет выполнено с двойной арифметикой, но a / b все равно может быть выполнено как целые числа.)
Вот список, соответствующим образом измененный, чтобы убедиться, что двойная арифметика используется везде, где она должна быть:
// 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();
}