图形编辑器基于Paper.js教程06:鼠标画圆与椭圆

绘制椭圆与圆形:利用Paper.js进行交互式图形设计

在Web应用中实现交互式图形绘制功能,对于提高用户体验至关重要,尤其是在设计和艺术相关的应用中。Paper.js是一款强大的JavaScript库,专门用于处理矢量图形,它提供了一套简洁的API来操作HTML5的Canvas元素。本文通过一个实际例子,探讨如何使用Paper.js来实现椭圆和圆形的绘制。

在我们的示例中,用户可以使用鼠标在画布上绘制椭圆或圆形。首先,我们设置了Paper.js的工作环境并初始化了tool对象,这个对象将用来处理鼠标的相关事件。

演示效果

在这里插入图片描述

初始化工具和事件处理

onMouseDown事件处理函数中,我们记录鼠标按下时的位置作为椭圆的起始点,并初始化一个很小的椭圆。这个初始椭圆仅仅是为了在开始拖拽时有一个图形的基础,其大小几乎为零。

tool.onMouseDown = function (event) {startPoint = event.point; // 记录起始点toolShape = new paper.Path.Ellipse({point: [event.point.x - 1, event.point.y - 1],size: [1, 1],strokeColor,strokeScaling: false});
};
处理鼠标拖拽事件

onMouseDrag中,我们根据鼠标当前的位置与起始点计算出椭圆的最小外接矩形。通过计算鼠标按下点和当前点的最小和最大坐标值,我们能确定椭圆的边界。

const currentPoint = event.point;
const topLeft = new paper.Point(Math.min(startPoint.x, currentPoint.x), Math.min(startPoint.y, currentPoint.y));
const bottomRight = new paper.Point(Math.max(startPoint.x, currentPoint.x), Math.max(startPoint.y, currentPoint.y));
const rect = new paper.Rectangle(topLeft, bottomRight);

如果用户在拖拽时按下了Shift键,我们通过调整矩形的宽度和高度为相同的值,确保椭圆变为一个完美的圆形。

更新图形

每次拖拽时,我们首先移除之前的椭圆,然后基于新计算出的矩形绘制一个新的椭圆。

toolShape.remove();
toolShape = new paper.Path.Ellipse({from: rect.topLeft,to: rect.bottomRight,strokeColor,strokeScaling: false
});

部分代码

paper.setup('myCanvas');
const tool = new paper.Tool();
let toolShape = null;
let startPoint = null; // 记录鼠标按下的起始点
let strokeColor = "red"tool.onMouseDown = function (event) {startPoint = event.point; // 记录起始点// 初始化时创建一个很小的圆作为基础形状toolShape = new paper.Path.Ellipse({name: "fizzEllipse",point: [event.point.x - 1, event.point.y - 1], // 使其非常小size: [1, 1], // 很小的尺寸strokeColor,strokeScaling: false,data: {isLaserItem: true,},});
};tool.onMouseDrag = function (event) {// 根据鼠标按下的位置和当前位置计算椭圆的boundsconst currentPoint = event.point;const { x: startPx, y: startPy } = startPointconst topLeft = new paper.Point(Math.min(startPx, currentPoint.x),Math.min(startPy, currentPoint.y));const bottomRight = new paper.Point(Math.max(startPx, currentPoint.x),Math.max(startPy, currentPoint.y));const rect = new paper.Rectangle(topLeft, bottomRight);// 如果按下Shift键,保持宽高比为1:1,即绘制圆形if (event.modifiers.shift) {const maxSize = Math.max(rect.width, rect.height);rect.width = maxSize;rect.height = maxSize;// 重新定位以保持中心不变const center = rect.center;rect.center = center;}// 更新toolShape的形状为新的矩形区域toolShape.remove(); // 移除旧的形状toolShape = new paper.Path.Ellipse({from: rect.topLeft,to: rect.bottomRight,strokeColor,strokeScaling: false,data: {isLaserItem: true,},});
};
总结

通过这个简单的示例,我们展示了如何使用Paper.js来处理复杂的图形绘制需求。这种方式不仅允许用户灵活地绘制椭圆,还能通过简单的修改(如按下Shift键)快速地切换到圆形绘制模式。这种灵活性和易用性使得Paper.js成为处理在线图形设计的理想选择,无论是用于艺术创作、游戏设计还是任何需要图形绘制的应用。通过优化这些基本操作,开发者可以创建出更加丰富和互动的Web应用。

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

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

相关文章

智能语音门锁:置入NV170D语音芯片ic 打造便捷生活新体验

一、智能门锁语音芯片开发背景 随着科技的飞速发展,传统门锁的局限性日益凸显,无法满足现代人对高效、安全生活的需求。在这样的时代背景下,智能门锁应运而生,它不仅继承了传统门锁的基本功能,更通过融入先进的科技元素…

商标的近似分辩,商标起名称时注意!

曾有过网友发来商标名称,普推知商标老杨说有近似,然后网友起过新名称还是存有近似,或者加字,后面加的通用词,与先有商标名称也是近似。 “良信健康”这个名称健康是行业通用词,加成健康后变成四个字&#x…

出现 images and labels...0 found, xx missing, 0 empty, 0 corrupt 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 训练VOC的数据的时候出现如下问题: val: Scanning /home/l228/huoyanhao/yolov5/datasets/VOC/images/VOCdevkit/VOC2007/2007_val images and labels...0 found, 2510 missing, 0 empty, 0 corrupt: 100%|███████…

HTTP协议深入

1.了解web和网络基础 有客户端和服务端双方参与交互 客户端发送请求:request 服务端根据请求给出响应:response 请求通过URL来指定要获取都得资源 响应内容可以是HTML网页,或者用json表示的数据或者其他二进制文件内容 Web使用一种名为HTTP的协议作为规范&…

jEasyUI 添加分页组件

jEasyUI 添加分页组件 jEasyUI(jQuery EasyUI)是一个基于jQuery的用户界面插件集合,它为用户提供了一系列的UI组件,如菜单、窗口、数据网格等,以简化Web页面的开发。分页组件是jEasyUI中的一个重要部分,它允许用户在处理大量数据时,将数据分页显示,提高用户体验和数据…

AI与大模型工程师证书研修班报名啦!

人工智能大模型是指拥有超大规模参数(通常在十亿个以上)、超强计算资源的机器学习模型,能够处理海量数据,完成各种复杂任务,如自然语言处理、图像识别等。计算机硬件性能不断提升,深度学习算法快速优化&…

ESP32CAM物联网教学03

ESP32CAM物联网教学03 物联网小车 小智突发奇想:要是我在点灯物联APP中多增加几个按钮,控制小车的行驶方向,不就可以做成遥控小车了吗? 点灯物联控制小车的行驶方向 我们可以重新编辑点灯物联APP中的设备控件界面,如…

自定义控件之动画篇(六)——联合动画的代码及xml实现

在Android中,联合动画(即组合多种类型的动画)可以通过编写Java/Kotlin代码或XML资源文件来实现。这里我们将分别展示如何通过这两种方式来实现一个简单的自定义控件动画,该动画将包含平移和缩放效果。 1. XML 资源文件实现 首先…

AI学习指南机器学习篇-梯度提升树模型应用与Python实践

AI学习指南机器学习篇-梯度提升树模型应用与Python实践 机器学习领域中的梯度提升树(Gradient Boosting Tree)模型是一种非常强大且广泛应用的模型,它在各种数据类型和问题类型上都表现出色。在本篇博客中,我们将介绍如何使用Pyt…

开关电源中强制连续FCCM模式与轻载高效PSM,PFM模式优缺点对比笔记

文章目录 前言一、连续FCCM模式优点:缺点: 二,轻载高效PSM,PFM优点:缺点: 总结 前言 今天我们来学习下开关电源中,强制连续FCCM模式与轻载高效PSM,PFM模式优缺点对比 一、连续FCCM模式 优点: …

mac中如何恢复因为破解脚本导致的IDEA无法启动的问题

问题 为了在mac中安装免费的2024版idea,导致下载了一个脚本,使用这个脚本后,但是发现idea还没有破解,相反导致idea无法启动,每次点击,都会弹出“cannot start IDE…” 问题排查 在访达中点击mac的应用程…

docker -run hello-world超时

主要原因就是尝试拉取库的时候没有从阿里云镜像里拉&#xff0c;所以设置一下就好了 这里使用的是ubuntu系统&#xff08;命令行下逐行敲就行了&#xff09; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&quo…

什么是生成式人工智能

什么是生成式人工智能 生成式人工智能生成式人工智能的特点生成式人工智能的工作原理生成式人工智能的类型生成式人工智能面临的挑战数据要求训练复杂性控制输出道德问题监管障碍 生成式人工智能 生成式人工智能是指旨在生成书面文本、音频、图像或视频形式的新内容的人工智能…

Adobe Acrobat添加时间戳服务器

文章目录 前言一、Adobe Acrobat添加时间戳服务器1.打开Adobe Acrobat软件2.点击【菜单】→ 【首选项】3.点击【安全性】→【更多】4.点击【新建】5.输入【名称】→【服务器URL】 前言 一、Adobe Acrobat添加时间戳服务器 1.打开Adobe Acrobat软件 2.点击【菜单】→ 【首选项…

模拟退火算法1——简介

模拟退火算法来源于固体退火原理&#xff0c;将固体加温至充分高&#xff0c;再让其徐徐冷却&#xff0c;加温时&#xff0c;固体内部粒子随温升变为无序状&#xff0c;内能增大&#xff0c;而徐徐冷却时粒子渐趋有序&#xff0c;在每个温度都达到平衡态&#xff0c;最后在常温…

[C++][设计模式][访问器]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一2.代码二 1.动机 在软件构件过程中&#xff0c;由于需求的变化&#xff0c;某些类层次结构中常常需要增加新的行为(方法)&#xff0c;如果直接在基类中做这样的更改&#xff0c; 将会给子类带来很繁重的变更负担&#xff0c…

加密基本知识:密钥、签名、证书

一、密码(clpher) 是一种用于加密或者解密的算法 密码学中的密码&#xff08;cipher&#xff09;和我们日常生活中所说的密码不太一样&#xff0c;计算机术语『密码 cipher』是一种用于加密或者解密的算法&#xff0c;而我们日常所使用的『密码 password』是一种口令&#xff…

数据恢复篇:5 款最佳 Mac 数据恢复软件

说到保护我们的数字生活&#xff0c;数据恢复软件的重要性怎么强调都不为过。无论您是意外删除了假期照片的普通用户&#xff0c;还是面临硬盘损坏的专业人士&#xff0c;随之而来的恐慌都是普遍存在的。幸运的是&#xff0c;数据恢复工具可以缓解这些压力。在Mac用户可用的众多…

搜维尔科技:使用Manus VR手套和ART光学追踪功能实现虚拟场景工业仿真操作

&#xff1a;使用Manus VR手套和ART光学追踪功能实现虚拟场景工业仿真操作 搜维尔科技&#xff1a;使用Manus VR手套和ART光学追踪功能实现虚拟场景工业仿真操作

Android C++系列:JNI中的线程操作

Java中创建线程三种方式: 继承Thread类创建线程类;通过Runnable接口创建线程类;通过Callable和Future创建线程。Native 中支持的线程标准是 POSIX 线程,它定义了一套创建和操作线程的 API 。 我们可以在 Native 代码中使用 POSIX 线程,就相当于使用一个库一样,首先需要包…