我是 Java 编程的新手,最近我决定选择分形作为学校论文的主题。但是,撰写论文的第一步要求我使用 Java 代码重新创建巴恩斯利蕨类植物。当我尝试这样做时,与我在网上看到的其他蕨类植物相比,我的巴恩斯利蕨类植物看起来太瘦了。我检查了维基百科,以确保我的仿射变换的数字和概率是正确的,但还是产生了瘦瘦的蕨类植物。有人能帮我吗?我最近进入了 BufferedImage 领域,听说这是渲染像素的更好方法,但我仍然不确定它是如何工作的。是Graphics画风不靠谱还是怎么的?这是我的代码:
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();
}
}
抱歉,我无法提供畸形蕨类植物的图片。提前致谢!
最佳答案
以下几行肯定包含一个非常常见的错误:
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 都得到正确的结果。
关于java - 我的巴恩斯利蕨类植物太瘦了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25353857/