【Processing】我给网友 “战场小包” 做了他的 “自画像”.

news2024/11/23 9:26:02

前言

突然疫情放开了,在掘金里认识的一个掘友(战场小包),突然今天找我。

聊天记录.png

:寻思啥事呢,原来找我做个自画像。

行!没问题!

:结果等半天(一晚上到今天),也没见发自拍照给我。

:难道老包这小子,在考验我?

聊天记录.png

等等,我又仔细品了品说的对话。

聊天记录.png

放大

聊天记录.png

噢?
懂了!一定是那样的!马上安排!果然,老包大老爷们搞这种东西…
知老包者,老南也。

一、照猫画虎

那我可就献丑了!

1-1 准备图片

知老包者,老南也.jpg

1-2 画背景

这里是分两部分

>我真的是自己画的呀.jpg


这里画背景,加个绿色的底色即可

background(139, 231, 122); // 背景颜色

我真的是自己画的呀.jpg

1-3 画衣服

画个红色的衣服

processing 这里是一层一层画上去,先后顺序,所以先画衣服。
即代码为:

// 画衣服
fill(242, 88, 88); // 画笔
bezier(187, 480, 221, 323, 418, 194, 478, 480); // 贝塞尔曲线

老包你好难画啊.jpg

1-4 画脸型

坨坨的脸蛋,要一个圆 + 一个贝塞尔曲线

  // 脸部
  fill(250, 181, 230); // 画笔
  ellipse(345, 273, 221, 231); // 圆
  fill(291, 181, 230); // 画笔
  bezier(239, 245, 16, 60, 454, 149, 356, 177); // 贝塞尔曲线

老包你好难画啊-画脸型.png

1-5 画鼻圏

  // 画猪鼻圈
  stroke(255, 148, 238);
  noFill();
  strokeWeight(3);
  ellipse(201, 167, 52, 59); // 鼻圈

老包你好难画啊-画鼻圏.png

1-6 画鼻孔

  // 鼻孔
  fill(186, 101, 166);
  strokeWeight(13);
  ellipse(190, 162, 2, 13); // 左边鼻子
  ellipse(210, 169, 2, 13); // 右边鼻子

老包你好难画啊-画鼻孔.png

1-7 画耳朵

:老包,你好难画啊!

>9002b5e30ea1940c9f51313bb686ffd.jpg

终于有点那味了

 // 耳朵
 noStroke();
 fill(291, 181, 230); // 画笔
 bezier(344, 149, 325, 77, 433, 81, 359, 156); // 贝塞尔曲线 左耳
 bezier(397, 178, 384, 93, 497, 81, 413, 182); // 贝塞尔曲线 右耳

我真的是自己画的呀.jpg

1-8 画小手

  // 小手
  stroke(253, 181, 230);
  noFill();
  strokeWeight(10);
  // 右手
  line(412, 404, 433, 464); 
  line(427, 448, 415, 459); // 左边手指头
  line(429, 447, 444, 450); // 右边手指头

老包你好难画啊-画小手.png

1-9 画嘴巴(微笑)

  // 嘴巴(微笑)
  stroke(186, 101, 166);
  strokeWeight(5);
  noFill();
  bezier(280, 307, 321, 371, 359, 324, 365, 313); // 贝塞尔曲线

老包你好难画啊-画嘴巴(微笑).png

1-10 画脸红

  // 脸红
  noStroke();
  fill(241, 151, 222);
  ellipse(411, 258, 62, 79);

老包你好难画啊-画脸红.png

1-11 画眼睛

  // 眼睛
  fill(255); // 画笔
  ellipse(359, 197, 38, 38); // 圆
  ellipse(310, 181, 38, 38); // 圆

没眼珠子有点吓人。(因为我们眼珠子要随着鼠标可以动起来,所以我们是留到最后才画。也好调整)

老包你好难画啊-画眼睛.png

1-12 画会动的眼珠子(眼珠子随鼠标动)

1-12-1 新建一个 Eye.pde 文件(眼睛类)

快捷键:Ctrl + Shift + N

老包你好难画啊-画眼睛.png

Eye.pde 文件里的代码

class Eye {
  float x, y;
  int xSize;
  int ySize;
  float angle = 0.0;

  Eye(float tx, float ty, int txs, int tys) {
    x = tx;
    y = ty;
    xSize = txs;
    ySize = tys;
  }

  void update(int mx, int my) {
    angle = atan2(my-y, mx-x);
  }

  void display() {
    pushMatrix();
    // pushMatrix 和 popMatrix 之间的元素会统一变换
    translate(x, y);
    // 变换整个坐标系的位置
    fill(255);
    strokeWeight(4);
    ellipse(0, 0, xSize, ySize);
    rotate(angle);
    fill(0);
    ellipse(xSize/4, 0, xSize/2, ySize/2);
    popMatrix();
  }
}

1-12-2 Bao.pde 文件里添加的代码

  Eye e1, e2; // 这里是需要在最上边添加
  
  ...
  
  // 转动的眼珠
  // 获取鼠标的坐标范围
  fill(0);
  stroke(0);
  float X = map(mouseX, 0, 600, -23, -11);
  float Y = map(mouseY, 0, 600, -11, 0);
  e1 = new Eye( 344 + 2 * X, 192 + 2 * Y, 7, 8);
  e2 = new Eye( 393 + 2 * X, 208 + 2 * Y, 7, 8);
  e1.display();
  e2.display();

bao-pro-2.gif

1-13 写文字

  PFont myFont = createFont("宋体", 50, false);
  textFont(myFont);
  text("战场小包的自画像", 135, 553);

老包你好难画啊-写文字.png

1-14 加打招呼声(猪叫声~

可忽略这一步骤

import processing.sound.*;导入报错
可参考下面的地址步骤进行安装与导入。

(地址:https://juejin.cn/post/7174111296667779109#heading-11)

 import processing.sound.*; // 这里是需要在最上边添加
 SoundFile song; // 音频
 void setup() {
  size(600, 600);
  song = new SoundFile(this, "pig.wav");
  song.loop(); // 循环播放猪嘟嘟叫声
  // song.play(); // 只播放一次猪嘟嘟叫声
 }

二、最终的展示结果

bao-pro-3.gif

三、技巧要点

3-1 调整(Ctrl + Shift + T)

要学会利用 processing 的 “调整” 进行操作。

( 快捷键是:Ctrl + Shift + T )

画老包.png

调整好后,最后退出调整的时候,要记得保存。(如果调得不好,可以不进行保存

老包好难画啊你.png

3-2 操作图

bao-pro.gif

四、后续

最后,在我不到一天的时间里,我就完成了老包的发的自画像。
老包感动得还一个劲的谢谢我。搞得我都不好意思了…

后续.png

五、完整代码

5-1 打招呼音频资料地址、cloud 声音导入教程

打招呼音频资料地址:南方者/processing-project

cloud 声音导入教程:https://juejin.cn/post/7174111296667779109#heading-11

5-2 Bao.pde

import processing.sound.*;


// 小猪佩奇
Eye e1, e2;
SoundFile song; // 音频
void setup() {
  size(600, 600);
  song = new SoundFile(this, "pig.wav");
  // song.loop(); // 循环播放猪嘟嘟叫声
  // song.play(); // 只播放一次猪嘟嘟叫声
}


void draw() {
  // 背景(草地、天空)
  background(139, 231, 122); // 背景颜色
  noStroke(); // 去掉描边
  
  // 画衣服
  fill(242, 88, 88); // 画笔
  bezier(187, 480, 221, 323, 418, 194, 478, 480); // 贝塞尔曲线
  
  
  // 脸部
  fill(250, 181, 230); // 画笔
  ellipse(345, 273, 221, 231);// 圆
  fill(291, 181, 230); // 画笔
  bezier(239, 245, 16, 60, 454, 149, 356, 177); // 贝塞尔曲线
  
  // 画猪鼻圈
  stroke(255, 148, 238);
  noFill();
  strokeWeight(3);
  ellipse(201, 167, 52, 59); // 鼻圈
  
  // 鼻孔
  fill(186, 101, 166);
  strokeWeight(13);
  ellipse(190, 162, 2, 13); // 左边鼻子
  ellipse(210, 169, 2, 13); // 右边鼻子
  
  // 耳朵
  noStroke();
  fill(291, 181, 230); // 画笔
  bezier(344, 149, 325, 77, 433, 81, 359, 156); // 贝塞尔曲线 左耳
  bezier(397, 178, 384, 93, 497, 81, 413, 182); // 贝塞尔曲线 右耳


  // 小手
  stroke(253, 181, 230);
  noFill();
  strokeWeight(10);
  // 左手
  line(412, 404, 433, 464);
  line(427, 448, 415, 459);
  line(429, 447, 444, 450);
  
  
  // 嘴巴(微笑)
  stroke(186, 101, 166);
  strokeWeight(5);
  noFill();
  bezier(280, 307, 321, 371, 359, 324, 365, 313); // 贝塞尔曲线


  // 脸红
  noStroke();
  fill(241, 151, 222);
  ellipse(411, 258, 62, 79);


  // 眼睛
  fill(255); // 画笔
  ellipse(359, 197, 38, 38); // 圆
  ellipse(310, 181, 38, 38); // 圆

  // 转动的眼珠
  // 获取鼠标的坐标范围
  fill(0);
  stroke(0);
  float X = map(mouseX, 0, 600, -23, -11);
  float Y = map(mouseY, 0, 600, -11, 0);
  e1 = new Eye( 344 + 2 * X, 192 + 2 * Y, 7, 8);
  e2 = new Eye( 393 + 2 * X, 208 + 2 * Y, 7, 8);
  e1.display();
  e2.display();
  PFont myFont = createFont("宋体", 50, false);
  textFont(myFont);
  //text("战场小包的自画像", 135, 553);
  text("一个令人深思的微笑", 90, 553);
}

5-3 Eye.pde

class Eye {
  float x, y;
  int xSize;
  int ySize;
  float angle = 0.0;

  Eye(float tx, float ty, int txs, int tys) {
    x = tx;
    y = ty;
    xSize = txs;
    ySize = tys;
  }

  void update(int mx, int my) {
    angle = atan2(my-y, mx-x);
  }

  void display() {
    pushMatrix();
    // pushMatrix 和 popMatrix 之间的元素会统一变换
    translate(x, y);
    // 变换整个坐标系的位置
    fill(255);
    strokeWeight(4);
    ellipse(0, 0, xSize, ySize);
    rotate(angle);
    fill(0);
    ellipse(xSize/4, 0, xSize/2, ySize/2);
    popMatrix();
  }
}

文章小尾巴

文章写作、模板、文章小尾巴可参考:《写作“小心思”》

  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
   我是南方者,一个热爱计算机更热爱祖国的南方人。
  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rocketmq源码-broker处理consumer拉取消息请求

前言 在前面consumer拉取消息的博客中,有说过,对于consumer,在拉取消息的时候,是需要指定code码的,在consumer去broker拉取消息的时候,指定的code码是:PULL_MESSAGE,所以这篇博客&a…

[附源码]Nodejs计算机毕业设计基于的婚恋系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

APISIX Ingress 如何支持自定义插件

摘要:本篇主要介绍了 Ingress 资源相关的语义,以及如何对 Ingress 资源进行能力的扩展。 作者:张晋涛,API7.ai 云原生技术专家,Apache APISIX PMC 成员,Apache APISIX Ingress Controller 项目维护者。 Ing…

基于C++ 实现简易图书管理系统【100010046】

图书管理系统 基于 C 实现简易图书管理系统 该项目是在学习完 C 语言后,独立完成设计开发的简易图书管理系统 设计的基本要求 基本完成对图书系统的设计,包含基本的功能,无界面设计。 要有明显的分类,对不同的进入者有不同的…

机器学习算法原理归纳总结:回归、聚类、支持向量、推荐、降维与神经网络

机器学习算法原理归纳总结:回归、聚类、支持向量、推荐、降维与神经网络 本文重点参考:唐宇迪博士的课程PPT [特别鸣谢] 完整版资料下载:机器学习算法原理详解代码实战 1.回归算法 2.逻辑回归 3.决策树 决策树实际上是根据样本的特征个数对样…

汇编语言第二章:寄存器

2. 寄存器 寄存器进行信息的存储,对于汇编程序员来说,CPU 中的主要部件是寄存器。8086CPU 有 14 个寄存器,这些寄存器分别是: AX BX CX DX SI DI SP BP IP CS SS DS ES PSW通用寄存器 8086所有的寄存器都是 16 位的&#xff0c…

Android Rust JNI系列教程(二) 创建第一个Rust JNI项目

前言 提到JNI,大家都会想到C,C.不过如今rust又给我们增加了一个选项,借助rust的jni库(https://github.com/jni-rs/jni-rs),我们可以很方便的使Android与rust交互.从本章起,我们将逐步地了解使用rust实现一些经典的jni方法. 创建Rust项目 创建工程 在命令行输入命令: cargo…

超算/先进计算的发展与应用是什么?

经过近十年的快速发展,我国在超算领域的实力已达到世界先进水平。1993年,我国第一台高性能计算机“曙光一号并行机”研制成功,打破了国外IT巨头对我国超算技术的垄断。 自此,我国不断加快超级计算机研制步伐。从全球超级计算机TO…

精华推荐 | 【MySQL技术专题】「主从同步架构」全面详细透析MySQL的三种主从复制(Replication)机制的原理和实战开发(原理+实战)

前提概要 随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作。此时,我们可以将数据库扩展成主从复制模式,将读操作和写操作分离开来,多台数据库分摊请求&#xff…

NEUQACM双周赛(三)

目录7-1 打字(C)题目描述:输入格式:输出格式:输入样例1:输出样例1:输入样例2:输出样例2:解题思路:7-2 分香肠(C,最大公约数)题目描述:输入格式:输出格式:输入样例:输出样例:解题思路…

节能降耗 | AIRIOT智慧电力综合管理解决方案

电力技术的发展推动各行各业的生产力,与此同时,企业中高能耗设备的应用以及输配电过程中的电能损耗,也在一定程度上加剧了电能供应压力。以工业制造业为例,企业的管理水平、能耗结构、生产组织方式都关系到能源的有效利用率&#…

电子招投标系统nodejs+vue+elementui

前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产生) 这文件夹就是在创建完项目后,cd到项目目录执行npm install后生成的文件夹,下载了项目需要的依赖项。 2、packag…

电商新模式——链动2+1模式为你带来社交电商新思路

随着流量入口价值的降低,电商 IP 时代的来临,移动社交电商获得了飞速的发展,在运营与营销的过程中,商家们往往为了降低营销成本,主动制造消费理由,通过各类促销、折扣来刺激消费,然而在回归商业…

Web3中文|NFT如何促进教育的发展?

自问世以来,NFT已经被应用于教育、艺术等多个领域。不过,相较于艺术行业,大多数人对NFT在教育界的作用知之甚少。 那么,就让我们来看看它们在课堂内外的影响都有哪些。 得益于区块链技术,NFT可以提高教育质量&#x…

【蓝桥杯选拔赛真题52】Scratch正话反说 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch正话反说 一、题目要求 编程实现 二、案例分析 1、角色分析

Android Rust JNI系列教程(三) Rust与Android互相调用

前言 Rust的JNI流程以及方法实际上和我们常见的C JNI是十分相似的.我们本章将使用Rust实现常见的JNI调用功能.关于更多的用法,可参考官方示例,github地址为https://github.com/jni-rs/jni-rs/blob/master/example/mylib/src/lib.rs. 基本交互功能实现 1. Java传String,返回b…

Java集合复习

文章目录集合概述、collection集合体系特点Collection集合的遍历增强for循环集合概述、collection集合体系特点 集合都是支持泛型的&#xff0c;但是集合只能存储对象&#xff0c;因此集合也叫做对象集合。 public static void main(String[] args) {Collection<String>l…

分布式 | 令人头疼的堆外内存泄露怎么排查?

作者&#xff1a;鲍凤其 爱可生 dble 团队开发成员&#xff0c;主要负责 dble 需求开发&#xff0c;故障排查和社区问题解答。少说废话&#xff0c;放码过来。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联…

OpenFace Win10 运行和抽离部分代码

需求&#xff1a;提取出OpenFace中的GazeAnaLyser 中的部分代码往一个写好的接口里面放&#xff0c;主要实现提取面部的所有关键点&#xff0c;估计出视线的功能&#xff1b; 一&#xff0c;openface的安装与使用 在win10上把openface跑起来这个链接够用了&#xff0c;这里主要…

非零基础自学Golang 第5章 流程控制 5.2 循环控制

非零基础自学Golang 文章目录非零基础自学Golang第5章 流程控制5.2 循环控制5.2.1 for循环5.2.2 break 跳出循环5.2.3 continue 继续循环第5章 流程控制 5.2 循环控制 5.2.1 for循环 Go语言中的循环逻辑通过for关键字实现。不同于其他编程语言&#xff0c;Go语言没有while关…