Java 如何递归地画一条线

Java 如何递归地画一条线,java,graphics,recursion,drawing,Java,Graphics,Recursion,Drawing,这是代码。我认为它没有达到我们预期的效果 package lines; import sedgewick.StdDraw; public class Lines { public static boolean equals(double d1, double d2){ if(Math.abs(d2-d1) < 0.00001) return true; return false; } public s

这是代码。我认为它没有达到我们预期的效果

package lines;

import sedgewick.StdDraw;

public class Lines {


    public static boolean equals(double d1, double d2){
        if(Math.abs(d2-d1) < 0.00001)
            return true;
        return false;
    }

    public static void drawLine(double x1, double y1, double x2, double y2) {
        if(equals(x1,x2) && equals(y1,y2))
            return;

        double mid_x = (x2+x1)/2;
        double mid_y = (y2+y1)/2;

        drawLine(x1,y1,mid_x,mid_y);
        drawLine(mid_x+0.001,mid_y+0.001,x2,y2);

        StdDraw.point(mid_x, mid_y);

    }


    /**
     * Code to test the drawLine method visually
     */
    public static void main(String[] args) {
        StdDraw.setPenRadius(0.02);

        //
        // Test the drawing program
        //
        drawLine(0,0,1,1); // lower left to upper right
        drawLine(0,1,1,0); // upper left to lower right

        //
        // Draw rectangles of decreasing width and height
        //
        for (double r = 0.25; r < 0.5; r = r+.005) {
            double s = 1-r;
            drawLine(r,r, r, s);
            drawLine(r, s, s, s);
            drawLine(s, s, s, r);
            drawLine(s, r, r, r);
        }
        System.out.println("done drawing");
    }

}
包装线;
导入sedgewick.StdDraw;
公共类线路{
公共静态布尔等于(双d1,双d2){
if(数学绝对值(d2-d1)<0.00001)
返回true;
返回false;
}
公共静空抽绳(双x1、双y1、双x2、双y2){
如果(等于(x1,x2)和等于(y1,y2))
返回;
双中间x=(x2+x1)/2;
双中间y=(y2+y1)/2;
抽绳(x1、y1、中x、中y);
抽绳(中部x+0.001,中部y+0.001,x2,y2);
标准点(中x,中y);
}
/**
*用于目视测试drawLine方法的代码
*/
公共静态void main(字符串[]args){
标准设定半径(0.02);
//
//测试绘图程序
//
抽绳(0,0,1,1);//从左下到右上
抽绳(0,1,1,0);//从左上到右下
//
//绘制宽度和高度递减的矩形
//
对于(双r=0.25;r<0.5;r=r+0.005){
双s=1-r;
抽绳(r,r,r,s);
抽绳(r、s、s、s);
抽绳(s、s、s、r);
抽绳(s,r,r,r);
}
系统输出打印项次(“完成图纸”);
}
}
这是我无法理解的结果


首先,我想说,我认为你所做的真的很酷

对于实际的答案,我们需要看看Swing是如何绘制内容的。 图片只是一组像素。然而,像素并不是按照你的直觉来排列的。 你会认为是这样的

y
^
|
|
1
|
0--1-----> x
0--1-----> x
|
1
|
|
v
y
public static boolean equals(double d1, double d2){
    if(Math.abs(d2-d1) < 0.1)
        return true;
    return false;
}
事实上,是这样的

y
^
|
|
1
|
0--1-----> x
0--1-----> x
|
1
|
|
v
y
public static boolean equals(double d1, double d2){
    if(Math.abs(d2-d1) < 0.1)
        return true;
    return false;
}
我希望这是清楚的,因为我的ASCII绘图不多。y轴反转,但x轴不反转。大多数人在第一次使用Java绘图时需要通过某种调试来发现这一点

如果我们回顾一下你的代码,我们会发现,如果我们在我画的第二张“图片”中把它形象化,它现在就更有意义了

编辑: 显然我错了,我道歉。 这方面有个问题

drawLine(mid_x+0.001,mid_y+0.001,x2,y2);
我想你应该去掉“+0.001”

然而,这并不是我错的原因。我试图运行您的代码,但出现堆栈溢出错误。在将equals方法更改为类似的内容之后

y
^
|
|
1
|
0--1-----> x
0--1-----> x
|
1
|
|
v
y
public static boolean equals(double d1, double d2){
    if(Math.abs(d2-d1) < 0.1)
        return true;
    return false;
}
公共静态布尔等于(双d1,双d2){
if(数学绝对值(d2-d1)<0.1)
返回true;
返回false;
}

我现在可以运行这个程序了,它给出了完美的结果。我不确定你出了什么问题。

谢谢。我其实不知道。但这对结果有何影响?这个算法有意义吗?它确实会影响结果,试着可视化为r的一个值绘制的线条,然后你就会看到它。算法看起来不错。我想了一下,我不明白。你能给我说清楚吗?
public static void drawLine(double x1, double y1, double x2, double y2){         
        if(equals(x1,x2) && equals(y1,y2))
            return;
        double mid_x = (x2+x1)/2;
        double mid_y = (y2+y1)/2;
        StdDraw.point(mid_x, mid_y);
        drawLine(x1,y1,mid_x,mid_y);
        drawLine(mid_x,mid_y,x2,y2);
}