gpt4 book ai didi

java - 检查程序调试

转载 作者:搜寻专家 更新时间:2023-10-31 20:12:26 27 4
gpt4 key购买 nike

所以我完成了一个递归绘制线的程序,该程序采用参数“n”来定义递归的深度。我有 2 个函数,一个绘制相对左侧的线,另一个绘制相对右侧的线。我对其进行了测试,它似乎适用于前 4 个级别,但随后线条变得太小而无法准确表示,或者我的代码出现问题,因为线条之间的中断似乎变得任意。希望有人可以测试我的代码,看看他们是否能找到问题所在。

下图深度为10。

编辑:修复了部分代码,但仍然需要帮助

public class Art
{

//draws the relatively left line
public static void drawLeftLine(double x0, double y0, double x1, double y1)
{
//define new x coordinate for line
//double x2 = (1/3.0)*(x1 - x0);

//color of line
StdDraw.setPenColor(StdDraw.BLUE);


//draw line by adding new x coord to original
StdDraw.line(x0, y0, x1, y1);

}
//draw relatively right line
public static void drawRightLine(double x0, double y0, double x1, double y1)
{
//define new x coord for line
//double x2 = (2/3.0)*(x1 - x0);

//color of line
StdDraw.setPenColor(StdDraw.BLUE);


//draw line by adding new x coord to original
StdDraw.line(x0, y0, x1, y1);

}

public static void cantor(int n, double x0, double y0, double x1, double y1)
{
if (n == 0)
return;

drawLeftLine(x0, y0, x1, y1);
drawRightLine(x0, y0, x1, y1);

y0 = y0 - 0.1;
y1 = y1 - 0.1;



cantor(n-1, x0, y0, x0 + ((x1 - x0))/3.0, y1); //left
cantor(n-1, (2.0/ 3) * (x1 - x0) + x0, y0, x1, y1); //right

}

public static void main(String[] args)
{
//change n into integer (depth)
int n = Integer.parseInt(args[0]);

//specify inital values for line
double x0 = 0;
double y0 = 0.9;
double x1 = 0.9;
double y1 = 0.9;



//recursive function cantor
cantor(n, x0, y0, x1, y1);

}
}

最佳答案

我认为绘图看起来不正确,因为所有漂亮的 double 值都被离散像素近似,导致线段之间出现不必要的重叠(请参阅底部的编辑)。但是,关于您的代码的一些评论:

1) 您不需要 drawLeftLinedrawRightLine 方法,因为目前它们正在绘制完全相同的东西。由于在每个步骤中您都调用了 cantor 两次(针对已删除的内部三分之一的每一侧调用一次),因此对于必须绘制的每个线段,您都需要调用一次 cantor .因此,我会将所有绘图直接放入 cantor 方法中。

2) 由于 y0y1 总是相同的,我会将它们简化为一个 y 变量。

3) 我将计算新的 x0x1 值的数学简化为

double third = (x1 - x0) / 3;
cantor(n - 1, x0, x0 + third, y); // left
cantor(n - 1, x1 - third, x1, y); // right

4) 不是每次都将 y 值递减 0.1,您应该有一个全局变量来决定应该递减的量(否则,如果您尝试 n > 10 事情就会崩溃)。该值可以设置为 1.0/n

5) 不需要每次画笔都设置笔的颜色。您可以在 main 方法中设置一次。

6) StdDraw 已经在您绘制的图片周围设置了边框,因此无需从 0.9 开始坐标 - 您可以使用 1 代替。

按照这些建议,代码将如下所示:

private static double yIncrement;

public static void cantor(int n, double x0, double x1, double y) {
if (n == 0)
return;

StdDraw.line(x0, y, x1, y);

y = y - yIncrement;

double third = (x1 - x0) / 3;
cantor(n - 1, x0, x0 + third, y); // left
cantor(n - 1, x1 - third, x1, y); // right

}

public static void main(String[] args) {
//change n into integer (depth)
int n = Integer.parseInt(args[0]);

// specify inital values for line
double x0 = 0;
double x1 = 1;
double y = 1;

yIncrement = 1.0 / n;
StdDraw.setPenColor(Color.BLUE);

// recursive function cantor
cantor(n, x0, x1, y);
}

编辑:尝试使用 StdDraw Canvas 大小、 Canvas 缩放设置和线段端点舍入模式,您可以获得稍微好一点的图片(下面的代码生成的图片看起来基本正确8级)

private static double yIncrement;

public static void cantor(int n, double x0, double x1, double y) {
if (n == 0)
return;

x0 = Math.ceil(x0);
x1 = Math.floor(x1);

StdDraw.line(x0, y, x1, y);

y = y - yIncrement;

double third = (x1 - x0) / 3;
cantor(n - 1, x0, x0 + third, y); // left
cantor(n - 1, x1 - third, x1, y); // right

}

public static void main(String[] args) {
// change n into integer (depth)
int n = Integer.parseInt(args[0]);

int width = 1920;
int height = 1080;

StdDraw.setCanvasSize(width, height);

// specify inital values for line
double x0 = 0;
double x1 = width;
double y = 1;

yIncrement = 1.0 / n;
StdDraw.setPenColor(Color.BLUE);
StdDraw.setXscale(0, width);

// recursive function cantor
cantor(n, x0, x1, y);
}

要绝对正确地显示下至第十层的所有内容,您需要 3^9 像素(19K 像素)的宽度。对于第 9 级,即 3^8 = 6K。对于第 8 级,它是 3^7 = 2k,这就是为什么它在 1.9K 像素宽度和整数舍入下看起来几乎是正确的。

关于java - 检查程序调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19181845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com