当前位置: 首页 > news >正文

p5.js 椭圆的用法:从基础到创意应用

点赞 + 关注 + 收藏 = 学会了

椭圆是圆形的 “灵活亲戚”—— 它可以是胖的、瘦的、横的、竖的,是创作中非常实用的图形元素。p5.js 的 ellipse() 函数能轻松绘制各种椭圆,这篇教程将带你从零基础掌握它的用法,并通过实例学会创意应用。

认识 ellipse ():椭圆的 “身份证”

什么是 ellipse ()?

ellipse() 是 p5.js 专门用于绘制椭圆的函数。椭圆可以理解为 “被拉伸的圆”,当它的宽度和高度相等时,就变成了正圆形(这也是为什么 circle() 其实是 ellipse() 的特殊形式)。

在创作中,椭圆的用途非常广泛:可以画月亮、鸡蛋、叶子、人脸、按钮,甚至是抽象艺术中的基础元素。

核心参数:4 个数字定形状

ellipse() 函数的基本语法只有 4 个必要参数,非常简单:

ellipse(x, y, w, h)

参数解释:

  • x:椭圆中心点的水平位置(左右位置,越大越靠右)
  • y:椭圆中心点的垂直位置(上下位置,越大越靠下)
  • w:椭圆的宽度(水平方向的最大距离)
  • h:椭圆的高度(垂直方向的最大距离)

举个例子:ellipse(200, 150, 100, 60) 表示在画布(200,150)的位置,画一个宽 100、高 60 的椭圆。

宽高比决定形状

椭圆的 “胖瘦” 由宽度(w)和高度(h)的比例决定:

  • w > h 时:横向椭圆(比如躺着的鸡蛋)
  • w < h 时:纵向椭圆(比如竖着的鸡蛋)
  • w = h 时:正圆形(和 circle() 效果一样)

第一个椭圆

从最基础的代码开始,绘制一个简单的椭圆,感受参数的作用。

function setup() {// 创建一个400×400的画布createCanvas(400, 400);// 灰色背景(220是浅灰色,0是黑,255是白)background(220);
}function draw() {// 画一个椭圆:中心(200,200),宽200,高100(横向椭圆)ellipse(200, 200, 200, 100);// 再画一个小椭圆:中心(200,200),宽80,高150(纵向椭圆)fill(255, 200, 0); // 填充黄色ellipse(200, 200, 80, 150);
}

在浅灰色画布上,有一个黑色边框的横向椭圆(像压扁的圆),中间叠加了一个黄色的纵向椭圆(像拉长的圆)。

  • fill(255, 200, 0) 用来设置椭圆内部的颜色(这里是黄色,RGB 值)
  • 两个椭圆中心点相同(200,200),但宽高不同,形成了交叉的效果

进阶:给椭圆 “化妆”(样式设置)

和圆一样,我们可以通过 p5.js 的样式函数给椭圆设置颜色、边框等,让它更符合创作需求。

常用样式函数:

  • fill(r, g, b):设置填充色(RGB 值,0-255),noFill() 取消填充
  • stroke(r, g, b):设置边框色,noStroke() 取消边框
  • strokeWeight(weight):设置边框粗细(数值越大边框越粗)

function setup() {createCanvas(400, 300);background(255); // 白色背景noLoop(); // 只绘制一次,不重复刷新
}function draw() {// 1. 无填充、红色粗边框椭圆stroke(255, 0, 0); // 红色边框strokeWeight(5); // 边框粗5像素noFill(); // 不填充内部ellipse(100, 100, 120, 80);// 2. 蓝色填充、无边框椭圆noStroke(); // 取消边框fill(0, 0, 255); // 蓝色填充ellipse(250, 100, 100, 100); // 宽高相等,其实是圆形// 3. 绿色填充、黑色细边框椭圆stroke(0); // 黑色边框strokeWeight(2); // 细边框fill(0, 255, 0); // 绿色填充ellipse(175, 220, 180, 90);
}

在白色画布上有三个不同样式的椭圆,分别展示了 “纯边框”、“纯填充”、“填充 + 边框” 三种效果。

改变椭圆的 “定位方式”

默认情况下,ellipse(x, y, w, h) 中的 x, y 是椭圆的中心点。但通过 ellipseMode() 函数,我们可以改变这个规则,让定位更灵活。

ellipseMode () 的两种常用模式:

  • ellipseMode(CENTER):默认模式,x, y 是中心点(推荐新手先掌握这个)
  • ellipseMode(CORNER)x, y 是椭圆左上角的坐标(类似矩形的定位方式)

function setup() {createCanvas(400, 200);background(240);noLoop();// 画参考线(方便观察)stroke(200);line(0, 100, 400, 100); // 水平线line(200, 0, 200, 200); // 垂直线// 1. 默认模式(CENTER):x,y是中心点fill(255, 150, 150, 150); // 半透明粉色ellipseMode(CENTER);ellipse(200, 100, 100, 60);text("CENTER模式", 150, 40);// 2. CORNER模式:x,y是左上角fill(150, 150, 255, 150); // 半透明蓝色ellipseMode(CORNER);ellipse(200, 100, 100, 60);text("CORNER模式", 150, 180);
}

粉色椭圆以交叉点(200,100)为中心,蓝色椭圆以交叉点为左上角,清晰展示了两种定位方式的区别。

让椭圆 “动起来”:简单动画示例

椭圆的参数(位置、大小、颜色)可以通过变量控制,结合 draw() 函数的自动刷新特性,就能做出动画效果。

摇摆的椭圆(模拟钟摆)

let angle = 0; // 角度变量,控制摇摆function setup() {createCanvas(400, 300);
}function draw() {background(135, 206, 235); // 天空蓝背景// 计算椭圆的x坐标(用正弦函数实现左右摇摆)let x = 200 + sin(angle) * 100;// y坐标固定在150let y = 150;// 画摇摆的椭圆fill(255, 215, 0); // 金黄色noStroke();ellipse(x, y, 80, 50);// 角度增加,让动画持续(0.05控制速度)angle = angle + 0.05;
}
  • sin(angle) 会生成 -1 到 1 之间的波动值,乘以 100 后,x 坐标会在 100 到 300 之间摇摆
  • 每次 draw() 执行时,angle 增加 0.05,实现连续动画
  • 背景色在每次刷新时重绘,避免留下轨迹

呼吸效果(大小变化)

let size = 50; // 初始大小
let growing = true; // 是否在变大function setup() {createCanvas(400, 400);
}function draw() {background(0); // 黑色背景// 画一个紫色椭圆,中心在画布中间fill(128, 0, 128); // 紫色noStroke();ellipse(200, 200, size, size * 0.7); // 高度是宽度的70%// 控制大小变化(呼吸效果)if (growing) {size = size + 1; // 变大if (size > 200) growing = false; // 最大200,开始变小} else {size = size - 1; // 变小if (size < 50) growing = true; // 最小50,开始变大}
}

紫色椭圆在黑色背景上像呼吸一样反复变大、变小,宽高比保持不变(始终是横向椭圆)。

综合案例:漂浮的气球束

用椭圆制作一组更直观的漂浮气球,每个气球都是典型的椭圆形状,搭配绳子和飘动效果。

  1. 造型设计
    • 每个气球都是典型的纵向椭圆(高度略大于宽度),符合真实气球的形态
    • 加入白色高光椭圆(半透明),增强气球的立体感
    • 用棕色线条作为绳子,所有绳子汇聚到一个节点,形成 “束” 的效果
  2. 椭圆参数应用
    • 不同气球通过w(宽度)和h(高度)参数控制大小,体现多样性
    • 高光部分使用小比例椭圆,位置偏移主气球中心,模拟光线反射
    • 绳子节点用圆形椭圆(w=h)表示,展示椭圆与圆的关系
  3. 动画效果
    • 利用sin()cos()函数让气球产生自然的左右、上下浮动(类似真实气球飘动)
    • 每个气球设置不同的摆动速度(speed参数),避免动作单调
    • 浮动幅度控制在合理范围(±15 像素),保持整体协调
  4. 代码技巧
    • 用对象数组balloons存储多个气球的属性,方便批量管理和绘制
    • 通过循环遍历数组绘制所有气球,减少重复代码
    • 用透明度(RGBA 的第四个参数)处理高光,增强视觉层次感

// 存储多个气球的属性
let balloons = [];function setup() {createCanvas(500, 600);// 初始化5个气球,设置不同位置、大小和颜色balloons = [{x: 150, y: 300, w: 80, h: 100, color: [255, 99, 71], swing: 0, speed: 0.03},{x: 220, y: 250, w: 70, h: 90, color: [60, 179, 113], swing: 1, speed: 0.02},{x: 300, y: 280, w: 90, h: 110, color: [70, 130, 180], swing: 2, speed: 0.04},{x: 180, y: 320, w: 60, h: 80, color: [255, 165, 0], swing: 3, speed: 0.025},{x: 350, y: 310, w: 75, h: 95, color: [147, 112, 219], swing: 4, speed: 0.035}];
}function draw() {background(240); // 浅灰色背景// 绘制气球束的绳子交汇点let ropeX = 250;let ropeY = 400;fill(139, 69, 19); // 棕色ellipse(ropeX, ropeY, 10, 10); // 绳子结// 循环绘制每个气球for (let i = 0; i < balloons.length; i++) {let b = balloons[i];// 更新气球的摆动位置(左右浮动)b.swing += b.speed;let floatX = sin(b.swing) * 15; // 左右摆动幅度let floatY = cos(b.swing * 0.8) * 10; // 上下浮动幅度// 绘制气球(椭圆主体)fill(b.color);noStroke();ellipse(b.x + floatX, b.y + floatY, b.w, b.h);// 绘制气球高光(增加立体感)fill(255, 255, 255, 150); // 半透明白色ellipse(b.x + floatX - b.w/6, b.y + floatY - b.h/6, b.w/4, b.h/4);// 绘制连接绳子stroke(139, 69, 19);strokeWeight(2);line(b.x + floatX, b.y + floatY + b.h/2, ropeX, ropeY);}// 绘制地面fill(184, 134, 11); // 泥土色rect(0, height - 50, width, 50);
}

以上就是本文的全部内容啦,想了解更多 P5.js 用法欢迎关注 《P5.js中文教程》。

可以➕我 green bubble 吹吹水咯

点赞 + 关注 + 收藏 = 学会了

http://www.dtcms.com/a/296735.html

相关文章:

  • Java 实现 B/S 架构详解:从基础到实战,彻底掌握浏览器/服务器编程
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十九天-模拟面试前
  • 前端学习日记(十二)
  • MongoDB常用场景
  • jax study notes[19]
  • 【Kubernetes】通过 YAML 创建 nginx Pod 并验证,流程总结
  • Python编程进阶知识之第五课处理数据(matplotlib)
  • rust流程控制
  • Code Composer Studio:CCS 设置代码折叠
  • 20.OSPF路由协议·单区域
  • 枚举右,维护左高级篇
  • [明道云] -基础入门1- 什么是明道云 HAP 平台?
  • 【基础篇一】Python Web开发的演进历程(CGI → WSGI → ASGI)
  • 100条SQL语句分类精讲:从基础到进阶的实操指南
  • Matplotlib详细教程(基础介绍,参数调整,绘图教程)
  • 支付宝小程序 SEO 优化指南:从流量获取到商业转化
  • 【Linux】常用命令(一)
  • LockscreenCredential 类方法详解
  • 机器学习入门与经典knn算法表文解析
  • 模型的存储、加载和部署
  • 天邑TY1613_S905L3SB_安卓9-高安版和非高安版-线刷固件包
  • SSE与Websocket有什么区别?
  • P1049 [NOIP 2001 普及组] 装箱问题
  • 数据采集分析:从信息洪流中掘金的科学与艺术
  • Linux和Windows基于V4L2和TCP的QT监控
  • 欧姆龙CJ1MPLC配以太网模块,打造上位机、触摸屏、变频器高效通讯生态系统案例
  • 词嵌入维度与多头注意力关系解析
  • C++课设实践项目:C++构建的学籍管理系统
  • 【阿里云-ACP-1】疑难题解析
  • CPU绑核并独占