2014-01-17 5 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; 
} 

Есть ли более логичный способ сделать это, не так много логического ОША?

+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]; 
} 

Обычно вы должны объявлять их статически вне вашей функции.

Вы можете вывести ТМП из вашего OR на основе логики логики, как это:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^