2013-02-18 165 views
5

我创建了一个小球体模型作为点的立方体。点具有坐标:仅将球体变形为球体

{0 < = X < = 9,0 < = Y < = -9,0 < = Z = < -9}

立方体的内部是空的,所以点存在于立方体的表面上。空的空格在(100,100,100)处表示为点,当我进行绘制循环时,我忽略与它们相匹配的点,这就是为什么在我将在后面发布的代码中将这些作为做某些事情的条件或不这样做。

目标是获取立方体的点,并对它们应用变换以将它们映射到球体上。

This is the set of equations used to transform the points.

这是创建为立方体的位置阵列然后以创建球体位置的阵列的代码:

// initialize cube array 
points = new Matrix[10, 10, 10]; 

for (int i = 0; i < 10; i++) 
{ 
    for (int j = 0; j < 10; j++) 
    { 
     for (int k = 0; k < 10; k++) 
     { 
      points[i, j, k] = Matrix.CreateTranslation(new Vector3(100, 100, 100)); 
     } 
    } 
} 

for (int i = 0; i < 10; i++) 
{ 
    for (int j = 0; j < 10; j++) 
    { 
     points[i, j, 0] = Matrix.CreateTranslation(new Vector3(i, -j, 0)); 
     points[i, j, 9] = Matrix.CreateTranslation(new Vector3(i, -j, -9)); 
    } 
} 

for (int j = 0; j < 10; j++) 
{ 
    for (int k = 0; k < 10; k++) 
    { 
     points[0, j, k] = Matrix.CreateTranslation(new Vector3(0, -j, -k)); 
     points[9, j, k] = Matrix.CreateTranslation(new Vector3(9, -j, -k)); 
    } 
} 

for (int i = 0; i < 10; i++) 
{ 
    for (int k = 0; k < 10; k++) 
    { 
     points[i, 0, k] = Matrix.CreateTranslation(new Vector3(i, 0, -k)); 
     points[i, 9, k] = Matrix.CreateTranslation(new Vector3(i, -9, -k)); 
    } 
} 
// end cube array initialization 

// create sphere array 
double d; 
double theta; 
double phi; 
double r = 10; 

spherePoints = new Matrix[10, 10, 10]; 
for (int i = 0; i < 10; i++) 
{ 
    for (int j = 0; j < 10; j++) 
    { 
     for (int k = 0; k < 10; k++) 
     { 
      if (points[i, j, k] != Matrix.CreateTranslation(new Vector3(100, 100, 100))) 
      { 
       d = Math.Sqrt(Math.Pow(i, 2) + Math.Pow(-j, 2) + Math.Pow(-k, 2)); 
       theta = Math.Acos(-k/d); 
       phi = Math.Atan2(-j, i); 

       spherePoints[i, j, k] = Matrix.CreateTranslation(new Vector3((float)(r * Math.Sin(theta) * Math.Cos(phi)), 
                      (float)(r * Math.Sin(theta) * Math.Sin(phi)), 
                      (float)(r * Math.Cos(theta)))); 
      } 
      else 
       spherePoints[i, j, k] = Matrix.CreateTranslation(new Vector3(100, 100, 100)); 
     } 
    } 
} 
// end creation of sphere array 

立方: enter image description here

不是球体。 ..: enter image description here

从什么我可以告诉我完全遵循了公式,但它似乎只能生成球体的八分之一。沿边缘也出现了奇怪的分组。

+6

@Leonardo对不起,它在这里说什么? http://stackoverflow.com/faq#dontask 本网站的目的是获得编程问题的帮助。我没有要求任何人为我做作业。我试图找出我的代码中怪异行为的原因。是否在寻求帮助的网站规则上寻求帮助? – Portaljacker 2013-02-18 17:17:17

+0

关于生成球面点的算法有很多。 http://math.stackexchange.com/questions/299981/generating-evenly-distributed-points-on-a-sphere http://gamedev.stackexchange.com/questions/16585/how-do-you-programmatically-generate -a-sphere http://stackoverflow.com/questions/4349727/generating-points-uniformly-on-a-sphere – Pete 2013-02-18 17:31:19

+0

@Pete这些似乎都是关于制作一个球体。这项任务的目标是将立方体的点变形为球体上的位置。这些链接似乎是指从头开始制作一个球体。 – Portaljacker 2013-02-18 17:34:29

回答

3

问题是,你只在一个“象限”(或者“八角形”更合适)绘制你的立方体,所以你只能获得球体的1/8。

而不是让你的立方体从[0,9],[-9,0],[-9,0],将其集中在原点。

一旦你的立方体从[-5,5],[-5,5],[-5,5]变成了球形计算就没问题。

只给一点如何,这是问题的更多的理解:

  • 你的答案将会有多少象限是当你评估ACOS(Z/d)中,因为d总是正和z总是消极的?
  • 当你评估Atan(y,x)时,你的答案会有多少象限,因为y总是负数,x总是负数?

在8个可能的象限组合中,只填充一个。

+0

所以我的立方体现在从所有轴上的[-5,5]开始',并且我从转换部分中删除了负号。虽然我仍然得到一个象限,但看起来更圆润。 http://i.imgur.com/UmGfins.png http://pastebin.com/6iK2rmbs – Portaljacker 2013-02-18 18:39:10

+0

修正了它,我的球体部分没有以正确的方式适应新的点。 – Portaljacker 2013-02-18 19:01:15

+0

好,因为我没有发现你的贴有任何问题。 :-)虽然你说的是什么意思? – 2013-02-18 19:02:11