使用Java绘制由圆组成的分形图案

使用Java绘制由圆组成的分形图案,java,recursion,graphics,geometry,fractals,Java,Recursion,Graphics,Geometry,Fractals,上周我一直在做这个项目,不知道如何解决它。我觉得我离得很近,但却看不出我的错误! 我的作业要求我使用Java Graphics类沿着一条假想线画圆。在中心画一个半径为n的圆。然后画两个半径为n/2的圆,其端点与圆的左弧和右弧相交 我已经能够在第一个圆的左右两侧画出两个圆的第二步。然而,我的程序应该递归地绘制四个大小相同的圆。左圆圈左右两侧各有一个圆圈,右圆圈左右两侧各有一个圆圈。我的代码有问题 任何帮助都将不胜感激 package fractalcircles; import java.a

上周我一直在做这个项目,不知道如何解决它。我觉得我离得很近,但却看不出我的错误! 我的作业要求我使用Java Graphics类沿着一条假想线画圆。在中心画一个半径为n的圆。然后画两个半径为n/2的圆,其端点与圆的左弧和右弧相交

我已经能够在第一个圆的左右两侧画出两个圆的第二步。然而,我的程序应该递归地绘制四个大小相同的圆。左圆圈左右两侧各有一个圆圈,右圆圈左右两侧各有一个圆圈。我的代码有问题

任何帮助都将不胜感激

 package fractalcircles;

 import java.awt.*;
 import javax.swing.*;

 public class FractalCircles {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) 
{   //create a MyCanvas object
    MyCanvas canvas1 = new MyCanvas();

    //set up a JFrame to hold the canvas
    JFrame frame = new JFrame();
    frame.setTitle("FractalCircles.java");
    frame.setSize(500,500);
    frame.setLocation(100,100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //add the canvas to the frame as a content panel
    frame.getContentPane().add(canvas1);
    frame.setVisible(true);
}//end main
 }//end class

 class MyCanvas extends Canvas
 {
public MyCanvas()
{} //end MyCanvas() constructor

//this method will draw the initial circle and invisible line
public void paint (Graphics graphics)
{
    int x1,x2,y1,y2; //future x and y coordinates
    int radius=125; //radius of first circle
    int xMid=250, yMid=250; //center point (x,y) of circle

    //draw invisible line
    graphics.drawLine(0,250,500,250);

    //draw first circle
    graphics.drawOval(xMid-radius,yMid-radius,radius*2,radius*2);


    //run fractal algorithm to draw 2 circles to the left and right
   drawCircles(graphics, xMid, yMid, radius);

}

void drawCircles (Graphics graphics, int xMid, int yMid, int radius)
{
    //used to position left and right circles
    int x1 = xMid-radius-(radius/2);
    int y1 = yMid-(radius/2);
    int x2 = xMid+radius-(radius/2);
    int y2= yMid-(radius/2);

    if (radius > 5)
    {
         //draw circle to the left
    graphics.drawOval(x1, y1, (radius/2)*2, (radius/2)*2);

    //draw circle to the right
    graphics.drawOval(x2, y2, (radius/2)*2, (radius/2)*2);
    }

    drawCircles (graphics, xMid, yMid, radius/2);  
}

看起来在
drawCircles
函数中只有一个
drawCircles
调用。这不可能是正确的,因为每次画圆时都需要调用递归函数两次。我看到你画了两个圆,但实际上是倒着画的

要使其工作,需要画一个圆,并调用递归函数两次

以下是您需要更改的内容:

  • 使绘制圆以坐标为中心绘制一个圆
  • 在drawCircle中,调用drawCircle两次,一次使用左圆圈坐标,一次使用右圆圈坐标

应该可以了。

一些使用递归的改编版本。。。 绘制圆,然后通过再次调用相同的函数来绘制其2个子对象

void drawCircles(Graphics graphics, int xMid, int yMid, int radius) {
    // end recursion
    if(radius < 5)
        return;

    // Draw circle
    graphics.drawOval(xMid - radius, yMid - radius, radius * 2, radius * 2);

    // start recursion
    //left
    drawCircles(graphics, xMid-radius, yMid, radius / 2);
    //right
    drawCircles(graphics, xMid+radius, yMid, radius / 2);
}
void绘图圆(图形图形,int-xMid,int-yMid,int-radius){
//结束递归
如果(半径<5)
返回;
//画圈
绘图椭圆(xMid-半径,yMid-半径,半径*2,半径*2);
//开始递归
//左
绘图圆(图形,xMid半径,yMid,半径/2);
//对
绘图圆(图形,xMid+半径,yMid,半径/2);
}

您仅从大圆的每一侧绘制一个圆。您需要更改代码。我只写了一个简短的补丁,但没有测试。祝你好运

void drawCircles (Graphics graphics, int xMid, int yMid, int radius)
{
//used to position left and right circles
int x1 = xMid-radius-(radius/2);
int x2 = xMid+radius-(radius/2);
int x3 = xMid+radius+(radius/2);
int x4 = xMid-radius+(radius/2);
int y = yMid-(radius/2);


if (radius > 5)
{
     //draw 4 circles
   graphics.drawOval(x1, y, (radius/2)*2, (radius/2)*2);
   graphics.drawOval(x2, y, (radius/2)*2, (radius/2)*2);
   graphics.drawOval(x3, y, (radius/2)*2, (radius/2)*2);
   graphics.drawOval(x4, y, (radius/2)*2, (radius/2)*2);
}

//left
drawCircles(graphics, xMid-radius, yMid, radius / 2);
//right
drawCircles(graphics, xMid+radius, yMid, radius / 2);  
}