Алгоритм вокселизации, генерирующий случайные воксели - PullRequest
0 голосов
/ 29 марта 2020

Я пытался реализовать алгоритм вокселизации, упомянутый в этом ответе . Код для проверки пересечения куб-треугольник, упомянутый в ответе, был только для единичного куба, поэтому я изменил его на более универсальный алгоритм. Я добавил один параметр для координат куба и вычел координаты куба из координат вершин треугольника, чтобы перевести его рядом с кубом.

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 случайных вокселей . У меня вопрос, почему они там? Я сделал ошибку, когда изменил тест пересечения куб-треугольник? Может ли это быть ошибка с плавающей запятой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...