Я пытался реализовать алгоритм вокселизации, упомянутый в этом ответе . Код для проверки пересечения куб-треугольник, упомянутый в ответе, был только для единичного куба, поэтому я изменил его на более универсальный алгоритм. Я добавил один параметр для координат куба и вычел координаты куба из координат вершин треугольника, чтобы перевести его рядом с кубом.
long t_c_intersection(Triangle3 t,Point3 cubeMiddle)
{
t.v1.x-=cubeMiddle.x;
t.v2.x-=cubeMiddle.x;
t.v3.x-=cubeMiddle.x;
t.v1.y-=cubeMiddle.y;
t.v2.y-=cubeMiddle.y;
t.v3.y-=cubeMiddle.y;
t.v1.z-=cubeMiddle.z;
t.v2.z-=cubeMiddle.z;
t.v3.z-=cubeMiddle.z;
...
Далее я использовал его для вокселизации треугольника. Код выглядит немного запутанным, потому что сами воксели представлены кубами в формате .obj (я знаю, что это неэффективно, но я использую его только для визуализации), но самая важная часть выполняется в 3 вложенных циклах, где функция t_c_intersection () называется.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "triangleCube.c"
#define INSIDE 0
#define OUTSIDE 1
int main() {
float cube[8][3]={{0.0, 0.0, 0.0},{0.0, 0.0, 1.0},
{0.0, 1.0, 0.0},{0.0, 1.0, 1.0},
{1.0, 0.0, 0.0},{1.0, 0.0, 1.0},
{1.0, 1.0, 0.0},{1.0, 1.0, 1.0}};
float faces[12][6]={{1,2,7,2,5,2},{1,2,3,2,7,2},{1,6,4,6,3,6},{1,6,2,6,4,6},
{3,3,8,3,7,3},{3,3,4,3,8,3},{5,5,7,5,8,5},{5,5,8,5,6,5},
{1,4,5,4,6,4},{1,4,6,4,2,4},{2,1,6,1,8,1},{2,1,8,1,4,1}};
Point3 p1={0.0f, 0.0f, 0.0f};
Point3 p2={0.0f, 100.0f, 0.f};
Point3 p3={0.0f,0.0f, 100.0f};
Triangle3 triangle={p1,p2,p3};
float maxX=MAX3(p1.x,p2.x,p3.x);
float maxY=MAX3(p1.y,p2.y,p3.y);
float maxZ=MAX3(p1.z,p2.z,p3.z);
float minX=MIN3(p1.x,p2.x,p3.x);
float minY=MIN3(p1.y,p2.y,p3.y);
float minZ=MIN3(p1.z,p2.z,p3.z);
int numOfFaces=0,counter=0;
FILE *fp1 = fopen("triangle.obj", "wb");
for (int i =minX; i <= maxX; ++i) {
for (int j = minY; j <= maxY; ++j) {
for (int k = minZ; k <= maxZ; ++k) {
Point3 cubeMiddle={i,j,k};
if(t_c_intersection(triangle,cubeMiddle)){
for (int l = 0; l < 8; ++l) {
fprintf(fp1,"v %.1f ",cube[l][0] + cubeMiddle.x );
fprintf(fp1,"%.1f ",cube[l][1] + cubeMiddle.y );
fprintf(fp1,"%.1f\n",cube[l][2] + cubeMiddle.z );
}
numOfFaces ++;
counter++;
}
}
}
}
int face=0;
for (int n = 0; n <numOfFaces ; ++n) {
for (int k = 0; k < 12; ++k) {
fprintf(fp1,"f %.1f/",faces[k][0] + face);
fprintf(fp1,"%.1f ",faces[k][1] + face);
fprintf(fp1,"%.1f/",faces[k][2] + face);
fprintf(fp1,"%.1f ",faces[k][3] + face);
fprintf(fp1,"%.1f/",faces[k][4] + face);
fprintf(fp1,"%.1f\n",faces[k][5] + face);
}
face+=8;
}
return 0;
}
Однако, когда я просматриваю результирующий файл .obj, появляются 2 случайных вокселей . У меня вопрос, почему они там? Я сделал ошибку, когда изменил тест пересечения куб-треугольник? Может ли это быть ошибка с плавающей запятой?