Banach分形曲线Java-递归
我有以下Banach分形问题: 可以使用以下分形规则生成所谓的Banach曲线:Banach分形曲线Java-递归,java,recursion,curve,fractals,Java,Recursion,Curve,Fractals,我有以下Banach分形问题: 可以使用以下分形规则生成所谓的Banach曲线: 画一个圆圈 画9个小圆圈,每个圆圈都有一个半径⅓ 原版的 圆圈其中一个较小的圆的中心应与原始圆的中心相同。其余部分的中心 8个较小的圆应沿原始圆的圆周等距分布 对每个较小的圆圈重复步骤b 注:以点(x,y)为中心半径r的圆是所有点的集合 (x+r·cos(t),y+r·sin(t)),其中0≤ T≤ 2π,t以弧度表示。我可以使用Math.toRadians() 准则: 仅限递归解决方案,不允许循环 没有导入&没
Math.toRadians()
准则:
- 仅限递归解决方案,不允许循环
- 没有导入&没有列表(因此没有地图或其他)&没有
?
- 我只能使用函数
和帮助函数public static void banachCurve(int n)
private static void banachCurve(double x,double y,double r,int n)
- 只能使用StdDraw从中绘制或调用其他函数,不允许使用其他Std类
public static void banachCurve(int n) {
banachCurve (0.5,0.5,1,n);
}
private static void banachCurve(double x, double y, double r, int n) {
if (n == 0) {
return;
}
double d = (r/3);
StdDraw.circle (x,y,d);
// StdDraw.ellipse(x, y, r, r);
banachCurve (x + d, y, d, n - 1); // centre
banachCurve (x + d+ d, y+d, d, n--); // left
banachCurve (x , y + d, d, n--); // right
banachCurve (x+d , y +d+ d, d, n--);
banachCurve (x+d , y +d, d, n--);
}
我的输出:
Banach曲线的阶段:
每次调用
n--
时,都将n
传递给函数,然后在下次调用时将其递减1。相反,您需要将n-1
传递给每个调用,因为调用本身将在其自己的递归调用中进一步递减n
,最终在0
处停止,正如您正确地所做的那样
对于四个基点,使用(x+d,y)
、(x,y+d)
、(x-d,y)
和(x,y-d)
可以正确工作,但是对于四个对角点,需要使用毕达哥拉斯方法的平方根(Math.sqrt
),或者正弦和余弦(Math.sin
和Math.cos
)用于三角法。使用(x+d,y+d)
等将它们放置在正方形上
假设x
和y
标记圆的中心,则函数将变为:
private static void banachCurve(final double x, final double y, final double r, final int n) {
if (n == 0) {
return;
}
final double d = r / 3;
StdDraw.circle (x, y, d);
banachCurve (x, y, d, n - 1); // centre
banachCurve (x, y + d, d, n - 1); // north
banachCurve (x + d, y, d, n - 1); // east
banachCurve (x, y - d, d, n - 1); // south
banachCurve (x - d, y, d, n - 1); // west
// Get the diagonal radius for a point at 45 degrees on the circle
final double diagD = Math.cos(Math.toRadians(45)) * d;
banachCurve (x + diagD, y + diagD, d, n - 1); // north-east
banachCurve (x + diagD, y - diagD, d, n - 1); // south-east
banachCurve (x - diagD, y - diagD, d, n - 1); // south-west
banachCurve (x - diagD, y + diagD, d, n - 1); // north-west
}
以下是banachCurve(0.5,0.5,1,6)的输出;
:
每次调用
n--
时,您都会将n
传递给函数,然后在下一次调用中将其递减一。相反,您需要将n-1
传递给每个调用,因为调用本身将在其自身的递归调用中进一步递减n
,最终在0
处停止,正如您正确所做的那样。
对于四个基点,使用(x+d,y)
、(x,y+d)
、(x-d,y)
和(x,y-d)
可以正确工作,但是对于四个对角点,需要使用毕达哥拉斯方法的平方根(Math.sqrt
),或者正弦和余弦(Math.sin
和Math.cos
)用于三角法。使用(x+d,y+d)
等将它们放置在正方形上
假设x
和y
标记圆的中心,则函数将变为:
private static void banachCurve(final double x, final double y, final double r, final int n) {
if (n == 0) {
return;
}
final double d = r / 3;
StdDraw.circle (x, y, d);
banachCurve (x, y, d, n - 1); // centre
banachCurve (x, y + d, d, n - 1); // north
banachCurve (x + d, y, d, n - 1); // east
banachCurve (x, y - d, d, n - 1); // south
banachCurve (x - d, y, d, n - 1); // west
// Get the diagonal radius for a point at 45 degrees on the circle
final double diagD = Math.cos(Math.toRadians(45)) * d;
banachCurve (x + diagD, y + diagD, d, n - 1); // north-east
banachCurve (x + diagD, y - diagD, d, n - 1); // south-east
banachCurve (x - diagD, y - diagD, d, n - 1); // south-west
banachCurve (x - diagD, y + diagD, d, n - 1); // north-west
}
以下是banachCurve(0.5,0.5,1,6)的输出;
:
如果要将
Math.cos()
拖到图片中,a la是当前公认的答案,为什么不全力以赴,使用正弦和余弦绕圆圈移动:
private static void banachCurve(double x, double y, double r, int n) {
if (n == 0) {
return;
}
double d = r / 3;
StdDraw.circle (x, y, d);
banachCurve (x, y, d, n - 1); // center
for (double angle = 0; angle < 360; angle += 45) {
double theta = Math.toRadians(angle);
double dx = x + d * Math.cos(theta);
double dy = y + d * Math.sin(theta);
banachCurve (dx, dy, d, n - 1);
}
}
private静态void-banachCurve(双x,双y,双r,int-n){
如果(n==0){
返回;
}
双d=r/3;
标准圆(x,y,d);
banach曲线(x,y,d,n-1);//中心
用于(双角度=0;角度<360;角度+=45){
双θ=数学环面(角度);
双dx=x+d*Math.cos(θ);
双dy=y+d*Math.sin(θ);
banach曲线(dx,dy,d,n-1);
}
}
banachCurve(0.5,0.5,1,3)的输出;
这种方法可以很容易地测试@tucuxi的建议,将周围的八个圆圈改为六个。只需将for
循环中的增量角度从45增加到60:
虽然我不能说这是对原始设计的改进。尽管考虑到这种代码设计,七个周边的圆圈同样微不足道,但它吸引了人们的眼球:
如果要将
Math.cos()
拖到图片中,a la是当前公认的答案,为什么不全力以赴,使用正弦和余弦绕圆圈移动:
private static void banachCurve(double x, double y, double r, int n) {
if (n == 0) {
return;
}
double d = r / 3;
StdDraw.circle (x, y, d);
banachCurve (x, y, d, n - 1); // center
for (double angle = 0; angle < 360; angle += 45) {
double theta = Math.toRadians(angle);
double dx = x + d * Math.cos(theta);
double dy = y + d * Math.sin(theta);
banachCurve (dx, dy, d, n - 1);
}
}
private静态void-banachCurve(双x,双y,双r,int-n){
如果(n==0){
返回;
}
双d=r/3;
标准圆(x,y,d);
banach曲线(x,y,d,n-1);//中心
用于(双角度=0;角度<360;角度+=45){
双θ=数学环面(角度);
双dx=x+d*Math.cos(θ);
双dy=y+d*Math.sin(θ);
banach曲线(dx,dy,d,n-1);
}
}
banachCurve(0.5,0.5,1,3)的输出;
这种方法可以很容易地测试@tucuxi的建议,将周围的八个圆圈改为六个。只需将for
循环中的增量角度从45增加到60:
虽然我不能说这是对原始设计的改进。尽管考虑到这种代码设计,七个周边的圆圈同样微不足道,但它吸引了人们的眼球:
谢谢,但是对于n=6(即图),每次输出5圈,它只关注中心圆,而不是舞台2@Yuki1112我刚刚测试了我自己的代码(我修复了答案中的
diagD
计算),它对我很有效。不过,谢谢你