码绘—动态图形临摹

动态图形临摹

主题:从参考资料中的“动态图形艺术”中选取不少于1幅作品,用编程方式临摹,并进行拓展

临摹对象以及临摹成果

对象
临摹对象
成果

成果

临摹过程

观察规律

这个动态图案中总共有19个正六边形,除中心的正六边形外,都在进行一定的变化,这个图案总结为四层,第一层就是中心层,只有一个正六边形,还没有变化,第二层,为中心层外十二个组成六芒星的正六边形,它们从中心层边缘放大,同时平移至既定位置,第三层,是里中心层最近的六个正六边形,它们向外进行平移,远离中心层,第四层,是外围十二个正六边形,它们向外平移,逐渐接近画布边缘,同时变小直至消失。

代码

正六边形

最开始,当然要先构造正六边形:

function polygon(x, y, radius, numberOfPoints) {
    var angle = TWO_PI / numberOfPoints;
    beginShape();
    for (var a = 0; a < TWO_PI; a += angle) {
        var sx = x + sin(a) * radius;
        var sy = y + cos(a) * radius;
        vertex(sx, sy);
    }
    endShape();
}

为了让它们能动起来,需要定义个时间

var T=36000; 
var M=millis()%T;
var time=(M/36)%53;

然后一层一层地做出来,第一层:

polygon(400,400,50,6);

第二层:

  polygon(350-time,400,time,6);
  polygon(450+time,400,time,6);
  polygon(375-time/2,340-time/2,time,6);
  polygon(425+time/2,340-time/2,time,6);
  polygon(300-time,340-time/2,time,6);
  polygon(500+time,340-time/2,time,6);
  polygon(400,280-time,time,6);
  polygon(425+time/2,460+time/2,time,6);
  polygon(500+time,460+time/2,time,6);
  polygon(375-time/2,460+time/2,time,6);
  polygon(300-time,460+time/2,time,6);
  polygon(400,520+time,time,6);

第三层:

  polygon(300-2*time,400,50,6);
  polygon(500+2*time,400,50,6);
  polygon(450+time,315-17*time/10,50,6);
  polygon(350-time,315-17*time/10,50,6);
  polygon(350-time,485+17*time/10,50,6);
  polygon(450+time,485+17*time/10,50,6);

第四层:

  polygon(500+3*time,570+3*time,50-time,6);
  polygon(300-3*time,570+3*time,50-time,6);
  polygon(500+3*time,230-3*time,50-time,6);
  polygon(300-3*time,230-3*time,50-time,6);
  polygon(200-4*time,400,50-time,6);
  polygon(600+4*time,400,50-time,6);
  polygon(400,570+2*time,50-time,6);
  polygon(400,230-2*time,50-time,6);  
  polygon(250-2*time,485+2*time,50-time,6);
  polygon(550+2*time,485+2*time,50-time,6);  
  polygon(250-2*time,315-2*time,50-time,6);
  polygon(550+2*time,315-2*time,50-time,6);

因为图片中,每一次变换中间有个间隔,于是加了个条件,能有个停顿:

if(time<=50)
  {
  ...
  }
  else
  {
    polygon(600,400,50,6);
    polygon(200,400,50,6);
    polygon(500,400,50,6);
    polygon(300,400,50,6);
    
    polygon(250,485,50,6);
    polygon(550,485,50,6);
    polygon(250,315,50,6);
    polygon(550,315,50,6);
    polygon(450,485,50,6);
    polygon(350,485,50,6);
    polygon(450,315,50,6);
    polygon(350,315,50,6);
    
    polygon(400,570,50,6);
    polygon(300,570,50,6);
    polygon(500,570,50,6);
    polygon(400,230,50,6);
    polygon(300,230,50,6);
    polygon(500,230,50,6);
  }

总代码如下:

function setup() {
  createCanvas(800, 800);
}

function draw() {
  background(0);
  noStroke();  //没有描边
  var T=36000; 
  var M=millis()%T;
  polygon(400,400,50,6);
  var time=(M/36)%53;
  if(time<=50)
  {
  polygon(350-time,400,time,6);
  polygon(450+time,400,time,6);
  polygon(375-time/2,340-time/2,time,6);
  polygon(425+time/2,340-time/2,time,6);
  polygon(300-time,340-time/2,time,6);
  polygon(500+time,340-time/2,time,6);
  polygon(400,280-time,time,6);
  polygon(425+time/2,460+time/2,time,6);
  polygon(500+time,460+time/2,time,6);
  polygon(375-time/2,460+time/2,time,6);
  polygon(300-time,460+time/2,time,6);
  polygon(400,520+time,time,6);
 
  polygon(300-2*time,400,50,6);
  polygon(500+2*time,400,50,6);
  polygon(450+time,315-17*time/10,50,6);
  polygon(350-time,315-17*time/10,50,6);
  polygon(350-time,485+17*time/10,50,6);
  polygon(450+time,485+17*time/10,50,6);
  
  polygon(500+3*time,570+3*time,50-time,6);
  polygon(300-3*time,570+3*time,50-time,6);
  polygon(500+3*time,230-3*time,50-time,6);
  polygon(300-3*time,230-3*time,50-time,6);
  polygon(200-4*time,400,50-time,6);
  polygon(600+4*time,400,50-time,6);
  polygon(400,570+2*time,50-time,6);
  polygon(400,230-2*time,50-time,6);  
  polygon(250-2*time,485+2*time,50-time,6);
  polygon(550+2*time,485+2*time,50-time,6);  
  polygon(250-2*time,315-2*time,50-time,6);
  polygon(550+2*time,315-2*time,50-time,6);
  }
  else
  {
    polygon(600,400,50,6);
    polygon(200,400,50,6);
    polygon(500,400,50,6);
    polygon(300,400,50,6);
    
    polygon(250,485,50,6);
    polygon(550,485,50,6);
    polygon(250,315,50,6);
    polygon(550,315,50,6);
    polygon(450,485,50,6);
    polygon(350,485,50,6);
    polygon(450,315,50,6);
    polygon(350,315,50,6);
    
    polygon(400,570,50,6);
    polygon(300,570,50,6);
    polygon(500,570,50,6);
    polygon(400,230,50,6);
    polygon(300,230,50,6);
    polygon(500,230,50,6);
  }
}
function polygon(x, y, radius, numberOfPoints) {
    var angle = TWO_PI / numberOfPoints;
    beginShape();
    for (var a = 0; a < TWO_PI; a += angle) {
        var sx = x + sin(a) * radius;
        var sy = y + cos(a) * radius;
        vertex(sx, sy);
    }
    endShape();
}

拓展

完成了临摹,感觉黑白颜色过于单调,拓展就加了点颜色,如下:拓展

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值