加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 生成分形旋转

发布时间:2020-12-14 05:27:07 所属栏目:Java 来源:网络整理
导读:我需要使用算法 Iterated Function System绘制分形漩涡. 这个分形有系数: 0.745455 -0.459091 0.406061 0.887121 1.460279 0.691072 0.912675-0.424242 -0.065152 -0.175758 -0.218182 3.809567 6.741476 0.087325 这里是我的代码: import java.awt.Graphi
我需要使用算法 Iterated Function System绘制分形漩涡.

这个分形有系数:

0.745455 -0.459091  0.406061  0.887121 1.460279 0.691072 0.912675
-0.424242 -0.065152 -0.175758 -0.218182 3.809567 6.741476 0.087325

这里是我的代码:

import java.awt.Graphics;
import javax.swing.JPanel;

public class Surface extends JPanel {
double a1 = 0.745455;
double b1 = -0.459091;
double d1 = 0.406061;
double e1 = 0.887121;
double c1 = 1.460279;
double f1 = 0.691072;
double p1 = 0.912675;

double a2 = -0.424242;
double b2 = -0.065152;
double d2 = -0.175758;
double e2 = -0.218182;
double c2 = 3.809567;
double f2 = 6.741476;
double p2 = 0.087325;

double x1(double x,double y) {
    return a1 * x + b1 * y + c1;
}

double y1(double x,double y) {
    return d1 * x + e1 * y + f1;
}

double x2(double x,double y) {
    return a2 * x + b2 * y + c2;
}

double y2(double x,double y) {
    return d2 * x + e2 * y + f2;
}

public void paint(Graphics g) {
    drawFractal(g);
}

void drawFractal(Graphics g) {
    double x1 = 300;
    double y1 = 300;
    double x2 = 0;
    double y2 = 0;
    g.fillOval(300 + (int) x1,300 + (int) y1,3,3);
    for (int i = 0; i < 10000; i++) {
        double p = Math.random();
        if (p < 0.91675) {
            x2 = x1(x1,y1);
            y2 = y1(x1,y1);
            g.fillOval(300 + (int) x2,300 + (int) y2,3);
            x1 = x2;
            y1 = y2;
        } else {
            x2 = x2(x1,y1);
            y2 = y2(x1,3);
            x1 = x2;
            y1 = y2;
        }
    }
}
}

不幸的是,使用这段代码我得到一个错误的图片:

如果有人可以指出我的错误,那将是巨大的.

解决方法

你的一代似乎是正确的(即不要做x1 = x2 300; y1 = y2 300;),但是你的问题是为了渲染的目的而离开规模.这意味着有很少的点落在图像的中心之外.

你的窗口是[0..600] x [0..600].尝试将x2和y2乘以50,以便您渲染[-6..6] x [-6..6]区域而不是[-300..300] x [-300..300]区域的空间.

请注意,绘制单个像素(作为自己的行)而不是3×3椭圆应该是足够的.

int xp = 300 + (int) (x2 * scale);
int yp = 300 + (int) (y2 * scale);
g.drawLine(xp,yp,xp,yp);

根据所渲染的内容,您可能需要稍微调整刻度,以合理的边界获得整个图像.注意第二个变换偏移为-6.7,因此30的比例应该是正确的.

另请注意,通过使用x1 = x2 300; y1 = y2 300;你改变变换并得到一个不同的分形(按你期望的比例).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读