图形编辑器基于Paper.js教程05:鼠标画矩形与正方形

news2024/11/17 3:28:08

优化矩形绘制:在Paper.js中有效管理鼠标事件

在图形应用开发中,准确和高效地处理用户输入,如鼠标事件,是提升用户体验的关键。本文通过一个使用Paper.js的示例,展示如何优化矩形绘制过程,特别是处理不同方向的拖拽动作。

Paper.js是一个强大的矢量图形脚本框架,允许开发者通过JavaScript与Canvas元素交互。在此框架中,Tool对象用于处理鼠标事件,如点击和拖拽,可以用来绘制形状如矩形。

在常规做法中,开发者可能会在鼠标按下(onMouseDown)事件中创建一个矩形,并在拖拽(onMouseDrag)事件中重新创建矩形以调整大小。

我们可以在onMouseDown事件中初始化一个大小为零的矩形,并在onMouseDrag事件中调整这个矩形的边界, 具体做法是记录鼠标按下时的初始位置,并在拖拽时实时计算矩形的左上角和右下角坐标,并重建它。使用Math.minMath.max函数可以确保无论拖拽方向如何,矩形都能正确绘制。

const rectTopLeft = new paper.Point(
    Math.min(startPoint.x, endPoint.x),
    Math.min(startPoint.y, endPoint.y)
);
const rectBottomRight = new paper.Point(
    Math.max(startPoint.x, endPoint.x),
    Math.max(startPoint.y, endPoint.y)
);

此外,如果用户在拖拽时按下Shift键,我们通过调整计算逻辑,使矩形维持正方形的形状,进一步增加应用的交互性。

通过这种优化,我们不仅提升了应用的性能,减少了不必要的计算和内存使用,还保证了无论用户如何操作,界面都能流畅且准确地响应。这对于设计和绘图软件尤为重要,确保了用户体验的连贯性和响应速度。

这种方法的实施显示了在处理图形和用户交互时,如何通过优化逻辑和利用框架的特性来提升性能和用户体验。

演示效果

在这里插入图片描述

部分代码

paper.setup('myCanvas');
const tool = new paper.Tool();
let toolShape = null;
let strokeColor = 'red';
let startPoint = null;  // 记录鼠标按下时的起始点

tool.onMouseDown = function (event) {
  startPoint = event.point;  // 保存起始点
  toolShape = new paper.Path.Rectangle({
    name: "FizzRect",
    point: startPoint,
    size: [0, 0], // 初始大小设为0
    strokeColor,
    strokeScaling: false,
    data: {
      isLaserItem: true,
    },
  });
};

tool.onMouseDrag = function (event) {
  if (!toolShape || !startPoint) {
    return;
  }

  const endPoint = event.point;
  const rectTopLeft = new paper.Point(
    Math.min(startPoint.x, endPoint.x),
    Math.min(startPoint.y, endPoint.y)
  );
  const rectBottomRight = new paper.Point(
    Math.max(startPoint.x, endPoint.x),
    Math.max(startPoint.y, endPoint.y)
  );

  let width = rectBottomRight.x - rectTopLeft.x;
  let height = rectBottomRight.y - rectTopLeft.y;

  // 如果按下Shift键,则创建正方形
  if (event.modifiers.shift) {
    const maxSize = Math.max(width, height);
    width = height = maxSize;
    rectBottomRight.x = rectTopLeft.x + maxSize;
    rectBottomRight.y = rectTopLeft.y + maxSize;
  }

  // 更新矩形的坐标
  toolShape.remove();  // 移除旧矩形
  toolShape = new paper.Path.Rectangle({
    name: "拿我格子衫来Rect",
    from: rectTopLeft,
    to: rectBottomRight,
    strokeColor,
    strokeScaling: false,
    data: {
      isLaserItem: true,
    },
  });
};

总结

我们写的这个案例,它不仅使得矩形可以从任意方向精确地绘制,还能通过简单的逻辑处理如按Shift键约束为正方形,增强了用户的交互体验。

最终,这个示例展示了如何有效利用JavaScript和HTML5 Canvas技术,通过Paper.js框架来实现高效且用户友好的图形处理解决方案。对于开发者而言,理解并应用这些技术可以在创建图形密集型应用时,提供更好的用户体验和性能优化。

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

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

相关文章

【大模型】基于ChatGLM进行微调及应用 [更新中......]

文章目录 一、前言二、说明2.1 代码结构2.2 依赖包版本 三、启动对话演示3.1 命令行交互 cli_demo.py3.2 网页交互 web_demo.py 四、微调模型4.1 基于 P-Tuning v2 微调模型4.1.1 软件依赖4.1.2 下载数据集4.1.3 下载模型文件4.1.4 操作步骤 4.2 基于 Full Parameter 微调模型4…

大模型简介

大模型框架 大模型基于深度学习,利用大量数据和计算资源训练具有大量参数的神经网络模型。通过不断地调整模型参数,使得模型能够在各种任务中取得最佳表现。 通常说的大模型的“大”的特点体现在:参数数量庞大、训练数据量大、计算资源需求…

记一次EasyExcel的错误使用导致的频繁FullGC

记一次EasyExcel的错误使用导致的频繁FullGC 一、背景描述二、场景复现三、原因分析四、解决方案五、思考复盘 一、背景描述 繁忙的校招结束了,美好的大学四年也结束了,作者也有10个月没有更新了。拿到心仪的offer之后也开始了苦B的打工生活。 最近接到…

Python爬取豆瓣电影+数据可视化,爬虫教程!

1. 爬取数据 1.1 导入以下模块 import os import re import time import requests from bs4 import BeautifulSoup from fake_useragent import UserAgent from openpyxl import Workbook, load_workbook1.2 获取每页电影链接 def getonepagelist(url,headers):try:r reque…

JAVA里的BigDecimal用法

public class BigDecimaldemo1 {public static void main(String[] args) {System.out.println(0.090.01);//为什么不是0.10呢?} }在使用float或者double类型的数据在进行数学运算的时候,很有可能会产生精度丢失问题。我们都知道计算机底层在进行运算的时候&#x…

SpringBoot中整合ONLYOFFICE在线编辑

SpringBoot整合OnlyOffice SpringBoot整合OnlyOffice实现在线编辑1. 搭建私有的OnlyOffice的服务2. SpringBoot进行交互2.1 环境2.2 我们的流程2.3 接口规划2.3.1 获取编辑器配置的接口2.3.2 文件下载地址2.3.3 文件下载地址 3. 总结4. 注意4.1 你的项目的地址一定一定要和only…

详细django框架+SIMPLEUI+import_export设计web管理后台(四)

目录 1.项目简介 2.搭建django框架 3.引入 SIMPLEUI插件 3.1安装simpleui 3.2 修改设置 3.3 克隆静态资源 3.4登陆测试 4.优化页面 4.1 修改后台名称显示 4.2 增加页面LOGO图标 4.3增加网址图标:目前主要的浏览器都支持favicon.ico图标 4.4 修改APP名称显…

用摄像头实现识别道路中的车道线、行人与车辆检测(级联分类器、HOG+SVM、行人检测)

基于树莓派的智能小车,用摄像头实现识别道路中的车道线识别、行人检测与车辆检测。 本项目旨在开发一套基于摄像头的智能道路环境感知系统,该系统能够实时识别道路中的车道线、行人与车辆,为自动驾驶汽车、智能交通管理以及辅助驾驶系统提供关…

Go语言数据类型--常量、iota枚举、数据类型分类

变量:程序运行期间,可以改变的量,变量声明需要var关键字。 常量:程序运行期间,不可以改变的量,变量声明需要const关键字。 自动推导 常量的自动推导不能加:; 不同类型数据的声明 可以使用…

华为OD机试 - 表演赛游戏分组 - 动态规划(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测…

目标检测算法讲解:从传统方法到深度学习,全面解析检测技术的演进与应用!

在计算机视觉领域,目标检测是一个基本且关键的任务,它不仅涉及图像中对象的识别,还包括确定这些对象的具体位置。这一任务通常通过算法来实现,这些算法能够识别出图像中的一个或多个目标,并给出每个目标的类别和位置。…

【面试系列】产品经理高频面试题及详细解答

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…

4.BeanFactory

可以看出BeanFactory表面上只有getBean相关的方法。 实际上控制反转、基本的依赖注入、Bean的生命周期的各种功能,都是由BeanFactory的实现类来实现的。(DefaultListableBeanFactory) DefaultListableBeanFactory管理单例对象DefaultSinglet…

第11章 规划过程组(11.6规划进度管理)

第11章 规划过程组(二)11.6规划进度管理,在第三版教材第385页;#软考中级##中级系统集成项目管理师# 文字图片音频方式 第一个知识点:主要输出 1、进度管理计划 准确度 定义活动持续时间估算的可接受区间&#xff0…

springboot拦截器,ThreadLocal(每个线程的公共区域)

拦截器 配置信息(拦截所有请求) 其实这种可以作为springAOP作日志记录

flask数据连接池、定制命令

【 一 】数据库连接池 【 1 】flask操作mysql 基本的使用不使用连接池 from flask import Flask, jsonify import pymysqlapp Flask(__name__) app.debug Trueapp.route(/) def index():conn pymysql.connect(userroot,password"123123",host127.0.0.1,databas…

计算两个经纬度之间的球面距离(基于Mysql和PHP实现)

计算两个经纬度之间的球面距离 1、MySQL实现方式 - 基于空间函数(ST_Distance_Sphere)实现 前置条件:确保您使用的是 MySQL 8.0 或更高版本,因为较早的版本对地理空间的支持有限。 1.1 创建表和索引 说明:设置 location 为 point 类型 #…

Wireshark - tshark支持iptables提供数据包

tshark现在的数据包获取方式有两种,分别是读文件、网口监听(af-packet原始套接字)。两种方式在包获取上,都是通过读文件的形式;存在文件io操作,在专门处理大流量的情境下, 我们复用wireshark去做…

DNS访问百度

DNS,英文全称是 domain name system,域名解析系统,它的作用也很明确,就是域名和 IP 相互映射。 假设你要查询 baidu.com 的 IP 地址: 首先会查找浏览器的缓存,看看是否能找到 baidu.com 对应的IP地址,找到就直接返回&…

【NOI-题解】1326. 需要安排几位师傅加工零件1228. 排队打水问题1229. 拦截导弹的系统数量求解

文章目录 一、前言二、问题问题:1326. 需要安排几位师傅加工零件问题:1228. 排队打水问题问题:1229. 拦截导弹的系统数量求解 三、感谢 一、前言 本章节主要对贪心问题进行讲解,包括《1326. 需要安排几位师傅加工零件》《1228. 排…