【问题标题】:Drawing a Fractal Pattern composed of Circles Using Java使用 Java 绘制由圆圈组成的分形图案
【发布时间】:2014-02-18 23:43:18
【问题描述】:

上周我一直在处理这个项目,但不知道如何解决它。我觉得我很接近但无法发现我的错误! 我的作业要求我使用 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);  
}

【问题讨论】:

    标签: java recursion graphics geometry fractals


    【解决方案1】:

    一些使用递归的改编版本... 绘制圆,然后通过再次调用相同的函数来绘制它的 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);
    }
    

    【讨论】:

      【解决方案2】:

      您的drawCircles 函数中似乎只有一个drawCircles 调用。这不可能是正确的,因为每次绘制一个圆时,都需要调用递归函数两次。我看到你画了两个圆圈,但这实际上是倒退的。

      要让它工作,你需要画一个圆圈,然后调用递归函数两次。

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

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

      应该可以的。

      【讨论】:

        【解决方案3】:

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

        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);  
        }
        

        【讨论】:

          猜你喜欢
          • 2012-12-27
          • 2021-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多