Мне нужно было создать изображение, которое представляет собой черный круг, черное существо (0, 0, 0) и белое существо (1, 1, 1), но я продолжаю получать полностью черное изображение. Вот все, что мой код:Почему мое изображение, прорисованное лучом, полностью черное?
#include "cast.h"
#include "collisions.h"
#include <stdio.h>
#include "math.h"
int cast_ray(struct ray r, struct sphere spheres[], int num_spheres)
{
int isFound;
struct maybe_point mp;
isFound = 0;
for (int i = 0; i < num_spheres; i++)
{
mp = sphere_intersection_point(r, spheres[i]);
if (mp.isPoint == 1)
{
isFound = 1;
}
else
{
isFound = 0;
}
}
return isFound;
}
void print_pixel(double a, double b, double c)
{
int i, j, k;
i = a * 255;
j = b * 255;
k = c * 255;
printf("%d %d %d ", i, j, k);
}
void cast_all_rays(double min_x, double max_x, double min_y, double max_y,
int width, int height, struct point eye,
struct sphere spheres[], int num_spheres)
{
double width_interval, height_interval, y, x;
int intersect;
width_interval = (max_x - min_x)/width;
height_interval = (max_y - min_y)/height;
for (y = max_y; y > min_y; y = y - height_interval)
{
for (x = min_x; x < max_x; x = x + width_interval)
{
struct ray r;
r.p = eye;
r.dir.x = x;
r.dir.y = y;
r.dir.z = 0.0;
intersect = cast_ray(r, spheres, num_spheres);
if (intersect != 0)
{
print_pixel (0, 0, 0);
}
else
{
print_pixel (1, 1, 1);
}
}
Я уже имел функции, которые я знаю, являются правильными, которые находят, пересекает ли не луч со сферой. Функция, которую я использовал для нахождения точек пересечения, была в функции cast_ray.
sphere_intersection_point(r, spheres[i]);
Функция print_pixel переводит целые значения путем умножения их максимальное значение цвета, которое 255.
И функция cast_all_rays отбрасывает лучи во всю сцену от наших глаз (проходящей через все х координаты перед изменением y). Если луч пересекается со сферой, пиксель является черным, таким образом, образуя черный круг в конце.
А вот пределы для х, у, и радиус (Примечание: Я использую FORMAT PPM):
Eye at <0.0, 0.0, -14.0>.
A sphere at <1.0, 1.0, 0.0> with radius 2.0.
A sphere at <0.5, 1.5, -3.0> with radius 0.5.
min_x at -10, max_x at 10, min_y of -7.5, max_y at 7.5, width=1024, and height=768.
Мне нужно, чтобы сформировать изображение черного круга, но я держу получив изображение, полностью черное. У меня такое чувство, что проблема лежит внутри функции cast_all_rays, но я просто не могу найти, что это такое. Помощь приветствуется! Благодарю.
И только в случае, если что-то пошло не так с моего тестирования, вот мой test.c файл для cast_all_rays:
#include "collisions.h"
#include "data.h"
#include "cast.h"
#include <stdio.h>
void cast_all_rays_tests(void)
{
printf("P3\n");
printf("%d %d\n", 1024, 768);
printf("255\n");
double min_x, max_x, min_y, max_y;
int width, height;
struct point eye;
struct sphere spheres[2];
eye.x = 0.0;
eye.y = 0.0;
eye.z = -14.0;
spheres[0].center.x = 1.0;
spheres[0].center.y = 1.0;
spheres[0].center.z = 0.0;
spheres[0].radius = 2.0;
spheres[1].center.x = 0.5;
spheres[1].center.y = 1.5;
spheres[1].center.z = -3.0;
spheres[1].radius = 0.5;
min_x = -10;
max_x = 10;
min_y = -7.5;
max_y = 7.5;
cast_all_rays(min_x, max_x, min_y, max_y, width, height, eye, spheres, num_spheres);
}
int main()
{
cast_all_rays_tests();
return 0;
}
Да, изображение по-прежнему остается черным. :(Я выложу пределы выше. – Karen
Проверьте мое последнее изменение о нулевом направлении z. – paddy
Хм ... ох! В нем говорится, что границы прямоугольника вида - min_x, max_x, min_y и max_y (z - 0). Подождите минуту, поэтому координата z, на которую они ссылаются, на самом деле НЕ является координатой z направления луча? – Karen