java - 我的巴恩斯利蕨类植物太瘦了

标签 java canvas graphics jframe fractals

我是 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/

相关文章:

java - 获取图像的顶点?

java - Android - 使用 GridLayout 垂直滚动

java - 在 struts 2 中使用 servlet 时出现错误 404

java - 这种检测心跳的方法线程安全且一致吗?

javascript - Konva 实时更新一个正确的位置

html - SVG 在 Firefox 中渲染不佳

c++ - QGraphicsPixmapItem mouseMoveEvent 不抓取时

android - TileProvider 图形在更高的缩放级别上倾斜

java - Android 应用程序 : Facebook LoginManager gives me "publish_actions" permission but app never goes through callbackManager callback( Facebook SDK 4. 18.0)?

java - IllegalArgumentException : width and height must be > 0 while loading Bitmap from View