如何制作Bresenham的线算法?

时间:2017-10-24 21:14:58

标签: java line

我写了一个小程序,它从用户输入x1,y1和x2,y2绘制一条线。由于某种原因,线仅在水平时起作用,但是一旦线应该是垂直的,它只显示黑色像素而不是线。我已经检查了所有内容,我很确定我的算法是正确的,但问题仍然存在。

int x1 = Integer.parseInt(this.jTextFieldX1.getText());
    int y1 = Integer.parseInt(this.jTextFieldY1.getText());
    int x2 = Integer.parseInt(this.jTextFieldX2.getText());
    int y2 = Integer.parseInt(this.jTextFieldY2.getText());

    int xi = x2 > x1 ? 1:-1;
    int yi = y2 > y1 ? 1:-1;

    int dx = Math.abs(x2-x1);
    int dy = Math.abs(y2-y1);

    int xn= x1;
    int yn= y1;
    int pn;
    canvas.showBlackPixel(xn,yn);

    if (dx > dy)
    {
        pn= 2*dy - dx;
        while (xn != x2)
        {    
        if (pn >0)
        {
            xn=xn + xi;
            yn=yn + yi;
            pn=pn + 2*dy - 2*dx;

        }
        else
        {  
               xn = xn + xi;
               pn = pn+ 2*dy;
        }
        canvas.showBlackPixel(xn,yn);
        }
        { 

        if (dy > dx)
    {
        pn= 2*dx - dy;
        while (yn != y2)
        {    
        if (pn > 0)
        {
            xn=xn + xi;
            yn=yn + yi;
            pn=pn + 2*dx - 2*dy;


        }
        else
        {  
               yn = yn + yi;
               pn = pn + 2*dx;
        }
        canvas.showBlackPixel(xn,yn);
        }

        }

        }






    }


}                                      

我该如何解决?

1 个答案:

答案 0 :(得分:1)

问题在于你的陈述被终止,也就是说你的大括号{}混淆了一点。具体而言,减少代码的相关位:

    if (dx > dy) 
    {
        ...
        if (dy > dx) 
        {
            ...
        }
    }

如果您修复了大括号,那么它看起来应该会更好。

    if (dx > dy) 
    {
        ...
    }
    if (dy > dx) 
    {
        ...
    }

但是当dx == dy时,你仍会遇到问题。