我的巴恩斯利蕨太瘦了

时间:2014-08-17 21:36:15

标签: java canvas graphics jframe fractals

我是Java编程的新手,最近我决定为学校的论文选择分形的主题。然而,写我的文章的第一步要求我使用Java代码重新创建Barnsley蕨类植物。当我尝试这个时,与我在网上看到的其他蕨类植物相比,我的巴恩斯利蕨看起来太瘦了。我检查了维基百科,以确保我的仿射变换的数量和概率是正确的,但是产生了相同的,瘦的蕨类植物。有人能帮我吗?我最近进入了BufferedImage的领域,听说这是渲染像素的更好方法,但我仍然不确定它是如何工作的。绘画的图形风格是不可靠的还是什么?这是我的代码:

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Canvas;

public class Fern extends Canvas{

    private static final long serialVersionUID = 1L;
    public static final int ITERATION = 100000;

    public  Fern() {
        setBackground(Color.WHITE);
    }

    public void paint(Graphics window)
    {
        double x = .5;
        double y = 0;
        window.setColor(Color.GREEN);
        window.drawRect(200,600,1,1);
        Color color;
        for(int i = 0; i<ITERATION; i++){
            double chance = (Math.random());
            if(chance<.85){
                x=.85*x+.04*y; //x=.85*x+.04*y;
                y=-.04*x+.85*y+1.6; //y=-.04*x+.85*y+1.6;
                color = new Color(Color.GREEN.getRGB());
            }
            else if(chance<.86){
                x=0; //x=0;
                y=.16*y; //y=.16*y;
                color = new Color(Color.BLUE.getRGB());
            }
            else if(chance<.93){
                x=.2*x-.26*y; //x=.2*x-.26*y;
                y=.23*x+.22*y+1.6; //y=.23*x+.22*y+1.6;
                color = new Color(Color.RED.getRGB());
            }
            else{
                x=-.15*x+.28*y; //x=-.15*x+.28*y;
                y=.26*x+.24*y+.44; //y=.26*x+.24*y+.44;
                color = new Color(Color.ORANGE.getRGB());
            }
            window.setColor(color);
            window.fillRect((int)(66*x)+200,(int)(66*-y)+675,1,1);
        }
    }
}

这是由APlusCompSci.com提供的Runner类,并进行了一些调整。

//© A+ Computer Science  -  www.apluscompsci.com

import javax.swing.JFrame;

public class GraphicsRunner extends JFrame
{
    private static final long serialVersionUID = 1L;
    private static final int WIDTH = 500;
    private static final int HEIGHT= 800;

    public GraphicsRunner()
    {
        super("Barnsley Fern");
        setSize(WIDTH,HEIGHT);  

        getContentPane().add(new Fern());
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        setVisible(true);
    }

    public static void main( String args[] )
    {
        GraphicsRunner run = new GraphicsRunner();
    }
}

抱歉,我无法提供misshapen蕨类植物的照片。提前谢谢!

1 个答案:

答案 0 :(得分:7)

以下几行肯定包含一个非常常见的错误:

  x=.85*x+.04*y; //x=.85*x+.04*y;
  y=-.04*x+.85*y+1.6; //y=-.04*x+.85*y+1.6;

因为您在第一行更改了x的值,所以第二行(y)给出了错误的结果。

你应该写:

  int x2=.85*x+.04*y; //x=.85*x+.04*y;
  y=-.04*x+.85*y+1.6; //y=-.04*x+.85*y+1.6;
  x = x2;

使用临时变量可以为x和y提供正确的结果。