Bir küpü küreye nasıl çevirirsiniz?


31

Böyle bir sonuç gösteren bir makaleye dayanarak dört küre oluşturmaya çalışıyorum :

doğru

Doğru bir küp oluşturabilirim:

önce

Ancak tüm noktaları bu formüle göre dönüştürdüğümde (yukarıda bağlantı verilen sayfadan):

formül

    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));

Kürem şuna benziyor:

sonra

Gördüğünüz gibi, küpün kenarları hala çok fazla düştü. Küp arasında değişmektedir -1için +1makale yazdığı gibi, bütün eksenlerde.

Yanlış olan ne varsa?


1
Uygulamanız da "x = x ..." sorunu içeriyor mu, yoksa burada mı?
yılan5

8
Harika görsel yardımcılar. Bunları dahil ettiğiniz için teşekkür ederim .
doppelgreener

2
Başlıktaki soruyu yanıtlamak için, bir küre yapmak için küpün köşelerini normalleştirebilirsiniz. Köşelerin dağılımı muhtemelen bağlantılı yöntemden farklı olacaktır.
msell

Yanıtlar:


27

Formülü yanlış yazdın.

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));

Orijinali değiştirir xve üzerine yazarsınız. Sonra, değiştirmek yorijinal değil tabanlı xfakat değiştirilmiş x. Sonra ikisinin dez değiştirilmiş versiyonuna bağlı olarak değişiklik yapabilirsiniz .

Orijinalleri koruyun ve bunu hesaplayın:

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));

Bundan sonra dx, dy ve dz kullanın.


Whoops. Düşünmüyordu.
Tom Dalling

Yukarıdaki program için örnek bir kaynağınız var mı?
Vamsi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.