¿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?


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.


Whoops No estaba pensando
Tom Dalling

¿Tiene alguna fuente de muestra para el programa anterior?
Vamsi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.