这是代码。我认为它没有达到我们想要的效果。
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");
}
}
这是结果,我无法理解。
答案 0 :(得分:1)
首先,我想说我认为你所做的事情非常酷。
对于实际答案,我们需要了解Swing如何绘制内容。 图片只是一个像素数组。但是,像素并没有按照您的直觉思考方式排列。 你会认为它会是这样的。
y
^
|
|
1
|
0--1-----> x
实际上,就是这样。
0--1-----> x
|
1
|
|
v
y
我希望这很清楚,因为我的ASCII绘图并不多。 y轴反转,但x轴不反转。大多数人需要在第一次使用Java绘图时通过某种调试找到它。
如果我们回顾一下你的代码,我们会发现它现在更有意义,如果我们在第二张“图片”中将其显示出来。
编辑: 显然我错了,道歉。 这一行存在问题。
drawLine(mid_x+0.001,mid_y+0.001,x2,y2);
我认为你应该删除“+0.001”
但是,这不是我错的原因。我试图运行你的代码,我得到堆栈溢出错误。将你的equals方法更改为类似的方法之后。
public static boolean equals(double d1, double d2){
if(Math.abs(d2-d1) < 0.1)
return true;
return false;
}
我现在可以运行程序了,它给出了完美的结果。我不确定你出了什么问题。
答案 1 :(得分:0)
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);
}