processing自画像

动态效果演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现

part1

观察这张gif图片不难发现,它显然是基于一个已有的照片来实现的。因此整体的实现步骤分为导入和记录图片像素信息,每一帧创建若干随机圆,填充该圆所在位置的颜色。

导入图片,记录像素值

这里我首先创建了一个circle类,用来记录每个点的位置信息和颜色信息。然后在setup函数中导入图片,并显示出来,保存每个点的位置加颜色信息,再clear窗口。

class circles
{
  int x,y,r;
  circles()
  {
    x=int(random(0,750));
    y=int(random(0,1000));
    r=int(random(1,20));
  }
}
void setup()
{
  size(750,1000);
  img_me=loadImage("me.JPG");
  image(img_me,0,0,width,height);
  for (int j=0;j<750;j++)
  {
    for (int k=0;k<1000;k++)
    {
      color colortemp=get(j,k);
      colormap map=new colormap(colortemp,j,k);
      colorlist.add(map);
    }
  }
  clear();

每一帧随机创建圆

//全局变量
ArrayList<circles> circlelist=new ArrayList<circles>();
ArrayList<colormap> colorlist=new ArrayList<colormap>();
  //20/flash
  for(int j=0;j<100;j++)
  {
    circlelist.add(new circles());
    i+=1;
  }
  for(int a=0;a<circlelist.size();a++)
  {
    circles circle_single=circlelist.get(a);
    int b=circle_single.x;
    int c=circle_single.y;
    int r=circle_single.r;
    color color_fill=colorlist.get(b*1000+c).color_me;
    noStroke();
    fill(color_fill);
    ellipse(b,c,r,r); 
  }

part2

基本同第一部分,将圆改为倒三角

class Triangle
{
  int x,y,x1,x2,x3,y1,y2,y3,r;
  Triangle()
  {
    x=int(random(0,750));
    y=int(random(0,1000));
    r=int(random(1,20));
    x1=int(x-pow(3,0.5)/2*r);
    x2=int(x+pow(3,0.5)/2*r);
    x3=x;
    y1=int(y-r/2);
    y2=int(y-r/2);
    y3=int(y+r);
  }
}
for(int j=0;j<100;j++)
  {
    tris.add(new Triangle());
    i+=1;
  }
  for(int a=0;a<tris.size();a++)
  {
    Triangle trii=tris.get(a);
    int b=trii.x;
    int c=trii.y;
    color color_fill=colorlist.get(b*1000+c).color_me;
    noStroke();
    fill(color_fill);
    triangle(trii.x1,trii.y1,trii.x2,trii.y2,trii.x3,trii.y3);
    //print(trii.x1);
  }

part3

思路是将原图转为灰度图后获取每一部分灰度值,设置不同阈值赋以不同的颜色。

void draw_3()
{
  //20/flash
  for(int j=0;j<500;j++)
  {
    circlelist2.add(new circles2());
    i+=1;
  }
  for(int a=0;a<circlelist2.size();a++)
  {
    circles2 circle_single=circlelist2.get(a);
    int b=circle_single.x;
    int c=circle_single.y;
    int r=circle_single.r;
    int color_fill=colorlist2.get(b*1000+c).color2;
    color color_to_fill=color(0,0,0);
    if(color_fill>=120&&color_fill<=180)
    {
      color_to_fill=color(244,225,197);
    }
    else if(color_fill>=200)
    {
      color_to_fill=color(255,197,197);
    }
    else if(color_fill>=50&&color_fill<=100)
    {
      color_to_fill=color(252,204,132);
    }
    noStroke();
    fill(color_to_fill);
    ellipse(b,c,r,r); 
  }
}

part4

思路:首先将原灰度图同过设立阈值,将黑色部分保存到一个列表中。

  //在setup函数中
  img_me2=loadImage("me4.jpg");
  image(img_me2,0,0,width,height);
  i=0;
  for (int j=0;j<750;j++)
  {
    for (int k=0;k<1000;k++)
    {
      int colortemp=int(red(get(j,k)));
      colormap2 map2=new colormap2(colortemp,j,k);
      colorlist2.add(map2);
      if(colortemp<=50)
      {
        point pointt=new point(j,k);
        points.add(pointt);
      }
    }
  }
  clear();

创建point类保存位置信息

class point
{
  int x,y;
  point(int x1,int y1)
  {
    x=x1;
    y=y1;
  }
}
ArrayList<point> points=new ArrayList<point>();

遍历列表中的点,在画布上随机取点和列表中点一一对应,绘制两点之间的连线。并在每一帧绘制所有已经遍历的点,用ellipse。

void draw_4()
{
  if(clip<points.size())
  {
    background(255);
  for (int aa=0;aa<100;aa++)
  {
    if(clip<points.size())
    {
      point pointt=points.get(clip);
      clip+=5;
      //println(clip);
      point pointr=new point(int(random(0,750)),int(random(0,1000)));
      stroke(0);
      line(pointr.x,pointr.y,pointr.x+int((1+flag_toadd)*(pointt.x-pointr.x)/10),pointr.y+int((1+flag_toadd)*(pointt.y-pointr.y)/10));
    }
  }
  for (int a=0;a<clip;a+=5)
    {
      noStroke();
      fill(0);
      point pointtemp=points.get(a);
      ellipse(pointtemp.x,pointtemp.y,2,2);
    }
  if(!(flag_toadd % 10==0))
  {
    clip-=500;
  }
  flag_toadd+=1;
  }
  else
  {
    for (int a=0;a<clip;a+=5)
    {
      noStroke();
      fill(0);
      point pointtemp=points.get(a);
      ellipse(pointtemp.x,pointtemp.y,2,2);
    }
  }  
}

part5

添加鼠标交互,每点一次切换绘制模式。

void mouseClicked() 
{
  total_flag+=1;
}
void draw()
{
  if(total_flag%4==0)
  {
    clear();
    draw_1();
  }
  if(total_flag%4==1)
  {
    clear();
    draw_2();
  }
  if(total_flag%4==2)
  {
    clear();
    draw_3();
  }
  if(total_flag%4==3)
  {
    clear();
    draw_4();
  }
}

总结

用processing每每都有意料之外的收获,在于其能十分快捷地得到反馈,即便写错了,也能获得和开始所想不一样的效果。期待下一次用processing做出更加炫酷的效果。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值