我是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蕨类植物的照片。提前谢谢!
答案 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提供正确的结果。