对于碰撞测试,我需要光栅线. 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地图中的碰撞检测.
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,iy ); } };