Java画图板 3D球与分形的绘制

一,绘制3D球

        ·原理:按照特定的规律循环绘制实心圆实现3D效果
        ·步骤:
                ·1 创建一个画图板加上点击事件监听器和鼠标监听器
                ·2  使用自带的数学方法定义圆的起点坐标,长和宽
x=Math.min(x1,x2);
y=Math.min(y1,y2);
int w =Math.abs(x1-x2);
int h=Math.abs(y1-y2);
                ·3 使用for循环重复绘制圆     
for(int i=0;i<w;i++){
                    int rgb=255/w*i;
                    g1.setColor(new Color(rgb,rgb,0));
                    g1.fillOval(x+i,y+i,w-i,w-i);
                }
                ·注意:w是我们设置的圆的初始宽度,而颜色的rgb值不可以随着w的增大超过255,故                   将255除以w予以限制   
                 出来的效果是这样的

                ·4 调整圆的参数
for(int i=0;i<w;i++){
                    int rgb=255/w*i;
                    g1.setColor(new Color(rgb,rgb,0));
                    g1.fillOval(x+i/2,y+i/2,w-i,w-i);
                }

 

二,绘制分形

        ·概念:一些物体的部分看上去与整体相似,只是更小,是同样的模式在更微观尺度的不断重           复。在数学中,我们将这种特性称为 自相似性,并将具有此特性的形状称为分形。

        ·要编程绘制此类图形,我们很容易想到会使用for循环语句

        ·绘制此类图像需要一些初始值和公式,比如

        ·绘制步骤:
        ·1 设置起始x,y的值为零还有其他的参数
double fx=0,fy=0;
double a=0.4,b=1,c=0;
        ·2 进入for循环再设置一组x,y带入公式 
 for(int i=0;i<10000;i++) {
                    double txa = Math.abs(b * fx - c);
                    double tx = fy - Math.signum(fx) * Math.sqrt(txa);
                    double ty = a - fx;
                           }
        ·这里公式比较复杂所以分了两步计算x
        ·3 将新设置的x,y的值代给初始x,y,否则计算结果恒等于零
        ·4 因为最后我们使用实心矩形绘制图形,所以还需将x,y化成整数,再设置一组x,y并且根据             效果将其增大或者缩小
for(int i=0;i<10000;i++) {
                    double txa = Math.abs(b * fx - c);
                    double tx = fy - Math.signum(fx) * Math.sqrt(txa);
                    double ty = a - fx;
                    fx = tx;
                    fy = ty;
                    int zx = ( int ) (tx * 300);
                    int zy = ( int ) (ty * 300);
                    g1.fillRect(zx + x1, zy + y1, 1, 1);
                }

        ·另一组效果图

        ·枫叶的绘制过程加入了随机数,在a,b,c的数组中抽取一个值进行计算 多了创建数组,创建             随机数,设置随机数,代值这几步

 double fx2=0,fy2=0;
                double[] as={0.1400,0.4300,0.4500,0.4900};
                double[] bs={0.0100,0.5200,-0.4900,0.0000};
                double[] cs={0.0000,-0.4500,0.4700,0.0000};
                double[] ds={0.5100,0.5000,0.4700,0.5100};
                double[] es={-0.0800,1.4900,-1.6200,0.0200};
                double[] fs={-1.3100,-0.7500,-0.7400,1.6200};
                Random r=new Random();
                for(int i=0;i<9000000;i++) {
                    int n = r.nextInt(4);
                    double a2 = as[n], b2 = bs[n], c2 = cs[n], d2 = ds[n], e2 = es[n], f2 = fs[n];
                    double tx2 = a2 * fx2 + b2 * fy2 + e2;
                    double ty2 = c2 * fx2 + d2 * fy2 + f2;
                    fx2=tx2;
                    fy2=ty2;
                    int zx2 = ( int ) (tx2 * 80);
                    int zy2 = ( int ) (ty2 * 80);
                    g1.fillRect(zx2+x1,zy2+y1,1,1);

                }
        ·效果图

·更多有关分形的内容可进入IFS manual

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值