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

【码绘】processing实现码绘

程序员文章站 2022-05-22 09:46:39
...

【码绘】processing实现码绘

————————————————

这是小黑互动媒体的第一次实验,通过processing实现动态图形的临摹与拓展

解析 待临摹的动态图形

【码绘】processing实现码绘

原作呈现出太阳光芒闪耀的形式,通过三角函数的产生环绕太阳一圈的光芒,假设光芒数量为n,太阳直径为d,则每个光芒点与太阳交点的坐标分别为(d/2cos(2PI/n), d/2cos(2PI/n)),然后通过三角形triangle来呈现光芒尖尖的效果,在实现动态效果时,通过改变映入数组实现每个光芒各自不同的效果,并且应用光芒长度length和光芒的运动速度来实现光芒的长度变化,当长度到达一定的临界值时,光芒速度反向,形成循环动态的效果。

话不多说哦!上代码:

float angle;
float between;
float linelength[]=new float[30];
float speed[]=new float[30];

void setup() {
  size(1200, 900);

  between=PI/15;
  noStroke();
  for (int i=0; i<30; i++) {
    linelength[i]=random(300, 450);
    if (i%2==0) {
      speed[i]=2;
    } else {
      speed[i]=-2;
    }
  }
}

void draw() {
  background(0, 0, 0);


  pushMatrix();
  translate(width/2, height/2);

  ellipse(0, 0, 400, 400);
  fill(255, 152, 69);

  for (int i=0; i<30; i++) {
    triangle(150*cos(angle+between*i), 150*sin(angle+between*i), 150*cos(angle+between*(i+1)), 150*sin(angle+between*(i+1)), linelength[i]*cos((angle+between*i+angle+between*(i+1))/2), linelength[i]*sin((angle+between*i+angle+between*(i+1))/2));
    if ((linelength[i]>450) ||(linelength[i]<250)) {
      speed[i]=-speed[i];
    }
    linelength[i]=linelength[i]+speed[i];
  }

  popMatrix();
  //saveFrame();

根据临摹再创作

在拓展作品中,通过改变每个光芒的颜色信息,实现不同色相的光芒效果,此处为了颜色信息美观,使用HSB格式的颜色信息。为了增加动态变化,为整体图案引入了一个旋转系数,让整体图案旋转起来,并且为了改进中心太阳的颜色信息过于呆板的印象,使用同心圆叠加的形式,并且通过系数分别改变每个圆的半径大小实现动态波纹的效果,增加了整体图案的动态和美感。

【码绘】processing实现码绘
代码如下:

float angle;
float between;
float linelength[]=new float[30];
float speed[]=new float[30];
float angle_rotate;
float scale;
float scalespeed;
void setup() {
  size(1200, 900);
  colorMode(HSB, 255);
  between=PI/15;
  scale=1;
  scalespeed=0.0001;
  noStroke();
  for (int i=0; i<30; i++) {
    linelength[i]=random(300, 450);
    if (i%2==0) {
      speed[i]=2;
    } else {
      speed[i]=-2;
    }
  }
}

void draw() {
  background(0, 0, 0);
  pushMatrix();
  translate(width/2, height/2);
  angle_rotate+=0.01;
  for (int i=0; i<30; i++) {
    fill(255/30*i, 506, 241);
    triangle(150*cos(angle+between*i), 150*sin(angle+between*i), 150*cos(angle+between*(i+1)), 150*sin(angle+between*(i+1)), linelength[i]*cos((angle+between*i+angle+between*(i+1))/2), linelength[i]*sin((angle+between*i+angle+between*(i+1))/2));
    if ((linelength[i]>450) ||(linelength[i]<250)) {
      speed[i]=-speed[i];
    }
    linelength[i]=linelength[i]+speed[i];
  }
  angle+=0.005;
  fill(25, 216, 249, 255);
  for (int i=0; i<30; i++) {
    fill(25+i*6, 216, 249, 255-i*5);
    ellipse(0, 0, 400-i*15*scale, 400-i*15*scale);
    if ((scale>=1.5) ||(scale<=0.1) ) {
      scalespeed=-scalespeed;
    }
    scale=scale+scalespeed;
  }
  popMatrix();
  //saveFrame();

编程不是理工人的专利,也不是深不可测又枯燥无味的代码输入过程。这门课的学习,让我了解到编程既是一门科学,也是一门艺术,二者可以彼此很好地互相补充。我体会在计算机屏幕上画图,就如同在图形纸上作画一样,这是一种思维方式,有趣而便捷,可以让人在短时间内探索出很多想法。