Мой алгоритм вычисляет вершины фигуры в 3-мерном пространстве, используя 2-мерный цикл, повторяющийся по сегментам U и V.
for (LONG i=0; i < info.useg + 1; i++) {
// Calculate the u-parameter.
u = info.umin + i * info.udelta;
for (LONG j=0; j < info.vseg + 1; j++) {
// Calculate the v-parameter.
v = info.vmin + j * info.vdelta;
// Compute the point's position.
point = calc_point(op, &info, u, v);
// Set the point to the object and increase the point-index.
points[point_i] = point;
point_i++;
}
}
Однако массив точек — это одномерный массив, поэтому point_i
увеличивается в каждом цикле. Я знаю, что я мог бы вычислить индекс с помощью point_i = i * info.vseg + j
,
Я хочу, чтобы этот цикл был многопоточным. Моя цель состояла в том, чтобы создать несколько потоков, которые обрабатывают определенный диапазон точек. В теме я бы сделал это так:
for (LONG x=start; x <= end; x++) {
LONG i = // ...
LONG j = // ...
Real u = info.umin + i * info.udelta;
Real v = info.vmin + j * info.vdelta;
points[i] = calc_point(op, &info, u, v);
}
Задача состоит в том, чтобы рассчитать i
а также j
отклонения от линейного индекса точки. Как я могу вычислить i
а также j
когда (ну я думаю):
point_i = i * vsegments + j
Я не могу решить математику, здесь ..
point_i = i * vsegments + j
дает тебе:
i = point_i / vsegments
j = point_i % vsegments
Конечно, ваши петли на самом деле segments + 1
итерации каждая (индексы 0
в segments
), так что вам нужно будет использовать vsegments + 1
вместо vsegments
В качестве примечания: вам действительно нужно объединить циклы в один для многопоточности? Я ожидаю, что во внешнем цикле обычно достаточно итераций, чтобы в любом случае насытить ваши доступные ядра.
Других решений пока нет …