gpt4 book ai didi

java - 线光栅化/4-连接 Bresenham

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:48 27 4
gpt4 key购买 nike

对于碰撞测试,我需要光栅化一条线。 bresenham 算法几乎可以按预期工作,但有一个缺陷,即生成如下一行:

我需要:

我当前的实现(基于 http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Simplification ):

public boolean isInsideLine(int x1, int y1, int x2, int y2) {
final int dx = abs(x2 - x1), dy = abs(y2 - y1);
final int sx = x1 < x2 ? 1 : -1, sy = y1 < y2 ? 1 : -1;
int err = dx - dy;

while (true) {
if (isInside(x1, y1)) //Lookup in pixel array
return true;
if (x1 == x2 && y1 == y2)
break;
final int e2 = err << 1;
if (e2 > -dy) {
err -= dy;
x1 += sx;
}
if (e2 < dx) {
err += dx;
y1 += sy;
}
}
return false;
}

有没有我可以使用的其他线栅格化算法,或者有谁知道如何修改 bresenham?

最佳答案

也许它会有用,有我的非整数端点版本。它是 GridMap 类的一个方法,我用它来对几何形状进行空间索引,以加速 2D map 中的碰撞检测。

int GridMap::insertLine( int lineId, double ax, double ay, double bx, double by ){
// get index of endpoints in GridMap
int ix = getIx( ax );
int iy = getIy( ay );
int ixb = getIx( bx );
int iyb = getIy( by );
// insert endpoints to GridMap
insert( lineId, ix, iy );
insert( lineId, ixb, iyb );
// raster central part of the line
double dx = fabs( bx - ax );
double dy = fabs( by - ay );
int dix = ( ax < bx ) ? 1 : -1;
int diy = ( ay < by ) ? 1 : -1;
double x=0, y=0;
while ( ( ix != ixb ) && ( iy != iyb ) ) {
if ( x < y ) {
x += dy;
ix += dix;
} else {
y += dx;
iy += diy;
}
insert( lineId, ix, iy );
}
};

关于java - 线光栅化/4-连接 Bresenham,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13542925/

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