gpt4 book ai didi

algorithm - 在访问所有单元格的 3D 体素空间中的两点之间走一条线

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:35:39 24 4
gpt4 key购买 nike

我有一个视线问题,需要通过访问两个(非网格对齐)点之间的 3D 体素空间中的所有可能单元格来解决。

我考虑过使用 3D Bresenham 算法,但它会跳过一些单元格。

一个天真的实现可能只是以比体素网格更高的分辨率检查沿线的点,但我希望有一个更智能的解决方案。

有人知道线索吗?

最佳答案

想出了这个,或者看: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);
}

关于algorithm - 在访问所有单元格的 3D 体素空间中的两点之间走一条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16505905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com