2013-02-18 131 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