Я хочу реализовать функцию для вокселизации модели треугольной сетки. Поскольку мне нужно пройти каждый треугольник, я хочу использовать Openmp для ускорения распараллеливания. Когда количество треугольников велико, использование Openmp эффективно, но когда количество треугольников мало, стоимость включения Openmp слишком высока. Поэтому я хочу динамически выбирать, использовать ли Openmp в зависимости от количества треугольников, как это реализовать в коде и можно ли этого добиться без простого if else, ведь две части кода практически идентичны, Openmp содержит только две дополнительные инструкции, поэтому я избегаю дублирования кода.
std::shared_ptr voxelizeInSurface(const hive3DModel::CTriangleMesh& vTriangleMesh, double vVoxelSize)
{
_ASSERTE(vVoxelSize > 0);
Eigen::AlignedBox3d BoundBox;
for (auto it = vTriangleMesh.vertexBegin(); it != vTriangleMesh.vertexEnd(); it++)
{
BoundBox.extend(it->getPosition());
}
Eigen::Vector3d MinBound = BoundBox.min().array() - vVoxelSize / 2;
auto pVoxelGrid = std::make_shared(vVoxelSize, MinBound);
const Eigen::Vector3d HalfVoxel(vVoxelSize / 2, vVoxelSize / 2, vVoxelSize / 2);
int NumTriangles = vTriangleMesh.getNumTriangles();
double InverseVoxelSize = 1 / vVoxelSize;
#pragma omp parallel for num_threads(8)
for (int i = 0; i < NumTriangles; i++)
{
const Eigen::Vector3i& Indexs = vTriangleMesh.getTriangle(i);
const Eigen::Vector3d& A = vTriangleMesh.getVertex(Indexs[0]).getPosition(),
B = vTriangleMesh.getVertex(Indexs[1]).getPosition(),
C = vTriangleMesh.getVertex(Indexs[2]).getPosition();
Eigen::Vector3d TriangleMinBound, TriangleMaxBound;
TriangleMinBound = A.cwiseMin(B).cwiseMin(C);
TriangleMaxBound = A.cwiseMax(B).cwiseMax(C);
Eigen::Vector3i MinIndex, MaxIndex;
MinIndex = Eigen::floor(((TriangleMinBound - MinBound) * InverseVoxelSize).array()).cast();
MaxIndex = Eigen::ceil(((TriangleMaxBound - MinBound) * InverseVoxelSize).array()).cast();
for (int x = MinIndex[0]; x
Подробнее здесь: https://stackoverflow.com/questions/785 ... ck-in-code