一,绘制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);
}