gpt4 book ai didi

c++ - 遍历 2.5D 网格

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:18 30 4
gpt4 key购买 nike

我正在尝试弄清楚如何以高效的方式遍历 2.5D 网格。网格本身是二维的,但网格中的每个单元格都有一个 float 最小/最大高度。要遍历的线由两个 3D 浮点坐标定义。如果进入/退出网格单元格之间的 z 值范围不与该单元格的最小/最大高度重叠,我想停止遍历该线。

我目前正在使用 2D DDA 算法按顺序遍历网格单元(见图),但我不确定在到达每个网格单元时如何计算 z 值。如果可以的话,我可以在进入/离开单元格时根据单元格的最小/最大高度测试 z 值。

有没有办法修改这个算法,允许在输入每个网格单元格时计算 z?或者是否有更好的遍历算法可以让我这样做?

grid

这是我目前使用的代码:

void Grid::TraceGrid(Point3<float>& const start, Point3<float>& const end, GridCallback callback )
{
// calculate and normalize the 2D direction vector
Point2<float> direction=end-start;
float length=direction.getLength( );
direction/=length;

// calculate delta using the grid resolution
Point2<float> delta(m_gridresolution/fabs(direction.x), m_gridresolution/fabs(direction.y));

// calculate the starting/ending points in the grid
Point2<int> startGrid((int)(start.x/m_gridresolution), (int)(start.y/m_gridresolution));
Point2<int> endGrid((int)(end.x/m_gridresolution), (int)(end.y/m_gridresolution));
Point2<int> currentGrid=startGrid;

// calculate the direction step in the grid based on the direction vector
Point2<int> step(direction.x>=0?1:-1, direction.y>=0?1:-1);

// calculate the distance to the next grid cell from the start
Point2<float> currentDistance(((step.x>0?start.x:start.x+1)*m_gridresolution-start.x)/direction.x, ((step.y>0?start.y:start.y+1)*m_gridresolution-start.y)/direction.y);

while(true)
{
// pass currentGrid to the callback
float z = 0.0f; // need to calculate z value somehow
bool bstop=callback(currentGrid, z);

// check if the callback wants to stop or the end grid cell was reached
if(bstop||currentGrid==endGrid) break;

// traverse to the next grid cell
if(currentDistance.x<currentDistance.y) {
currentDistance.x+=delta.x;
currentGrid.x+=step.x;
} else {
currentDistance.y+=delta.y;
currentGrid.y+=step.y;
}
}
}

最佳答案

这似乎是 Bresenham Line Algorithm 的 3D 扩展会工作。您将迭代 X 并独立跟踪线段的 Y 和 Z 分量的误差,以确定每个对应 X 值的 Y 和 Z 值。当 Z 中的累积误差达到某个临界水平时,您就可以停止,这表明它超出了您的最小值/最大值。

关于c++ - 遍历 2.5D 网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11694886/

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