使用Java Swing组件开发画板(4)

这是Java画板开发的最后阶段,本章节主要讲解分形的绘制。

一、分形

        1、简述

        分形看似毫无任何规律,但其实暗藏一定的关系,大部分的分形可以通过某种数学关系的运算,再通过程序递归调用,从而可以绘制出许多图形。其中最常见的图形就是初中学习勾股定理后绘制的勾股树。

 二、分形绘制

        明确思路后可以自己动手操作,体验分形的绘制

        1、分形树

                首先绘制分形树,先来看图形。

                 一般来说,分形绘制我们可以使用已经提供的函数并通过程序递归调用,首先是函数:

                                                                xn+1 = a xn + b yn + e

                                                                 yn+1 = c xn + d yn + f

上述函数即绘制该分形所需的函数,接下来是参数。上述图形的参数一共有5组,每组有6个参数,这些参数构成一个二维矩阵。在绘制过程中,需要随机选出一组参数进行计算,一下是图形绘制的参数:

                    set 1     set 2     set 3     set 4     set 5
             a     0.1950    0.4620   -0.6370   -0.0350   -0.0580
             b    -0.4880    0.4140    0.0000    0.0700   -0.0700
             c     0.3440   -0.2520    0.0000   -0.4690    0.4530
             d     0.4430    0.3610    0.5010    0.0220   -0.1110
             e     0.4431    0.2511    0.8562    0.4884    0.5976
             f     0.2452    0.5692    0.2512    0.5069    0.0969

                接下来是在程序中的实现过程。简单来说就是在鼠标点击画板空白处的时候绘制图形。

首先创建列表用于保存参数。

    public static final double [] a = {.195 , .462 , -.637 , -.035 , -.058};
    public static final double [] b = {-.488 , .414 , 0 , .07 , -.07};
    public static final double [] c = {.344 , -.252 , 0 , -.469 , .453};
    public static final double [] d = {.443 , .361 , .501 , .022 , -.111};
    public static final double [] e = {.4431 , .2511 , .8562 , .4884 , .5976};
    public static final double [] f = {.2452 , .5692 , .2512 , .5069 , .0969};

接着创建分形绘制的函数,思路如下:

        首先随机选择一组参数,这里将会用到随机数,将对应的参数取出

Random r = new Random();
 int R1 = r.nextInt(5);
            double A = a[R1];
            double B = b[R1];
            double C = c[R1];
            double D = d[R1];
            double E = e[R1];
            double F = f[R1];

        接着将其带入公式中计算

double xn = A * x0 + B * y0 + E;
double yn = C * x0 + D * y0 + F;

        最后是递归,这里使用for循环进行递归,同时也可以重复调用函数。接下来是整体代码

 public void IFS1(){
        Random r = new Random();
        //定义两个变量用于保存递归过程产生的值
        double x0 = 0;
        double y0 = 0;
        //定义整数用于接收坐标值
        int x , y;
        //递归体
        for (int i = 0; i < 100000; i++) {
            int R1 = r.nextInt(5);
            double A = a[R1];
            double B = b[R1];
            double C = c[R1];
            double D = d[R1];
            double E = e[R1];
            double F = f[R1];
            double xn = A * x0 + B * y0 + E;
            double yn = C * x0 + D * y0 + F;
            x0 = xn;
            y0 = yn;
            //参数转型,将浮点型转为整型,同时放大图形
            x = ((int) (x0 * 600 + 200));
            y = ((int) (y0 * 600 + 100));
            //图形位置设置
            x = 800 - x;
            y = 800 - y;
            graphics02.drawLine(x , y , x , y);
        }
    }

        最终效果如下:

        注意事项:分形绘制比较简单,基本上的分形函数都有提供,但在编程过程中需要注意参数的值一定要正确输入,如果输入错误,最终图形的会和原图形不一致,因为在多次递归后差异将会被放大。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值