您如何将一个立方体变成一个球体?


31

我正在尝试根据article制作一个四边形球,它显示如下结果:

正确

我可以正确生成一个多维数据集:

之前

但是,当我根据此公式转换所有点时(来自上面链接的页面):

式

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

我的球面看起来像这样:

后

如您所见,立方体的边缘仍然伸出太远。如文章所述,多维数据集在所有轴上的范围都从-1+1

任何想法有什么问题吗?


1
您的实现中是否也包含“ x = x ...”问题,或者仅仅是这里?
snake5

8
梦幻般的视觉辅助。谢谢您的加入。
doppelgreener 2012年

2
要回答标题中的问题,您可以将立方体的顶点标准化以使其成为球体。但是,顶点的分布可能与链接方法不同。
msell 2012年

Answers:


27

您写错了公式。

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

您修改原始文件x并将其覆盖。然后,您将y基于原始内容x而不是原始内容进行修改x。然后,z根据这两个版本的修改版本进行修改。

保存原件,并进行以下计算:

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

从此开始使用dx,dy和dz。


哎呀 没在想
Tom Dalling 2012年

您是否有上述程序的示例源?
瓦姆西2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.