gpt4 book ai didi

java - Java中的递归谢尔宾斯基三角形?

转载 作者:行者123 更新时间:2023-12-01 22:22:09 28 4
gpt4 key购买 nike

我需要创建一个程序来绘制 n 阶谢尔宾斯基三角形。为此,我有一些方法。高度、填充三角形和谢尔宾斯基。我在左下角递归打印三角形方面取得了一些进展,但现在我试图在右侧和向上创建三角形,但事情没有成功。我认为我的问题在于 fillTriangle 方法,因为我不确定如何容纳具有不同顶点的所有三角形。

public class Sierpinski {

// Height of an equilateral triangle whose sides are of the specified length.
public static double height(double length) {

double height = length * Math.sqrt(3.0)/2;

return height;

}

// Draws a filled equilateral triangle whose bottom vertex is (x, y)
// of the specified side length.
public static void filledTriangle(double x, double y, double length) {

double x2 = x - x/2;
double y2 = y + height(length)/2;

double x3 = x + (x/2);
double y3 = y + height(length)/2;

double[] xx = {x, x2, x3};
double[] yy = {y, y2, y3};

StdDraw.filledPolygon(xx, yy);

}

// Draws a Sierpinski triangle of order n, such that the largest filled
// triangle has bottom vertex (x, y) and sides of the specified length.
public static void sierpinski(int n, double x, double y, double length)
{
filledTriangle(x, y, length);

if (n == 1) {
System.out.println("Done!");
} else {
filledTriangle(x, height(length)/2, length/2);
x = x/2;
length = length/2;
filledTriangle(x, y, length);
filledTriangle(3*x, y, length);
n--;
sierpinski(n, x, y, length);
}

}

// Takes an integer command-line argument n;
// draws the outline of an equilateral triangle (pointed upwards) of length 1;
// whose bottom-left vertex is (0, 0) and bottom-right vertex is (1, 0); and
// draws a Sierpinski triangle of order n that fits snugly inside the outline.
public static void main(String[] args) {

int length = 1;
int n = Integer.parseInt(args[0]);
double t = Math.sqrt(3.0) / 2.0;
StdDraw.line(0.0, 0.0, 1.0, 0.0);
StdDraw.line(1.0, 0.0, 0.5, height(length));
StdDraw.line(0.5, height(length), 0.0, 0.0);

double x = 0.5;
double y = 0;

sierpinski(n, x, y, length);

}
}

3 阶谢尔宾斯基三角形应如下所示:/image/7dzJm.jpg我的输出是这样的:/image/ZHx0f.jpg

最佳答案

看看这个方法:

public static void sierpinski(int n, double x, double y, double length)
{
filledTriangle(x, y, length);

if (n == 1) {
System.out.println("Done!");
} else {
filledTriangle(x, height(length)/2, length/2);
x = x/2;
length = length/2;
filledTriangle(x, y, length);
filledTriangle(3*x, y, length);
n--;
sierpinski(n, x, y, length);
}

}

您将减少的 n 和减半的 length 传递给 sierpinski,但不更改 xy。这不是一个好方法。最好传递“当前”三角形的坐标,这样您就会知道每次都会绘制 3 倍的三角形。每次绘制 sierpinski 三角形时(除非进程必须结束),您需要调用 sierpinski 3 次。您只有一个 sierpinski 调用,这解释了为什么每个深度上三角形的数量不会增加三倍。您应该知道三角形点的坐标,并知道每条边的一半将是下一个深度中的点。

关于java - Java中的递归谢尔宾斯基三角形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58582824/

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