平移、旋转、缩放和媒体

一、平移

1.1translate()函数

       做转换工作可以用translate()函数,这个函数可以改变坐标系。通过改变默认的坐标系,我们可以创建不同的转换方式,包括平移、旋转和缩放。

1.2平移位置案例

       案例代码如图1

                                           图1

       保存运行如图2

                         图2

       这个案例中圆的位置是(0,0),但它在整个屏幕中移动,因为它受translate()函数影响。代码中translate()函数设置屏幕中(0,0)的坐标为(mouseX,mouseY),每次draw()函数运行,ellipse()函数会在新的位置绘制圆,也就是当前鼠标位置。

       注意:如果没有写background()函数,那么圆会随着鼠标的移动不断更新位置并绘制新的圆,代码如图3

                                 图3

       保存运行如图4

                         图4

1.3多重变换

       当一个平移被执行之后,它会被应用于接下来所有的绘图方法中。案例代码如图5

                                           图5

       保存并运行如图6

                     图6

       此案例中,第二个小圆的位置被移动了mouseX+40,mouseY+15的距离。这两个圆的位置都是(0,0),但translate()函数使得两个圆都移动到不同的位置。当然,再draw()函数中位移的信息叠加起来,但它们都会在每次运行draw()函数开始被重置。

二、旋转

2.1rotate()函数

       rotate()函数会旋转整个坐标系。它有一个参数,是要旋转的角度(用弧度制表示)。它总是相对于(0,0)旋转,也就是沿着原点旋转。

2.2沿角旋转

       案例代码如图7

                                        图7

       保存运行如图8

                        图8

       此案例size()函数设定的窗口高度为240,所以mouseX会是0~120,mouseX/100.0会是0~2.4。(注意:120是除以100.0,而不是100)。

2.3中心旋转

       一个图形想沿自己的中心上进行旋转,则它的中心必须绘制在(0,0)上。案例代码如图9

                                        图9

       保存并运行如图10

                      图10

       图9中图形由rect()函数设定宽为160,高20像素的矩形。因此设置矩形中心的位置是(-80,-10)的坐标上代替(0,0)成为图形的中心。

2.4移动然后再旋转

        为了让一个图形沿中心旋转并在屏幕中沿着原点移动。我们可以先用translate()函数,接着用rotate()函数,最后绘制图形让它的原点在(0,0)上。 代码如图11

                                          图11

        保存并运行如图12

                      图12

2.5旋转然后再移动

        代码如图13

                                         图13

        保存并运行如图14

                        图14

        代码运行时,矩形是沿着窗口左上角进行旋转的,距离顶角的位置由translate()函数决定,而translate()函数设的值是(mouseX,mouseY),由鼠标决定。

2.6一个关节臂

        在这个例子中,我们使用一系列translate()函数和rotate()函数来创造一个前后弯曲的连接臂。每一个translate()函数都进一步移动线的位置,每一个rotate()函数都叠加在上一个旋转以上进一步弯曲。代码如下

float angle=0.0;
float angleDirection=1;
float speed=0.005;
void setup(){
  size(240,120);
}
void draw(){
  background(204);
  translate(20,25);
  rotate(angle);
  strokeWeight(12);
  line(0,0,40,0);
  translate(40,0);
  rotate(angle*2.0);
  strokeWeight(6);
  line(0,0,30,0);
  translate(30,0);
  rotate(angle*2.5);
  strokeWeight(3);
  line(0,0,20,0);
  angle+=speed*angleDirection;
  if((angle>QUARTER_PI)||(angle<0)){
    angleDirection=-angleDirection;
  }
}

        保存并运行如图15

                   图15

        angle变量从0增长到QUARTET_PI(1/4Π),然后开始减少直至小于0,接着继续循环重复。angleDirection变量的值是1或者-1.这使得angle的值持续增加或者减少。

三、缩放

 3.1scale()函数

        scale()函数可以延展屏幕中的坐标,由于坐标按缩放尺度放大或缩小每一个绘制在窗口的图形也会按尺度放大或缩小,使用scale(3)使原图形放大3悲,scale(0.5)是缩小一半。 像rotate()函数,scale()函数也沿原点进行变换。为了让一个图形沿中心进行缩放,先移动在缩放,然后将图形的中心绘制在坐标(0,0)上。案例代码如图16

                                          图16

        保存并运行如图17

                        图17

3.2保持描边一致

        在图17中,我们可以发现矩形的描边不一致,为了保持描边的一致,需要用所期望的描边粗细除以一个标量值。案例代码如图18

                                           图18

        保存并运行如图19

                     图19

3.3独立的变换

        为了使每次变换的效果独立并且不相互影响,可以使用pushMatrix()和popMatrix()函数。当pushMatrix()运行的时候,它保存一个当前坐标系的备份,然后在调用popmatrix()函数之后还原。当希望变换的效果应用在另一个图形中并且不希望影响其他图形时,这是非常有用的。

        案例代码如图20

                                                 图20

        保存并运行如图21

                        图21

        在图21中我们可以看到小矩形总在同一个地方绘制,这是因为translate(mouseX,mouseY)函数的效果被popMatrix()函数抵消了。

3.4机器人

        代码如下

float x=60;
float y=440;
int radius=45;
int bodyHeight=180;
int neckHeight=40;
float easing=0.04;
void setup(){
  size(360,480);
  ellipseMode(RADIUS);
}
void draw(){
 strokeWeight(2);
 float neckY=-1*(bodyHeight+neckHeight+radius);
 background(0,153,204);
 translate(mouseX,y);
  if(mousePressed){
    scale(1.0);
  }else{
    scale(0.6);
}
//body
noStroke();
fill(255,204,0);
ellipse(0,-33,33,33);
fill(0);
rect(-45,-bodyHeight,90,bodyHeight-33);
//neck
stroke(255);
line(12,-bodyHeight,12,neckY);
//hair
pushMatrix();
translate(12,neckY);
float angle=-PI/30.0;
for(int i=0;i<=30;i++){
  line(80,0,0,0);
  rotate(angle);
}
popMatrix();
//head
noStroke();
fill(0);
ellipse(12,neckY,radius,radius);
fill(255);
ellipse(24,neckY-6,14,14);
fill(0);
ellipse(24,neckY-6,3,3);
}

        运行结果如图22

                                     图22

四、媒体

4.1图像

        将图像添加到草图的步骤如下:

(1)将图像添加到草图程序的data文件夹中。

(2)创建PImage变量存储图像。

(3)使用loadImage()将图像加载到变量。

        案例代码如图23

                                           图23

        保存并运行如图24

                                图24

        注意:Image()函数第一个参数是指定绘制的图像,第二和第三个参数是设置图像x和y坐标。第四和第五个参数是绘制图像的宽度和高度,如果没有第四和第五这两个参数,图像按原尺寸呈现。

4.2多个图像

        案例代码如图25

                                            图25

        保存并运行如图26

                                图26

        注意:中文不会显示而是会显示框框。

4.3鼠标控制图像

        当mouseX和mouseY的值被用于image()函数的第四和第五个参数时,图像的尺寸就会随着鼠标的变化而变化。案例代码如图27   

                                            图27

        保存并运行如图28

                                图28

4.4GIF和PNG的透明度

        代码和插入JPG图像的代码差不多,就是把JPG图像换成GIF或者PNG就可以了。例如gif的案例代码如图29

                                     图29

4.5字体

4.5.1添加文字步骤

(1)将字体添加到data文件中(点击工具,选择创建字体即可)。

(2)创建一个PFont变量存储字体。

(3)创建这个字体并使用createFont()函数将字体读取给变量,这会读取字体文件,然后创建一个特殊的可以被Processing使用的版本。

(4)使用textFont()设置当前字体。

4.5.2绘制字体案例

        用text()函数绘制文字,可以用textSize()函数设置文字的尺寸。

案例代码如图30

                                      图30

        保存并运行如图31

                        图31

4.6在字符串中存储文字

        案例代码如图32

                                                  图32

        保存并运行如图33

                                     图33

五、图形

5.1图形步骤

(1)将一个svg文件添加到data文件中。

(2)创建一个PShape变量来存储矢量文件。

(3)用loadShape()函数读取矢量文件。

5.2绘制图形

        根据5.1中的步骤我们可以使用shape()函数绘制图像。案例代码如图34

                                    图34

        注意:第四和第五个函数是设置它的宽度和高度。

5.3缩放图形

        案例代码如图35

                                图35

       

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter——全网最精致木鱼APP可上架应用市场

研发背景 工作之余&#xff0c;闲来无事&#xff0c;想着研发一款用户可能会经常用到的一款APP,并且能够顺便掌握一下Flutter Material Design 3 UI&#xff0c;所以就有了这款比较精致的木鱼APP的诞生。 开源代码 https://github.com/z244370114/woodenfish

期刊评价指标及其查询方法

1、期刊评价体系一 科睿唯安《期刊引证报告》&#xff08;Journal Citation Reports, JCR&#xff09; 科睿唯安每年发布的《期刊引证报告》&#xff08;Journal Citation Reports, JCR&#xff09;是一个独特的多学科期刊评价工具。JCR数据库提供基于引文数据的统计信息的期…

Linux下文件编译器-GCC/G++

前言 本文介绍了c/c的编译过程以及gcc/g的时使用 一.c/c翻译的本质&#xff1a;将高级语言翻译成二进制 1&#xff09;程序翻译过程&#xff1a; &#xff08;1&#xff09;预处理&#xff08;头文件展开、宏替换、去注释、条件编译&#xff09;还是C语言代码 ​ …

项目:基于gRPC进行项目的微服务架构改造

文章目录 写在前面基本使用封装客户端封装服务端Zookeeper 写在前面 最近学了一下gRPC进行远程调用的原理&#xff0c;所以把这个项目改造成了微服务分布式的架构&#xff0c;今天也是基本实现好了&#xff0c;代码已提交 这里补充一下文档吧&#xff0c;也算记录一下整个过程…

Ruoyi 快速开发平台

Ruoyi 快速开发平台 一、官网二、准备工作2.1 环境要求2.2 必要配置 三、运行系统3.1 后端运行3.2 前端安装及运行 四、自定义开发4.1 新增业务模块4.2 代码生成4.2.1 创建菜单4.2.2 后端代码4.2.3 前端代码 一、官网 链接: 前后端分离版本 回到目录 二、准备工作 2.1 环境要…

【C语言】链式队列的实现

队列基本概念 首先我们要了解什么是队列&#xff0c;队列里面包含什么。 队列是线性表的一种是一种先进先出&#xff08;First In Fi Out&#xff09;的数据结构。在需要排队的场景下有很强的应用性。有数组队列也有链式队列&#xff0c;数组实现的队列时间复杂度太大&#x…

【数据结构】链式二叉树的实现和思路分析及二叉树OJ

【数据结构】链式二叉树的实现和思路分析及二叉树OJ &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;数据结构 文章目录 【数据结构】链式二叉树的实现和思路分析及二叉树OJ前言一.链式二叉树的定义及结构二.链式二叉树的遍历2.1前序遍历2.2中…

Typora 【最新1.8.6】版本安装下载教程 (轻量级 Markdown 编辑器),图文步骤详解,免费领取(软件可激活使用)

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Typora 是一款专为 Markdown 爱好者设计的文本编辑器&#xff0c;它结合了简洁的界面设计与强大的 Markdown 渲染能力&#xff0c;为用户提供了一个流畅、高效的写作环境。以下是对 Typora 更详细的介绍&#xff1a; 核心特…

课程学习前提约束(拓扑排序练习)

很显然的拓扑排序 class Solution { public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {int n numCourses;vector<int> record(n1,0);queue<int> q;vector<vector<int>> graph(n 1);for (int i 0; i &l…

nfs和web服务器的搭建

&#xff08;一&#xff09;web服务器的搭建 1.配置基本环境 要点有&#xff0c;yum源&#xff0c;包含nginx和阿里云&#xff08;或者腾讯云或者华为云&#xff09;&#xff0c;这里的相关知识可以参考之前的yum配置笔记 2.安装nginx yum -y install nginx 3.验证并且开启服…

源码编译安装,及nginx服务控制、监控块

1.源码编译安装&#xff1a; [root17dns ~]# wget https://nginx.org/download/nginx-1.27.0.tar.gz 2.解压&#xff1a; [root17dns ~]# tar -zxvf nginx-1.27.0.tar.gz 3.安装gcc等工具 [root17dns ~]# yum -y install gcc gcc-c [root17dns ~]# yum -y install make lrzsz …

24年第三届钉钉杯大学生大数据挑战赛浅析

需要完整资料&#xff0c;请关注WX&#xff1a;“小何数模”&#xff01; 本次钉钉杯大数据挑战赛的赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是仅次于数模国赛的独一档&#xff0c;可以用于国赛前的练手训练。考虑到大家解题实属不易&#xf…

如何学习Doris:糙快猛的大数据之路(从入门到专家)

引言:大数据世界的新玩家 还记得我第一次听说"Doris"这个名字时的情景吗?那是在一个炎热的夏日午后,我正在办公室里为接下来的大数据项目发愁。作为一个刚刚跨行到大数据领域的新手,我感觉自己就像是被丢进了深海的小鱼—周围全是陌生的概念和技术。 就在这时,我的…

Django实战:开启数字化任务管理的新纪元

&#x1f680; Django实战&#xff1a;开启数字化任务管理的新纪元 &#x1f310; &#x1f4d6; 引言 在数字化转型的浪潮中&#xff0c;任务管理的智能化成为提升组织效能的关键。今天&#xff0c;我将带领大家深入了解我们最新开发的OFTS系统——一款创新的组织任务管理软…

双指针-【3,4,5,6,7,8】

第三题&#xff1a;快乐数 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/happy-number/算法思想&#xff1a; 1.每个…

SpringBoot上传超大文件导致OOM,完美解决办法

问题描述 上传大文件报错: Caused by: java.lang.OutOfMemoryError at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123) ~[?:1.8.0_381] at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117) ~[?:1.8.0_381] …

调用百度的大模型API接口实现AI对话!手把手教程!

本文介绍如何使用百度的大模型API接口实现一个AI对话项目 1 注册百度云 2 获取API接口 3 配置环境 4 代码编写与运行 5 chat models 1 注册百度云 搜索百度云&#xff0c;打开官网注册&#xff0c;充值一点点大米&#xff08;收费很低&#xff0c;大概生成几个句子花费一毛…

FRP配置内网穿透52版本以上适用

简述 适用frp配置内网穿透来说我们需要进行简单的区分&#xff0c;具有公网IP的服务器我们简称为服务端&#xff0c;内网的服务器我们可以简称为客户端&#xff0c;frp需要针对不同的服务器配置不同的文件 下载安装包 Linux下载地址 https://github.com/fatedier/frp/relea…

好的STEM编程语言有哪些?

STEM是科学&#xff08;Science&#xff09;&#xff0c;技术&#xff08;Technology&#xff09;&#xff0c;工程&#xff08;Engineering&#xff09;&#xff0c;数学&#xff08;Mathematics&#xff09;四门学科英文首字母的缩写&#xff0c;STEM教育简单来说就是在通过在…