图形编辑器基于Paper.js教程14:使用 Paper.js 绘制数学图形与交互的实现,画布缩放保持大小的圆,正弦,余弦,螺旋线

news2024/11/14 19:52:55

技术分析:使用 Paper.js 绘制数学图形与交互的实现

在现代Web开发中,动态图形和交互式视觉表现已成为提升用户体验的重要手段。通过一个详细的示例,我们将探索如何使用 Paper.js 进行数学图形(正弦曲线、余弦曲线和螺旋线)的绘制,并实现固定尺寸的圆形及其随视图缩放的调整。此外,本文将深入分析鼠标滚轮和拖动事件处理的缩放与视图移动实现。

效果演示

在这里插入图片描述

初始设置与固定尺寸圆的实现

首先,初始化 Paper.js 并设置画布:

paper.setup('myCanvas');

固定尺寸的圆的绘制与其在视图缩放时的尺寸调整是本案例的一大亮点。圆形在不同的缩放级别下需要保持其视觉上的实际尺寸不变,实现代码如下:

const radius = 50;
var shape = new paper.Shape.Circle(new paper.Point(0, 0), radius);
shape.set({
  strokeColor: 'green',
  strokeWidth: 1,
  strokeScaling: false
});

function zoomView(factor, center) {
  paper.view.scale(factor, center);
  shape.radius = new paper.Point(radius, 0).divide(new paper.Point(paper.view.zoom, 0)).x;
}

在这段代码中,通过 zoomView 函数调整视图的缩放,并重新计算圆的半径,以确保其在屏幕上的尺寸不受缩放影响。这利用了 Paper.js 的坐标变换功能,通过当前的缩放级别调整圆的半径。

正弦和余弦曲线的绘制

正弦和余弦曲线的绘制展示了 Paper.js 处理数学函数图形的能力。曲线是通过迭代添加点到路径中创建的:

var sinPath = new paper.Path({ strokeColor: 'red', strokeWidth: 1, strokeScaling: false });
var cosPath = new paper.Path({ strokeColor: 'blue', strokeWidth: 1, strokeScaling: false });

for (let i = -100; i < 100; i += 0.1) {
  sinPath.add(new paper.Point(i, Math.sin(i)));
  cosPath.add(new paper.Point(i, Math.cos(i)));
}
sinPath.smooth({ type: 'continuous' });
cosPath.smooth({ type: 'continuous' });

这里的 smooth() 函数调用优化了曲线的视觉表现,使得生成的路径更加平滑。

螺旋线的生成

螺旋线的绘制则更加复杂,涉及到极坐标的转换和多个点的迭代生成:

let a = 0, b = 10;  // 控制螺旋线的形状和大小
let numRevolutions = 15;  // 螺旋的圈数
let step = 2 * Math.PI / 360;  // 角度增量

for (let theta = 0; theta < numRevolutions * 360 * step; theta += step) {
  let r = a + b * theta;
  let x = center.x + r * Math.cos(theta);
  let y = center.y + r * Math.sin(theta);
  lxpath.add(new paper.Point(x, y));
}

lxpath.smooth();
视图缩放与拖动事件处理

最后,实现了鼠标滚轮和拖动事件处理,允许用户通过鼠标操作来缩放和移动视图:

// 鼠标滚轮处理缩放
paper.view.element.addEventListener('wheel', function (event) {
  event.preventDefault();
  var delta = event.deltaY > 0 ? 0.9 : 1.1;
  var mousePosition = new paper.Point(event.offsetX, event.offsetY);
  var viewPosition = paper.view.viewToProject(mousePosition);
  paper.view.scale(delta, viewPosition);
  shape.radius = new paper.Point(radius, 0).divide(new paper.Point(paper.view.zoom, 0)).x;
});

// 鼠标拖动处理移动
const tool = new paper.Tool();
tool.onMouseDown = (event) => { ... };
tool.onMouseDrag = (event) => { ... };
tool.onMouseUp = () => { ... };

通过 wheel 事件监听器,用户可以用滚轮来缩放视图,而 Tool 的使用则允许通过拖动来平移视图。这些交互增强了用户对动态生成图形的控制,使得视图的操作更加直观和灵活。

结论

通过这个案例,我们可以看到 Paper.js 在处理复杂图形和交互式动画方面的强大能力。这不仅为开发者提供了一个高效的图形处理工具,也为创建动态和互动的Web应用打开了新的可能性。

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

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

相关文章

拯救打工人的4款可ai生成ppt神器大PK,谁是加班狗的最爱?

在忙碌的工作日常里&#xff0c;做PPT常常让不少上班族头疼。晚上加班时&#xff0c;办公室里总能看到那些为了做出完美PPT而熬夜的人。不过现在好了&#xff0c;科技进步带来了好消息&#xff0c;有几款AI生成PPT的神器出现了&#xff0c;今天&#xff0c;咱们就来比一比&…

网络编程----TCP/IP协议

使用TCP/IP协议实现客户端和服务器端进行通信: 1.服务器端(test1.c): #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <stdio.h> #include <unistd.h>// 创建服务器端 int main() {//1.创建套接字int serfd…

锂电池剩余寿命预测 | Matlab基于Transformer-GRU的锂电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于Transformer-GRU的锂电池剩余寿命预测&#xff0c;Transformer结合门控循环单元。 Matlab基于Transformer-GRU的锂电池剩余寿命预测&#xff08;单变量&#xff09; 运行环境Matlab2023b及以上。 首先从…

API网关:SpringCloud GateWay

一. 网关的作用及背景 1.API网关的作用 请求路由 在我们的系统中由于同一个接口新老两套系统都在使用&#xff0c;我们需要根据请求上下文将请求路由到对应的接口。 统一鉴权 对于鉴权操作不涉及到业务逻辑&#xff0c;那么可以在网关层进行处理&#xff0c;不用下层到业务…

嵌入式开发--STM32的GPIO输入和输出复用

嵌入式开发–STM32的GPIO输入和输出复用 MCU的引脚数量非常有限&#xff0c;做项目时&#xff0c;经常是为了成本而选择引脚尽量少的芯片&#xff0c;这也给布线和编程带来更大的挑战。 最近一个项目&#xff0c;需要在某些时候通过拨码开关预置参数&#xff0c;预置完成后&am…

QT自定义系统快捷键任务

关键代码 //自定义快捷键检测 connect(this->ui->hotkeySequenceEdit_1, &QKeySequenceEdit::keySequenceChanged,this, &HotTestWidget::setShortcut_1);// 托盘显示 trayIcon new QSystemTrayIcon(this); QPixmap pixmap("tray.png"); QIcon icon(…

[Android] [解决]Bottom Navigation Views Activity工程带来的fragment顶部空白间距问题

用Android Stuio创建一个Bottom Navigation Views Activity工程&#xff0c; 我们刻意设置一下fragment背景为黑色&#xff0c;会发现&#xff0c;这个fragment离顶部还有一段不小空白距离&#xff0c; 怎么解决呢&#xff1f; 在activity_main.xml里面&#xff0c;删掉这句&a…

2024年【中级消防设施操作员(考前冲刺)】找解析及中级消防设施操作员(考前冲刺)试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 中级消防设施操作员&#xff08;考前冲刺&#xff09;找解析考前必练&#xff01;安全生产模拟考试一点通每个月更新中级消防设施操作员&#xff08;考前冲刺&#xff09;试题及解析题目及答案&#xff01;多做几遍&a…

SuccBI+低代码文档中心 — 可视化分析(仪表板)(下)

制作仪表板 引入数据模型 仪表板所需模型已经在数据模块中准备好&#xff0c;可以将对应模型表添加到数据模型中。提供了两种添加方式&#xff1a; 在数据栏中点击添加按钮&#xff0c;在弹出框中通过搜索或直接在其所在目录下选中该模型&#xff0c;点击确定。 点击数据按钮…

【安卓】调用摄像头和相册

文章目录 调用摄像头拍照从相册中选择照片 调用摄像头拍照 新建一个CameraAlbumTest项目&#xff0c;然后修改activity_main.xml中的代码。在布局文件中添加两个控件&#xff1a;一个Button和一个ImageView。Button是用于打开摄像头进行拍照的&#xff0c;而ImageView则是用于将…

如何使用 Puppeteer 和 Node.JS 进行 Web 抓取?

什么是 Headlesschrome&#xff1f; Headless&#xff1f;是的&#xff0c;这意味着这个浏览器没有图形用户界面 (GUI)。不用鼠标或触摸设备与视觉元素交互&#xff0c;你需要使用命令行界面 (CLI) 来执行自动化操作。 Headlesschrome 和 Puppeteer 很多网页抓取工具都可适用…

【千帆平台】零代码结合知识库或者插件开发一款AI应用,2024年奥运会运动员获奖信息(人工智能应用)

欢迎来到《小5讲堂》 这是《千帆》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景组件方式prompt新参数运动员信息组件奖牌排行榜组件 知识库方式…

【Python】函数入门(上)

本篇文章将讲解以下知识&#xff1a; &#xff08;1&#xff09;初识函数 &#xff08;2&#xff09;函数的参数 &#xff08;3&#xff09;函数的返回值 1、初识函数 什么是函数&#xff1f; 函数可以看成是一大堆功能代码的集合。 定义函数格式&#xff1a; def 函…

【ARM】Cortex-A72技术手册(1)

目录 1.介绍 1.1接口 1.2 实现选项 2.功能描述 2.1 processor内部的组件 2.2 接口 2.2.1 Memory接口 2.2.2 可选的Accelerator Coherency Port 2.2.3 可选的GIC CPU接口 2.2.4 Debug 接口 2.2.5 Trace 接口 2.2.6 PMU接口 2.2.7 通用的Timer接口 2.2.8 Cross tri…

html 关于table合并外边框以及自动滚动问题汇总

合并外边框 .tab_main{ width: 100%; height:100%; border: 1px solid #ccc; text-align: center; border-spacing: 0; border-collapse: collapse;//合并外边框 } 固定高度显示上下滑动 <div styleoverflow:scroll;height:100%> <di…

LeetCode 热题 HOT 100 (035/100)【宇宙最简单版】

【栈】No. 0394 字符串解码【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xff…

Java面试八股之什么是消息队列

什么是消息队列 消息队列&#xff08;Message Queue&#xff09;是一种应用程序间通信&#xff08;IPC&#xff09;的形式&#xff0c;它允许进程将消息发送到另一个消息队列&#xff0c;接收端则可以在任何时刻从队列中取出这些消息进行处理。消息队列提供了一种异步处理、解…

R语言 | 发一篇 Science 需要学会多少个R包?

1. 一个一个举例子 1.1 实例1 该论文提供的代码涵盖的分析方向齐全&#xff0c;且代码风格和R语言编程细节都有值得学习的地方。代码有点多&#xff0c;包括R&#xff0c;rmd&#xff0c; py&#xff0c;jupyter notebook, shell等格式&#xff0c;压缩包见Q群文件: 187923577…

今年免费AI写作神器推荐,文案创作新宠儿

面对日益增长的创作需求与有限的个人精力&#xff0c;如何高效产出高质量的内容成为了许多创作者面临的共同挑战。幸运的是&#xff0c;现在有不少ai写作免费工具可以帮我们实现。 1.宙语AI写作 链接直达&#xff1a;https://ailjyk.com/pc 这款工具作为一款在线AI应用&#…

最佳 5 款 SD 卡照片恢复应用程序,用于从 SD 卡恢复已删除的照片

我们都知道照片承载着我们一生中最美好的回忆。但残酷的事实是&#xff0c;尽管你备份了所有的照片&#xff0c;但有些文件总会莫名其妙地丢失。无论是意外删除还是由于某种原因格式化设备&#xff0c;数据丢失都是不可避免的。因此&#xff0c;我们不会创建同一文件的数千份副…