2016-10-17 4 views
0

На данный момент у меня есть это:Как прирастить два различных значения с для петель в C++

Shape* shapeArray[12]; 
for (int i = 0; i < vertices.size(); i += 3) { 
    for (int j = 0; j < sizeof(shapeArray)/sizeof(shapeArray[0]); j++) { 
     shapeArray[j] = new Triangle(vertices[i], vertices[i + 1], vertices[i + 2], vec3(0.8, 0.0, 1.0)); 
    } 
} 

Я пытаюсь создать куб из треугольников. Я хочу, чтобы увеличить значение J на ​​1 каждый раз и увеличивает значение я на 3 каждый раз, в результате чего-то вроде этого (если бы это было жестко):

Shape* shapeArray[12]; 
shapeArray[0] = new Triangle(vertices[0], vertices[1], vertices[2], vec3(0.8, 0.0, 1.0));  
shapeArray[1] = new Triangle(vertices[3], vertices[4], vertices[5], vec3(0.8, 0.0, 1.0));  
shapeArray[2] = new Triangle(vertices[6], vertices[7], vertices[8], vec3(0.8, 0.0, 1.0)); 
shapeArray[3] = new Triangle(vertices[9], vertices[10], vertices[11], vec3(0.8, 0.0, 1.0)); 
shapeArray[4] = new Triangle(vertices[12], vertices[13], vertices[14], vec3(0.8, 0.0, 1.0)); 
shapeArray[5] = new Triangle(vertices[15], vertices[16], vertices[17], vec3(0.8, 0.0, 1.0)); 
shapeArray[6] = new Triangle(vertices[18], vertices[19], vertices[20], vec3(0.8, 0.0, 1.0)); 
shapeArray[7] = new Triangle(vertices[21], vertices[22], vertices[23], vec3(0.8, 0.0, 1.0)); 
shapeArray[8] = new Triangle(vertices[24], vertices[25], vertices[26], vec3(0.8, 0.0, 1.0)); 
shapeArray[9] = new Triangle(vertices[27], vertices[28], vertices[29], vec3(0.8, 0.0, 1.0)); 
shapeArray[10] = new Triangle(vertices[30], vertices[31], vertices[32], vec3(0.8, 0.0, 1.0)); 
shapeArray[11] = new Triangle(vertices[33], vertices[34], vertices[35], vec3(0.8, 0.0, 1.0)); 

Однако это не дает мне желаемому результат. Я получаю 3 лота значения j, следовательно, не правильно рисуя куб.

Как я могу решить эту проблему с помощью циклов? Или мне нужно будет перейти от использования массива для хранения треугольников. Спасибо.

+1

i не изменяется в вашей j-петле; похоже, что вам не нужен внутренний цикл, но может уйти с просто увеличивающим индекс, который вы хотите установить – UKMonkey

ответ

1
for (int i= 0, j= 0; i < vertices.size(); i+= 3, ++j) { 
... 
} 

Что-то вроде этого?

+0

Удаление 'i' из управления контуром, и просто' int i = j * 3; 'может быть более чистым. – Yakk

+0

Я не думаю, что цена за менее читаемый человеком код оплачивается этой «оптимизацией». – tony

2

Как указано в комментарии, ваш внутренний цикл не нужен.

вам необходимо выполнить итерацию по массиву и вычислить индекс вершины, когда вы создадите новый треугольник.

Shape* shapeArray[12]; 
for (int i = 0; i < vertices.size(); i += 3) { 
     shapeArray[i] = new Triangle(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2], vec3(0.8, 0.0, 1.0)); 
} 

Будет проще и эффективнее выполнять.

1

Вы можете изменить цикл for так, чтобы индексы shapeArray точно соответствовали индексам вершин. Я вывел это на основе вашей выборки.

Shape* shapeArray[12]; 
for (int i = 0; i < vertices.size(); i += 3) 
{ 

    shapeArray[(int)i/3] = new Triangle(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2], vec3(0.8, 0.0, 1.0)); 

} 

Если приращение i по 3, то вам нужно будет делить на 3 для shapeArray индекса. В этом сценарии вам не нужен внутренний цикл.