2014-01-17 88 views
1

我有8個頂點只是索引的立方體。我想要獲取每個頂點在歸一化立方體中的位置。在下圖中,假設+ x在右邊,+ y在上面,並且+ z從屏幕出來。 (如果很難看到頂點2,3,6和7在前面)。將頂點0-7映射到3D點?

Polygonise

(忽略邊緣索引)

這是我有:

for (int v = 0; v < 8; v++) { 
    float x, y, z; 

    if(v < 4)         y = -1; 
    else           y = +1; 
    if(v == 1 || v == 2 || v == 5 || v == 6)  x = +1; 
    else           x = -1; 
    if(v == 2 || v == 3 || v == 6 || v == 7)  z = +1; 
    else           z = -1; 
} 

有沒有做到這一點更合乎邏輯的方式,沒有那麼多的邏輯OR值?

+0

您使用哪種語言?請添加相應的標籤! –

+0

@UliKöhler對不起。我認爲這並不重要。 –

+0

它可能很重要,這取決於解決方案;-)快速提示:我會嘗試使用查找表 –

回答

1

您可以使用查找表。 LUTs往往效率很高,但有些人發現它們與直覺相反。

for (int v = 0; v < 8; v++) { 
    int[] lutX = new int[] {-1, -1, -1, -1, 1, 1, 1, 1}; 
    int[] lutY = new int[] {-1, -1, -1, -1, 1, 1, 1, 1}; 
    int[] lutZ = new int[] {-1, -1, 1, 1, -1, -1, 1, 1}; 
    float x = lutX[v]; 
    float y = lutY[v]; 
    float z = lutZ[v]; 
} 

通常你應該在你的函數之外靜態聲明它們。

您可以從您的或基於邏輯的邏輯是這樣推導出的LUT:

If for v==0, the OR-logic adds 1 to X, set lutX[0] to 1. 
Else set lutX[0] to -1 
+0

對不起,我認爲你誤解了這個問題。我試圖將8個頂點映射到立方體上的相應點。沒有給出邊緣。 –

+0

@DantheMan對不起,如果我錯了,我不知道如何理解它。據我的理解,我的代碼示例是從上面代碼示例的完整轉換。我沒有真正檢查你的邏輯。 –

+1

啊,我現在明白了。我不明白關於線條的其他代碼..我認爲你指的是圖上的邊緣。謝謝。這工作完美。 –

0

這個怎麼樣眼線:

float x = 2*((v/2)%2)-1, y = 2*(v/4)-1, z = 2*(v%2)-1; 

測試代碼:

static void Main(string[] args) 
{ 
    Debug.Print("{0,3} {1,3},{2,3},{3,3}", "v", "x", "y", "z"); 
    for(int v=0; v<8; v++) 
    { 
     float x=2*((v/2)%2)-1, y=2*(v/4)-1, z=2*(v%2)-1; 

     Debug.Print("{0,3} {1,3},{2,3},{3,3}", v, x, y, z); 
    } 
} 

結果:

v x, y, z 
0 -1, -1, -1 
1 -1, -1, 1 
2 1, -1, -1 
3 1, -1, 1 
4 -1, 1, -1 
5 -1, 1, 1 
6 1, 1, -1 
7 1, 1, 1