对于碰撞测试,我需要光栅线。 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?
答案 0 :(得分:2)
也许它会有用,有非整数终点的版本。这是GridMap
类的一种方法,我用它来对几何形状进行空间索引,以加速2D地图中的碰撞检测。
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 );
}
};
答案 1 :(得分:1)
谢谢你,有时你只是缺少要搜索的关键字,Algorithm for drawing a 4-connected line似乎解决了这个问题:
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;
} else if (e2 < dx) { // else if instead of if
err += dx;
y1 += sy;
}
}
return false;
}