Алгоритм для преобразования треугольной грани в модель Voxelised

У меня есть следующие вершины: (x1, y1, z1); (x2, y2, z2) и (x3, y3, z3).
Я следовал нижеприведенной оценке:

-> Расчет ограничительной рамки фасета.
Длина ограничительной рамки Максимальная (xmax-xmin, ymax-ymin, zmax-zmin).
xmax, xmin, …., zmin можно вычислить, пройдя по всем вершинам
из
треугольник

-> Теперь, учитывая определенный размер разрешения (ч), я делю свою ограничивающую рамку на
Например, если моя ограничительная рамка имеет длину 10, нет. сеток будет 1000 (10 * 10 * 10).

-> Сейчас я рассматриваю vertex1 и vertex2; vertex2 и vertex3; vertex1 и vertex3 и применять алгоритм Брезенхэма
Теперь я использую следующий алгоритм Брезенхэма по этой ссылке: http://jsfiddle.net/wivlaro/mkaWf/6/

function visitAll(gx0, gy0, gz0, gx1, gy1, gz1, visitor) {

var gx0idx = Math.floor(gx0);
var gy0idx = Math.floor(gy0);
var gz0idx = Math.floor(gz0);

var gx1idx = Math.floor(gx1);
var gy1idx = Math.floor(gy1);
var gz1idx = Math.floor(gz1);

var sx = gx1idx > gx0idx ? 1 : gx1idx < gx0idx ? -1 : 0;
var sy = gy1idx > gy0idx ? 1 : gy1idx < gy0idx ? -1 : 0;
var sz = gz1idx > gz0idx ? 1 : gz1idx < gz0idx ? -1 : 0;

var gx = gx0idx;
var gy = gy0idx;
var gz = gz0idx;

//Planes for each axis that we will next cross
var gxp = gx0idx + (gx1idx > gx0idx ? 1 : 0);
var gyp = gy0idx + (gy1idx > gy0idx ? 1 : 0);
var gzp = gz0idx + (gz1idx > gz0idx ? 1 : 0);

//Only used for multiplying up the error margins
var vx = gx1 === gx0 ? 1 : gx1 - gx0;
var vy = gy1 === gy0 ? 1 : gy1 - gy0;
var vz = gz1 === gz0 ? 1 : gz1 - gz0;

//Error is normalized to vx * vy * vz so we only have to multiply up
var vxvy = vx * vy;
var vxvz = vx * vz;
var vyvz = vy * vz;

//Error from the next plane accumulators, scaled up by vx*vy*vz
// gx0 + vx * rx === gxp
// vx * rx === gxp - gx0
// rx === (gxp - gx0) / vx
var errx = (gxp - gx0) * vyvz;
var erry = (gyp - gy0) * vxvz;
var errz = (gzp - gz0) * vxvy;

var derrx = sx * vyvz;
var derry = sy * vxvz;
var derrz = sz * vxvy;

do {
visitor(gx, gy, gz);

if (gx === gx1idx && gy === gy1idx && gz === gz1idx) break;

//Which plane do we cross first?
var xr = Math.abs(errx);
var yr = Math.abs(erry);
var zr = Math.abs(errz);

if (sx !== 0 && (sy === 0 || xr < yr) && (sz === 0 || xr < zr)) {
gx += sx;
errx += derrx;
}
else if (sy !== 0 && (sz === 0 || yr < zr)) {
gy += sy;
erry += derry;
}
else if (sz !== 0) {
gz += sz;
errz += derrz;
}

} while (true);
}

-> From the above step, I obtain some sample points.I loop through each sample and obtain the grid,in which this sampling point lies.

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

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector