p5.js实现动态图形临摹

p5.js实现动态图形临摹的具体代码,供大家参考,具体内容如下

临摹的动态图形

对于动态图形临摹主要在于从图形中寻找规律,包括颜色变化、空间变化、几何关系、数学规律等等,把握规律之后才可以还原图形,同时,添加新的规律也会出现不一样的效果。

观察规律

1.空间分布:整体由5行5列形状大小相同的圆构成
2.颜色规律:在与对角线平行的同一线上的所有小球颜色相同
3.单个圆动态变化规律:逐渐被掩盖后又逐渐出现,掩盖过程为匀速过程
4.整体动态变化规律:自右上到左下依次进行个体的动态变化,在与对角线平行的同一线上的颜色相同的圆变化状态一致,相邻斜线之间间隔相同

临摹

1.基本空间布局

循环生成5行5列圆

function setup() {
 createCanvas(400, 400);
}
function draw() {
 noStroke(); //没有描边
 drawsbkg();
}
function drawsbkg(){
  background(0); //底色
  fill(255);
 for(var i=0;i<5;i++){  //循环绘制圆
   for(var j=0;j<5;j++)
  {
 ellipse(i*60+75,j*60+75,50,50);//绘制椭圆(x,y,宽,高)
 }
  }
}

效果图

2.添加颜色

通过PS打开原图获取颜色RGB参数,循环中根据行列条件控制颜色

function drawsbkg()
{
 background(0);
 fill(255);
 for(var i=0;i<5;i++){
  for(var j=0;j<5;j++)
  {
   var m=i+j;
   switch(m)
   {
 case 0:fill(color(97,44,142));break;
    case 1:fill(color(22,116,188));break;
    case 2:fill(color(1,163,150));break;
    case 3:fill(color(129,196,64));break;
    case 4:fill(color(245,181,47));break;
    case 5:fill(color(237,91,52));break;
    case 6:fill(color(234,35,94));break;
    case 7:fill(color(186,34,129));break;
    case 8:fill(color(97,44,142));break;

 }
   ellipse(i*60+75,j*60+75,50,50);//绘制椭圆(x,y,宽,高)
  }
 }
}

效果图

3.单独圆的变化状态

分析:单独圆显示部分与掩盖部分并不是直线或是与原有圆同半径大小的圆弧,而是在原有原基础上做类似月牙变化的掩盖与显示,即交界线为以圆上顶点、下顶点为起始点,高度50,宽度不断变化,起始终止夹角为π/2或-π/2的圆弧。

例如:紫色区域为单独圆,部分被覆盖,白色部分为覆盖区域(实际为黑色),则白色区域可视为右半边白色半圆(2)与左侧圆弧覆盖部分(1)之和

例如:紫色区域为单独圆,部分被覆盖,白色部分为覆盖区域(实际为黑色),则该区域可视为右半边半圆与右半边紫色圆弧部分(2)之差

以上为每个圆动态变化过程经历的两个阶段,每个圆的变化过程分为四个阶段:本身颜色圆形,黑色月牙自右向左覆盖,圆消失(变成黑色),原色月牙自右向左恢复。
控制每段过程发生的时间

function setsphere(i,j,p,mcolor)
{
 ellipse(i*60+75,j*60+75,50,50);
 cover(i*60+75,j*60+75,p,mcolor);
}
function cover(i,j,p,mcolor)
{
 if(p>=100&&p<=150)
 {
 fill(0);
 arc(i, j, 50, 50, -HALF_PI, HALF_PI);
 fill(mcolor);
 arc(i, j, 150-p, 50, -HALF_PI, HALF_PI);
 }
 else if(p>=150&&p<=200)
 {
 fill(0);
 arc(i, j, 50, 50, -HALF_PI, HALF_PI);
 fill(0);
 arc(i,j, p-150, 50, HALF_PI, -HALF_PI);
 }
 else if(p>200&&p<300)
 {
 fill(0);
 arc(i, j, 50, 50, -HALF_PI, HALF_PI);
 fill(0);
 arc(i, j, 50, 50, HALF_PI, -HALF_PI);
 }
 else if(p>=300&&p<=350)
 {
 fill(0);
 arc(i, j, 50, 50, HALF_PI, -HALF_PI);
 fill(mcolor);
 arc(i, j, 50, 50, -HALF_PI, HALF_PI);
 fill(0);
 arc(i, j, 350-p, 50, -HALF_PI, HALF_PI);
 }
 else if(p>=350&&p<=400)
 {
 fill(0);
 arc(i, j, 50, 50, HALF_PI, -HALF_PI);
 fill(mcolor);
 arc(i, j, 50, 50, -HALF_PI, HALF_PI);
 fill(mcolor);
 arc(i, j, p-350, 50, HALF_PI, -HALF_PI);
 }
}

4.调整不同变化状态的间隔

每一斜线方向变化状态同步,相邻两条斜线变化间隔相同。

for(var i=0;i<5;i++){
 for(var j=0;j<5;j++)
 {
 var m=i+j;
 switch(m)
 {
  case 0:
 fill(color0);
 mcolor=color0;
 setsphere(i,j,t%400,mcolor);
 break;
  case 1:
 fill(color1);
 mcolor=color1;
 setsphere(i,j,(t-40)%400,mcolor);
 break;
  case 2:
 fill(color2);
 mcolor=color2;
 setsphere(i,j,(t-80)%400,mcolor);
 break;
  case 3:
 fill(color3);
 mcolor=color3;
 setsphere(i,j,(t-120)%400,mcolor);
 break;
    case 4:
 fill(color4);
 mcolor=color4;
 setsphere(i,j,(t-160)%400,mcolor);
 break;
  case 5:
 fill(color5);
 mcolor=color5;
 setsphere(i,j,(t-200)%400,mcolor);
 break;
  case 6:
 fill(color6);
 mcolor=color6;
 setsphere(i,j,(t-240)%400,mcolor);
 break;
  case 7:
 fill(color7);
 mcolor=color7;
 setsphere(i,j,(t-280)%400,mcolor);
 break;
  case 8:
  fill(color8);
 mcolor=color8;
 setsphere(i,j,(t-320)%400,mcolor);
 break;
 }
 } 

效果图

拓展

每个小球有更丰富的颜色变化,并且颜色变化伴随状态变化,即在循环中绘制每个圆之前,先要获取颜色信息,控制颜色随时间周期变化。

function getcolor(mark)
{
 let color0=color(97,44,142);
 let color1=color(22,116,188);
 let color2=color(1,163,150);
 let color3=color(129,196,64);
 let color4=color(245,181,47);
 let color5=color(237,91,52);
 let color6=color(234,35,94);
 let color7=color(186,34,129);
 let color8=color(97,44,142);
 switch(mark%8)
 {
 case 0:mcolor=color0;break;
 case 1:mcolor=color1;break;
 case 2:mcolor=color2;break;
 case 3:mcolor=color3;break;
 case 4:mcolor=color4;break;
 case 5:mcolor=color5;break;
 case 6:mcolor=color6;break;
 case 7:mcolor=color7;break;
 case 8:mcolor=color8;break;
 }
}
case 0:
 getcolor(mark0)
 fill(mcolor);
 setsphere(i,j,t%400,mcolor);
 break;
case 1:
 getcolor(mark0+1)
 fill(mcolor);
 setsphere(i,j,(t-40)%400,mcolor);
 break;

效果图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 使用p5.js实现动态GIF图片临摹重现

    前言 根据互动媒体技术老师的实验要求,临摹了一张GIF动态图,使用p5.js进行重现. 博客里面会有实现逻辑以及实现代码,在最后还会有一张自己实现的扩展图. 原图 实现步骤 规律总结 1.观察图片可以看到,整个图是由两个部分组成的,其中一个是棍状体,一个是螺旋状体. 2.棍状体从外到内越来越窄,整个图形在做绕固定旋转圆心的匀速圆周运动. 3.螺旋状体也是在做绕固定旋转圆心的匀速圆周运动. 4.螺旋状体的旋转角速度比棍状体的旋转角速度大. 具体实现逻辑 为了方便分析,我截取了一个静态的瞬间: 那么

  • p5.js临摹旋转爱心

    运用p5.js临摹旋转爱心,供大家参考,具体内容如下 原图 我的临摹 效果不错的样子,让我们看看实现过程. 第一步.分析原图GIF 因为原图中旋转速度较快,无法用肉眼直观地找到规律.所以我把gif分解,共90帧,一帧一帧的寻找旋转规律. 从上往下顺序,第一层到第六层.从简单的说起. 第六层:逆时针匀速旋转一圈. 第五层:先逆时针旋转α,速度由v1变为0.再顺时针旋转180°+2α,速度由0变为v2,再变为0.最后逆时针旋转α,速度由0变为v1.(观察原图,我将α设为30°0) 第四层:先逆时针旋

  • 使用p5.js临摹动态图形

    一.临摹 最近正在学习用代码绘图,于是按照下面的动态图形自己临摹了一幅图形 临摹结果 观察发现,整个图案都是由基础的正六边形组成 首先创建一个画布 function setup() { createCanvas(400, 400); } 画六边形的函数为 function polygon(x, y, radius, npoints) {//绘制正多边形函数 let angle = TWO_PI / npoints; beginShape(); for (let a = 0; a < TWO_PI

  • p5.js临摹动态图形的方法

    本文实例为大家分享了p5.js临摹动态图形的具体代码,供大家参考,具体内容如下 一.描述所临摹图像的规律 1.图像由多个闪光圆点和圆点之间的连线组成 2.圆点的运动轨迹是随机的 3.圆点之间靠近时会产生连线,并且相互靠近的圆点会颜色加深 二.代码实现 圆点之间产生连线,随机生成线条和运动轨迹: //随机生成s.n条线位置信息 for (var t = [], p = 0; s.n > p; p++) { var h = random() * r, //随机位置 g = random() * n,

  • 使用p5.js临摹动态图片

    本文实例为大家分享了p5.js临摹动态图片的具体代码,供大家参考,具体内容如下 1.临摹图片 2.图像运动规律 原图中一共有36个等大的四分之三圆形,按照一定的规律转动,可以等效为圆形不动,每个圆上有以其半径为边长的矩形在绕圆形的原点转动,每四个为一组,其他部分都是在重复这四个的转动规律 3.完整代码 function setup() { createCanvas(402,402); } function draw() { background(0); var dx=0; dx+=PI/180;

  • p5.js临摹动态图形实现方法详解

    使用p5.js临摹一个动态图形并作出拓展,供大家参考,具体内容如下 原图形 由内向外,白色圆的半径依次增大,黑色圆的半径不变: 白色圆在上一个白色圆碰到之前就开始增大半径: 图中只能存在一个周期的变化: 临摹图形 使用P5.js,依照上文的规律进行临摹 画12对圆: 相邻圆之间半径差为25: 白色圆半径以周期为60帧的正弦函数的正数值部分变化,变化幅度为22: 相邻白色圆运动函数相位差为13帧: 代码如下: function setup() { createCanvas(400, 400); f

  • p5.js实现动态图形临摹

    p5.js实现动态图形临摹的具体代码,供大家参考,具体内容如下 临摹的动态图形 对于动态图形临摹主要在于从图形中寻找规律,包括颜色变化.空间变化.几何关系.数学规律等等,把握规律之后才可以还原图形,同时,添加新的规律也会出现不一样的效果. 观察规律 1.空间分布:整体由5行5列形状大小相同的圆构成 2.颜色规律:在与对角线平行的同一线上的所有小球颜色相同 3.单个圆动态变化规律:逐渐被掩盖后又逐渐出现,掩盖过程为匀速过程 4.整体动态变化规律:自右上到左下依次进行个体的动态变化,在与对角线平行的

  • p5.js绘制创意自画像

    本文实例为大家分享了p5.js绘制自画像的具体代码,供大家参考,具体内容如下 绘制结果 人物头上的呆毛会一直运动,鼠标出现在画面上时左上角会有一个小猫咪头随着鼠标移动,而且人物的眼睛也会一直看向小猫的方向 代码介绍 整个图全部由贝塞尔曲线,直线和圆组成 贝塞尔曲线的代码结构大概就是 beginShape(); vertex(180,600);//曲线起点 bezierVertex(180,600,300,100,420,600); //第一个控制点坐标,第二个控制点坐标,终点坐标 endShap

  • JS+canvas动态绘制饼图的方法示例

    本文实例讲述了JS+canvas动态绘饼图的方法.分享给大家供大家参考,具体如下: 运行效果图如下: 完整代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>www.jb51.net canvas饼状图</title> </head> <body> <canvas id=

  • 基于 D3.js 绘制动态进度条的实例详解

    D3 是什么 D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档.听名字有点抽象,说简单一点,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可视化的.如果你不知道什么是 JavaScript ,请先学习一下 JavaScript,推荐阮一峰老师的教程. JavaScript 文件的后缀名通常为 .js,故 D3 也常使用 D3.js 称呼.D3 提供了各种简单易用的函数,大大简化了 JavaScript 操作数据的难度.由于

随机推荐