p5.js 动态图像临摹及拓展

原图展示

在这里插入图片描述

原图分析

本图片实质为白色圆形和黑色圆形互套而成。
运动时,所有白色圆形半径按正弦函数增大和缩小
在半径最小处停止一段时间,随后再继续周期运动
内圈先动,外圈后动
上一个圆运动中途下一个圆开始运动

代码实现

画单个圆的代码

  //白圆
  fill(255);
  ellipse(400,400,100+50*abs(sin(a[0])),100+50*abs(sin(a[0])));
  //黑圆
   fill(0);
  ellipse(400,400,50,50);

50*abs(sin(a[0])为半径的变化量
主要问题有两个:
1.让半径可以在变化和静止之间变化
2.让每个白圆的运动有一定相位差

(一)

i[0]=0;//相位差
//运动时间
if(((frameCount/10*PI)-i[0])<PI){
   a[0]=(frameCount/10*PI-0);
  }
  //静止时间
  else if(((frameCount/10*PI)-i[0])<5*PI)
  { a[0]=0;}
  else
  {i[0]=i[0]+5*PI}

对于第一个圆来说,相位差为0
运动时间为1PI,静止时间为4PI,周期往复

(二)
用数组i来控制相位差

i=[0,0,0,0,0,0,0,0,0,0,0];
  for(j=0;j<=10;j++){
  i[j]=j*PI*1/4;
  }
//第一个白圆
//i[0]=0;

if(((frameCount/10*PI)-i[0])<PI){
   a[0]=(frameCount/10*PI-0);
  }
  else if(((frameCount/10*PI)-i[0])<5*PI)
  { a[0]=0;}
  else
  {i[0]=i[0]+5*PI}
  
 //第二个白圆
//i[1]=1/4PI;相位差为四分之一PI

  if(((frameCount/10*PI)-i[1])<PI){
   a[1]=(frameCount/10*PI-PI/4);
  }
  else if(((frameCount/10*PI)-i[1])<5*PI)
  { a[1]=0;}
  else
  {i[1]=i[1]+5*PI}
  

最后精简画圆代码,用循环语句:

noStroke();
  
  for(x=21;x>=0;x--){
    if(x%2==1){
      fill(220);
    ellipse(400,400,50+50*x+50*abs(sin(a[(x-1)/2])),50+50*x+50*abs(sin(a[(x-1)/2])));
    }
    else{
      fill(0);
      ellipse(400,400,50+50*x,50+50*x);
    }
  }

临摹总代码:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值