欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

p5.js实现动态旋转的小球

程序员文章站 2022-07-14 23:20:23
...

实验要求:

从给出的参考资料中的“动态图形艺术”中选取不少于1幅作品,用编程方式临摹并进行拓展。编程语言推荐p5,processing。写一篇文章发表为博文、推文等形式,描述从原作中提炼出的规律。

使用的工具

p5.js官网在线编辑器
https://editor.p5js.org

想要临摹的动态图形

p5.js实现动态旋转的小球

临摹过程

小白一枚,从零开始。
盯着图片看了一会儿,还截了张图,首先我要画只球出来,然后画两只球出来,画的球要可以旋转,这两只球的要在同一个圆上…

画只球

第一次打开编辑器或者新建都会默认是下面这个样子,setup()函数是只在一开始调用一次,draw()函数则会在之后不停调用。

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

function draw() {
  background(220);
}

画只球(实际上只是个圆形,但如果称呼它为圆的话,感觉怪怪的,反正这里的小球实际上都是圆)

function draw() {
  background(220);//设置背景色,220为灰度值
  ellipse(200,200,200,200);//圆心坐标(200,200),宽度200,高度200
}

p5.js实现动态旋转的小球
填充颜色

function draw() {
  background(220);//设置背景色,220为灰度值
  noStroke();//去除边线
  fill(32,178,170);//填充颜色
  ellipse(200,200,200,200);//圆心坐标(200,200),宽度200,高度200
}

p5.js实现动态旋转的小球

画只旋转的小球

function setup() {
  createCanvas(400, 400);//创建400x400的画布
}

function draw() {
  background(0);//设置背景色,220为灰度值
  noStroke();//去除边线
  fill(32,178,170);//填充颜色
  t=millis()/1000;
  ellipse(200+60*cos(2*t),200+80*sin(2*t),20,20);
  //旋转中心坐标(200,200),轨迹图形的宽度40,高度60
  //圆宽度200,圆高度200
  //2为控制速度的参数
}

p5.js实现动态旋转的小球

四只旋转的小球

主要是cos()函数里的改变,四只在圆上的小球,第二只比第一只增加PI/2的相位差就好了,第三只增加PI,第四只增加PI/2*3。更多个数的小球,依次类推。

function setup() {
  createCanvas(400, 400);//创建400x400的画布
}

function draw() {
  background(0);//设置背景色,220为灰度值
  noStroke();//去除边线
  fill(32,178,170);//填充颜色
  t=millis()/1000;
  ellipse(200+60*cos(2*t),200+80*sin(2*t),20,20);
  //旋转中心坐标(200,200),轨迹图形的宽度40,高度60
  //圆宽度200,圆高度200
  //2为控制速度的参数
  ellipse(200+60*cos(2*t+PI/2),200+60*sin(2*t+PI/2),20,20);
  ellipse(200+60*cos(2*t+PI),200+60*sin(2*t+PI),20,20);
  ellipse(200+60*cos(2*t+PI/2*3),200+60*sin(2*t+PI/2*3),20,20);

p5.js实现动态旋转的小球

临摹完成

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

function draw() {
  background(220);
  drawball();
}


function drawball()
{
  background(5);
  noStroke();
  t=(millis()/1000);
  x0=200;//旋转中心的横坐标
  y0=200;//旋转中心的纵坐标
  d=10;//小球的直径
  r=2;//与小球到旋转中心的距离有关
  tr=18;//增量
  v=2;//与速度有关,数值越大转得越快
  tv=-0.1;
  
  p1=PI/2;//四只球
  r=r+tr;
  fill(30,144,255);//蓝色
  for(i=0;i<=3;i++)
    ellipse(x0+r*cos(t*v+p1*i),y0+r*sin(t*v+p1*i),d,d);
    
  
  p2=PI/4;//八只球
  r=r+tr;v=v+tv;
  fill(32,178,170);//蓝绿色
  for(i=0;i<=7;i++)
    ellipse(x0+r*cos(t*v+p2*i),y0+r*sin(t*v+p2*i),d,d);
  
  p2=PI/6;//十二只球
  r=r+tr;v=v+tv;
  fill(0,255,127);//绿色
  for(i=0;i<=11;i++)
    ellipse(x0+r*cos(t*v+p2*i),y0+r*sin(t*v+p2*i),d,d);
  
  p2=PI/8;//十六只球
  r=r+tr;v=v+tv;
  fill(255,215,0);//
  for(i=0;i<=15;i++)
    ellipse(x0+r*cos(t*v+p2*i),y0+r*sin(t*v+p2*i),d,d);
  
  p2=PI/10;//二十只球
  r=r+tr;v=v+tv;
  fill(255,140,0);//DarkOrange
  for(i=0;i<=19;i++)
    ellipse(x0+r*cos(t*v+p2*i),y0+r*sin(t*v+p2*i),d,d);
  
  p2=PI/12;//二十四只球
  r=r+tr;v=v+tv;
  fill(255,99,71);//Tomato
  for(i=0;i<=23;i++)
    ellipse(x0+r*cos(t*v+p2*i),y0+r*sin(t*v+p2*i),d,d);
  
  p2=PI/14;//二十八只球
  r=r+tr;v=v+tv;
  fill(255,105,180);//HotPink
  for(i=0;i<=27;i++)
    ellipse(x0+r*cos(t*v+p2*i),y0+r*sin(t*v+p2*i),d,d);
  
  p2=PI/16;//三十二只球
  r=r+tr;v=v+tv;
  fill(238,130,238);//Violet
  for(i=0;i<=31;i++)
    ellipse(x0+r*cos(t*v+p2*i),y0+r*sin(t*v+p2*i),d,d);
  
    
}

p5.js实现动态旋转的小球

拓展

拓展其实就是改改参数啦,参数改一改,效果大不同。

拓展1

当速度变大的时候,效果会有一点迷幻,它变得好像不再匀速转动了,但是想不懂为什么。

v=8;//与速度有关,数值越大转得越快

p5.js实现动态旋转的小球

拓展2

当v=1的时候,外圈的小球速度会递减,变到负的。效果就是内外圈的球转动方向不一致。

v=1;//与速度有关,数值越大转得越快
tv=-0.23;

p5.js实现动态旋转的小球

拓展3

本来想做小球加速转,然后减速转,但是效果和预想的并不一样,是我无法解释的效果呢。

v=1*cos(0.5*second()*PI);//与速度有关,数值越大转得越快

p5.js实现动态旋转的小球

不足之处

有很多啦,所有小球的转动仔细盯着看的话会发现画面有在抖动,可能是写的式子太简陋了。然后有很多想要实现的效果也还没有实现,还要继续加油学习啦。