¿Cómo convertir un cubo en una esfera?

31

Estoy tratando de hacer una esfera cuádruple basada en un artículo , que muestra resultados como este:

correcto

Puedo generar un cubo correctamente:

antes de

Pero cuando convierto todos los puntos de acuerdo con esta fórmula (de la página vinculada anteriormente):

fórmula

    x = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
    y = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
    z = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

Mi esfera se ve así:

después

Como puede ver, los bordes del cubo todavía sobresalen demasiado. El cubo varía de -1a +1en todos los ejes, como dice el artículo.

¿Alguna idea de lo que está mal?

Tom Dalling
fuente
1
¿Su implementación contiene el problema "x = x ..." también o es solo aquí?
serpiente5
8
Fantásticas ayudas visuales. Gracias por incluirlos.
doppelgreener
2
Para responder la pregunta en el título, puede normalizar los vértices del cubo para convertirlo en una esfera. Sin embargo, la distribución de los vértices probablemente será diferente del método vinculado.
msell

Respuestas:

27

Has escrito mal la fórmula.

x = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
y = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
z = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

Modifica el original xy lo sobrescribe. Luego se modifica en ybase no al original xsino al modificado x. Luego se modifica en zfunción de la versión modificada de ambos .

Conserve los originales y calcule esto:

float dx = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
float dy = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
float dz = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

Use dx, dy y dz a partir de entonces.

doppelgreener
fuente
Whoops No estaba pensando
Tom Dalling
¿Tiene alguna fuente de muestra para el programa anterior?
Vamsi