java – Line Rasterization / 4-bresenham

前端之家收集整理的这篇文章主要介绍了java – Line Rasterization / 4-bresenham前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于碰撞测试,我需要光栅线. 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 );
    }
};
原文链接:/java/444670.html

猜你在找的Java相关文章