我的巴恩斯利蕨太瘦了

1 java graphics canvas fractals jframe

我是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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是由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();
    }
}
Run Code Online (Sandbox Code Playgroud)

对不起,我无法提供misshapen蕨类植物的照片.先感谢您!

Ora*_*bîg 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;
Run Code Online (Sandbox Code Playgroud)

因为您在第一行更改了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;
Run Code Online (Sandbox Code Playgroud)

使用临时变量可以使x和y具有正确的结果.