Java 线光栅化/4-连接Bresenham

Java 线光栅化/4-连接Bresenham,java,raster,rasterizing,bresenham,Java,Raster,Rasterizing,Bresenham,对于碰撞测试,我需要光栅线。bresenham算法几乎可以按预期工作,但有一个缺陷,即产生一条类似以下的线: 我需要: 我当前的实施(基于): public boolean isInsideLine(intx1,inty1,intx2,inty2){ 最终整数dx=abs(x2-x1),dy=abs(y2-y1); 最终整数sx=x1

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

我需要:

我当前的实施(基于):

public boolean isInsideLine(intx1,inty1,intx2,inty2){
最终整数dx=abs(x2-x1),dy=abs(y2-y1);
最终整数sx=x1

我是否可以使用其他线光栅化算法,或者是否有人知道如何修改bresenham?

谢谢koan,有时候你只是缺少搜索关键字,似乎可以解决这个问题:

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;
}
public boolean isInsideLine(intx1,inty1,intx2,inty2){
最终整数dx=abs(x2-x1),dy=abs(y2-y1);
最终整数sx=x1
也许它会有用,有我的版本用于非整数端点。这是一种
GridMap
类的方法,我使用该方法对几何形状进行空间索引,以加速二维地图中的碰撞检测

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 );
    }
};
intgridmap::insertLine(intlineid、双ax、双ay、双bx、双by){
//获取GridMap中端点的索引
int ix=getIx(ax);
int-iy=getIy(ay);
intixb=getIx(bx);
int iyb=getIy(通过);
//将端点插入到GridMap
插入(lineId、ix、iy);
插入(lineId、ixb、iyb);
//光栅线的中心部分
双dx=fabs(bx-ax);
双dy=晶圆厂(Y);
int-dix=(ax
在我看来,Bresenham的原始输出是8-connected,但您需要4-connected。您可以对原始输出进行后处理,以检测对角线链接,然后确定线条最接近的像素。请参阅,了解类似于相同问题的内容。出于兴趣:为什么需要光栅化线条以进行碰撞检测?你不能只计算交点吗?这是(几乎)像素精确的2d碰撞。不起作用。对于初学者,如果起点和终点位于同一网格正方形中,则该线将添加两次到同一网格正方形中。其次,它不适用于水平/垂直线:对于水平线,iy将等于iyb。while循环的内容将永远不会执行:因为
iy!=iyb
永远不会是真的。事实上,这比水平/垂直线不起作用更糟糕。这段代码根本不能正确地画出任何非对角线的线的结尾。越接近水平/垂直,丢失的像素就越多。
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 );
    }
};