He encontrado esta imagen en mathoverflow, que me parece muy interesante y me gustaría saber cómo dibujar una imagen con un simple programa de ordenador.
Para calcular el punto racional, puede dibujar una línea desde P_0(0,0,1) y P_1(u,v,0) y calcular la intersección con la esfera de la siguiente manera:
\begin{equation} x=\frac{2u}{u^2+v^2+1};y=\frac{2v}{u^2+v^2+1};z=\frac{u^2+v^2-1}{u^2+v^2+1} \end{equation}
Para la intersección de las coordenadas son números racionales donde
\begin{equation} a=2u;b=2v;c=u^2+v^2-1;d=u^2+v^2+1 \end{equation}
con
\begin{equation} a^2+b^2+c^2=d^2 \end{equation}
Si entiendo correctamente el tipo que ha publicado la imagen que él iba a marcar los puntos en función del valor de d. De modo que un valor de d por debajo de un cierto umbral podría reemplazar el color de los píxeles de color blanco.
Ahora dentro de un programa que sería el bucle a través de todos los píxeles a lo largo de los ejes x y y usando el siguiente algoritmo:
for(int y = 0; y < height; ++y)
{
for(int x = 0; x < width; ++x)
{
// does pixel ray intersect with sphere?
// using orthgraphic projection ( all rays are parallel ) of
// sphere with radius of image height
if(intersect(sphere,x,y))
{
// calculate the distance of the intersection of
// pixel ray and sphere
double z = calc_distance(sphere,x,y);
// the further away the darker the color
rgb_color color = make_color(z);
// calculate d
// the gcd of a,b,c,d will be used to make d as small as possible
int d = calculate_denominator(x,y)
// 100 is made up
if(d < 100)
{
color = white;
}
set_pixel(img,x,y,color);
}
}
}
Podría alguien ayudar en la corrección de mi algoritmo?