在Processing中实现基于鼠标输入的2D图形独立旋转与拖动

在Processing中实现基于鼠标输入的2D图形独立旋转与拖动

本教程详细介绍了如何在processing中利用2d变换矩阵(translate、rotate、pushmatrix、popmatrix)和鼠标事件(mousedragged)实现多个图形的独立旋转和整体拖动。文章强调了使用相对坐标定义图形的重要性,并提供了示例代码,帮助开发者创建交互式的动态图形效果。

Processing 2D图形变换基础

Processing提供了一套强大的2D变换函数,允许我们对图形进行平移、旋转和缩放,而无需手动修改每个顶点的坐标。这些变换基于一个内部的变换矩阵,它定义了当前绘图环境的坐标系统。理解这些变换的关键在于它们是累积的,并且会影响其之后的所有绘图操作。

translate(x, y): 将坐标系的当前原点移动到新的位置(x, y)。在此之后绘制的所有图形都将相对于这个新原点进行定位。rotate(angle): 围绕当前坐标系的原点旋转绘图环境。angle通常以弧度表示。scale(s) 或 scale(sx, sy): 改变绘图环境的尺寸。

实现图形的静态旋转与拖动

当我们需要让图形在屏幕上保持其“中心”位置旋转,或者通过鼠标拖动来移动它们时,需要巧妙地结合translate()和rotate()。

1. 避免图形“飞出”屏幕

初学者在使用rotate()时常遇到的问题是图形会围绕画布的左上角(默认原点(0,0))旋转,导致图形移出可见区域。要解决这个问题,我们需要:

将坐标系原点移动到图形的中心:在调用rotate()之前,先使用translate(centerX, centerY)将坐标系原点移动到图形的旋转中心。使用相对坐标定义图形:图形的所有顶点坐标都应该相对于其旋转中心来定义。例如,如果图形的中心是(0,0),那么其顶点坐标应是相对于(0,0)的偏移量。

2. 鼠标拖动平移功能

为了实现通过鼠标拖动来移动整个图形组,我们可以利用mouseDragged()事件。这个函数会在鼠标被按下并拖动时持续触发。

float offsetX = 0; // 用于存储整体平移的X偏移量float offsetY = 0; // 用于存储整体平移的Y偏移量void setup() {  size(1800, 1000);}void draw() {  background(0); // 每帧清空背景  // 应用整体平移  translate(offsetX, offsetY);  // ... 在这里绘制所有图形 ...}void mouseDragged() {  // 更新偏移量,使图形跟随鼠标移动  offsetX = mouseX;  offsetY = mouseY;}

在上述代码中,offsetX和offsetY跟踪鼠标的当前位置,并通过translate(offsetX, offsetY)将整个绘图环境的原点移动到鼠标位置。这意味着所有后续绘制的图形都会以鼠标位置为新的(0,0)点进行绘制。

稿定抠图 稿定抠图

AI自动消除图片背景

稿定抠图 76 查看详情 稿定抠图

独立图形的旋转:pushMatrix()与popMatrix()

要让多个图形独立地旋转,例如一个顺时针旋转,另一个逆时针旋转,同时保持它们各自的中心,就需要使用pushMatrix()和popMatrix()。

pushMatrix(): 保存当前的变换矩阵状态。它将当前坐标系的状态(包括平移、旋转、缩放)压入一个中。popMatrix(): 恢复到最近一次pushMatrix()保存的变换矩阵状态。它从栈中弹出上一个状态,并将其设为当前坐标系状态。

通过在每个独立图形的绘制代码块前后分别调用pushMatrix()和popMatrix(),我们可以为每个图形创建独立的变换环境,互不干扰。

示例:两颗星形图形的独立旋转

以下示例展示了如何在Processing中创建两个星形图形,它们围绕各自的中心独立旋转(一个顺时针,一个逆时针),并且整个图形组可以通过鼠标拖动进行平移。图形的顶点坐标已调整为相对于其自身中心(0,0)的相对坐标。

float offsetX = 0; // 整体平移Xfloat offsetY = 0; // 整体平移Yvoid setup() {  size(1800, 1000);  // 初始时将整体平移中心设置在画布中央  offsetX = width / 2;  offsetY = height / 2;}void draw() {  background(0); // 每帧清空背景  // 1. 应用整体平移,将所有图形的逻辑中心移动到鼠标拖动的位置  translate(offsetX, offsetY);  // --- 第一个星形 (顺时针旋转) ---  pushMatrix(); // 保存当前变换状态 (包括整体平移)    // 2. 围绕当前原点 (即星形的中心) 旋转    rotate(frameCount * 0.01); // frameCount是一个内置变量,提供连续的动画值    // 3. 绘制第一个星形 (使用相对于其中心的坐标)    fill(139, 19, 191);    triangle( 100,  100,    0,  350, -100,  100);    fill(20, 134, 245);    triangle( 200, -100,  350,  100,  100,  100);    fill(191, 8, 8);    triangle(-100,  100, -350,  100, -200, -100);    fill(86, 165, 3);    triangle(-200, -100, -350, -400,    0, -150);    fill(167, 167, 166);    triangle(   0, -150,  350, -400,  200, -100);  popMatrix(); // 恢复到pushMatrix()时的变换状态 (取消了第一个星形的旋转)  // --- 第二个星形 (逆时针旋转) ---  pushMatrix(); // 再次保存当前变换状态 (包括整体平移)    // 2. 围绕当前原点 (即星形的中心) 逆时针旋转    rotate(frameCount * -0.01);    // 3. 绘制第二个星形 (使用相对于其中心的坐标)    fill(139, 19, 191);    triangle(-100, -150,    0, -400,  100, -150);    fill(86, 165, 3);    triangle( 100, -150,  350, -150,  200,   50);    fill(167, 167, 166);    triangle(-200,   50, -350, -150, -100, -150);    fill(20, 134, 245);    triangle(-200,   50, -350,  350,    0,  150);    fill(191, 8, 8);    triangle( 200,  50, 350, 350,   0, 150);  popMatrix(); // 恢复到pushMatrix()时的变换状态 (取消了第二个星形的旋转)  // 绘制中心圆 (相对于当前原点,即整体平移后的中心)  fill(0, 0, 0);  // 注意:Processing内置的圆形绘制函数是ellipse,这里为了兼容原代码,使用自定义的circle函数  circle(0, 0, 425);}// 鼠标拖动时更新整体平移偏移量void mouseDragged() {  offsetX = mouseX;  offsetY = mouseY;}// 自定义circle函数,实际调用ellipsevoid circle(float x, float y, float r) {  ellipse(

以上就是在Processing中实现基于鼠标输入的2D图形独立旋转与拖动的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1026140.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Golang如何使用compress/gzip实现文件压缩
上一篇 2025年12月2日 01:49:27
win11系统麦克风没声音怎么办
下一篇 2025年12月2日 01:49:31

相关推荐

  • JavaScript中的尾调用优化(TCO)在ES6中如何工作?

    尾调用是指函数的最后一个动作调用另一个函数,ES6引入尾调用优化以重用栈帧、避免内存溢出,支持真正的尾递归,如阶乘函数通过累积参数实现。 尾调用优化(Tail Call Optimization, TCO)是ES6引入的一项语言特性,目的是在特定条件下重用函数调用栈帧,避免不必要的内存增长,从而支持…

    2026年9月21日
    200
  • Via浏览器在鸿蒙系统上运行会闪退怎么办_Via浏览器鸿蒙系统闪退的解决方法

    Via浏览器闪退可依次尝试清除缓存数据、更新或重装应用、检查系统更新与存储空间、禁用硬件加速功能,必要时通过开发者模式启用USB调试并使用DevEco Studio捕获日志定位问题。 如果您在使用Via浏览器访问网页时,应用突然关闭或无法正常启动,则可能是由于软件兼容性或系统资源问题导致。以下是解决…

    2026年9月21日
    400
  • 怎样使用VSCode的调试控制台执行表达式并实时监控变量状态?

    在VSCode调试时,通过调试控制台可直接执行表达式并查看变量状态;2. 启动调试并暂停在断点后,打开“调试控制台”输入表达式如10*5或user.getName()即时求值;3. 使用“监视”面板添加如count等表达式持续跟踪变量变化;4. 通过“作用域”面板查看局部变量、闭包中的上下文信息,支…

    2026年9月21日
    100
  • 零跑D16官宣 增程版配80度超大电池 明年上半年上市

      10月16日,零跑汽车正式公布其全新旗舰车型零跑d19的内饰设计与核心技术信息。作为基于零跑自研“旗舰d平台”打造的高端车型,零跑d19计划于2025年第四季度完成内饰解密,2026年上半年开启预售并正式上市。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSee…

    2026年9月20日
    100
  • win10默认网关不可用怎么办_win10默认网关错误修复方法

    1、重启路由器和网卡适配器可刷新网络状态;2、重置TCP/IP协议栈以修复通信故障;3、更新或重装网卡驱动解决兼容性问题;4、关闭电源管理节能设置确保网卡持续工作;5、设置IPv4自动获取地址以正确获取网关信息。 如果您尝试访问互联网,但网络连接显示“默认网关不可用”,则可能是由于网络配置或设备通信…

    2026年9月20日
    000
  • VSCode的侧边栏图标代表什么?

    资源管理器(文件夹图标)用于管理项目文件结构,支持新建、重命名、删除和拖拽操作;2. 搜索(放大镜图标)实现全局文本查找与替换,支持正则表达式及范围筛选;3. 源代码管理(分支图标)集成Git功能,可查看变更、提交代码并同步远程仓库;4. 运行和调试(虫子图标)支持断点调试、变量监控及多语言启动配置…

    2026年9月20日
    000
  • 在Java中异常信息如何通过日志框架打印

    正确使用日志框架记录异常需将异常对象作为最后一个参数传入error等方法,如logger.error(“提示信息”, exception),避免仅拼接toString()导致丢失堆栈;包装异常时应通过super(message, cause)保留异常链;同时确保日志配置中pa…

    2026年9月20日
    000
  • VSCode的调试控制台有哪些高级用法?

    调试控制台是VSCode中强大的交互式环境,支持运行表达式、修改变量、调用函数和使用console API。1. 可执行JS/TS表达式查看变量、调用方法或计算逻辑;2. 能动态修改变量值以测试不同场景;3. 支持调用已定义函数验证行为;4. 可用console.table、group、trace等…

    2026年9月20日
    100
  • 如何在Java中使用异常处理记录系统日志

    通过结合异常处理与日志记录可提升Java系统可维护性,使用try-catch捕获异常并借助SLF4J+Logback等框架记录详细信息,避免空catch块,在多层架构中分层记录上下文日志,并通过全局异常处理器统一处理未捕获异常,确保错误可追溯。 在Java中,异常处理与日志记录结合使用能有效提升系统…

    2026年9月13日
    300
  • AlmaLinux 10.1 正式发布,支持 Btrfs 文件系统

    社区驱动的linux发行版almalinux近日宣布,其最新版本almalinux 10.1已正式加入对btrfs文件系统的原生支持。作为一款现代写时复制(copy-on-write, cow)文件系统,btrfs以出色的容错机制、自动修复能力和简化的管理流程著称,近年来已被fedora和opens…

    2026年9月13日
    200
  • Java中类与对象的内存结构详解

    类信息存方法区,对象实例在堆中,引用在栈中;静态变量共享,实例变量独立。 在Java中,类与对象的内存结构是理解程序运行机制的关键。当一个Java程序执行时,JVM(Java虚拟机)会管理不同的内存区域,如堆、栈、方法区等。类和对象在这些区域中的分布直接影响程序的性能与行为。 类信息存储在方法区 类…

    2026年9月13日
    100
  • 如何配置VSCode以附加(Attach)模式调试一个正在运行的Node.js或Python进程?

    要使用VSCode附加模式调试Node.js或Python进程,需先以可调试方式启动程序。对于Node.js,通过–inspect系列参数开启调试端口(如9229),并在launch.json中配置”request”: “attach”及对…

    2026年9月12日
    100
  • 怎样通过扩展API自定义鼠标悬停提示的样式和内容?

    通过HTML、CSS和JavaScript可自定义tooltip样式与内容,支持静态展示与动态渲染;利用data属性或UI库(如Ant Design、Element Plus)的API实现灵活扩展,结合事件监听与DOM操作可创建富文本提示;建议封装通用模块以统一管理,兼顾可访问性与多端兼容。 通过扩…

    2026年9月12日
    200
  • 哪些VSCode扩展是Web开发者的必备神器?

    推荐VSCode扩展提升Web开发效率:Auto Rename Tag、Live Server、CSS Modules、JavaScript代码片段增强基础编码;Vetur/Volar、ESLint、Prettier、Tailwind CSS IntelliSense支持框架与规范;Path Int…

    2026年9月12日
    100
  • 除了内置的终端,VSCode有哪些插件能极大提升命令行的工作效率?

    Code Runner可一键运行多语言代码并显示结果,适合快速测试;2. Terminal Tabs通过标签页管理多个终端会话,支持重命名和快捷切换;3. Shell Command允许对文件或选中文本执行自定义shell命令,提升重复操作效率;4. Task Explorer可视化运行项目脚本,自…

    2026年9月12日
    100
  • 苹果手机QQ闪退怎么看日志_苹果手机QQ闪退日志查看教程

    普通用户可通过设置中的分析数据查找QQ闪退日志,查看时间戳和错误信息;2. 进阶用户可用Xcode连接Mac导出完整.crash文件;3. 检查iOS版本兼容性、应用来源及重装可辅助排查问题。 苹果手机上的QQ频繁闪退,想查原因就得看崩溃日志。普通用户和开发者能用的方法不太一样,但都能找到线索。下面…

    2026年9月12日
    000
  • Java中如何设计统一的异常响应结构

    统一异常响应结构通过定义Result类、枚举错误码、自定义异常和@ControllerAdvice全局处理,实现API返回一致性。1. 创建Result封装返回数据;2. 定义ErrorCode枚举管理错误码;3. 设计BusinessException携带错误信息;4. 使用@Controller…

    2026年9月12日
    400
  • 网易CodeWave发布人工智能开发能力,全面升级企业智能研发新模式

    网易CodeWave发布人工智能开发能力,全面升级企业智能研发新模式网易CodeWave发布人工智能开发能力,全面升级企业智能研发新模式网易CodeWave发布人工智能开发能力,全面升级企业智能研发新模式网易CodeWave发布人工智能开发能力,全面升级企业智能研发新模式

    2025年10月14日,网易codewave举办“用ai重构研发方式”主题沟通会,正式对外发布多项智能开发能力,支持从需求梳理、产品构思、开发部署、迭代等全流程研发智能化。作为面向企业研发场景的开发平台,网易codewave采用可视化与ai融合的开发方式,支持每一步操作可由ai自动完成,同时保留人工…

    2026年9月12日 用户投稿
    100
  • Android中单按钮动态导航:基于Intent状态管理实现多页面跳转

    本教程详细讲解如何在Android应用中,通过一个按钮实现动态跳转到不同Activity。核心策略是利用Intent的Extra机制,在Activity之间传递并管理导航状态。我们将展示如何根据当前状态,在主界面按钮点击时,智能地选择目标Activity,并确保返回时状态的正确更新,从而实现灵活的用…

    2026年9月12日
    100
  • Coral NPU— 谷歌推出的全栈开源AI平台

    Coral NPU是什么 coral npu 是由谷歌推出的一个全栈开源人工智能平台,专为低功耗的边缘计算设备(例如智能手表、ar眼镜等)打造,旨在应对性能瓶颈、生态碎片化以及用户隐私保护三大核心挑战。该npu基于开放的 risc-v 指令集架构,集成了标量核心、向量执行单元和矩阵运算单元,能够高效…

    2026年9月12日
    300

发表回复

登录后才能评论
关注微信