js用鼠标控制图片旋转任意角度-luckySheet

需求描述

        最近有用户在使用luckySheet时,希望能够任意角度旋转图片,就像wps那样,wps如下图

wps的图片旋转

         在网上只找到在canvas中进行旋转的库,没找到直接操作图片dom的库,决定直接写。

实现思路

       1、点击时记录图片坐标

        点击图片时加一个按钮button,用于控制旋转。点击这个按钮时,记录图片的中点在视图中的坐标pos,代码如下:

 $("#rotateImg").off("mousedown.rotate").on("mousedown.rotate", function(e) {
            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, "editObjects",false)){
                return;
            }
            e.stopPropagation()
            //开始旋转的标志
            globalThis._isStartRotate = true

            // 获取点击初始时的坐标
            // const rotateDom = document.querySelector('#rotateImg')
            const rotateDom = document.querySelector('#luckysheet-modal-dialog-activeImage')            
            let rect =  rotateDom.getBoundingClientRect()

            const devX = parseInt($(rotateDom).css('width'))/2
            const devY = parseInt($(rotateDom).css('height'))/2
            
            console.log(Number.parseInt(rect.top + devY),Number.parseInt(rect.left + devX));
            globalThis.initPos = {y: Number.parseInt(rect.top + devY),x:Number.parseInt(rect.left + devX)}
        })

         2、移动时计算角度,然后修改rotate属性

        在鼠标移动时,需要拿到鼠标的位置(x2,y2),通过这个位置和“图片中点(x1,y1)”能构成一条直线,求出这条直线与y轴正方向的夹角a,就是rotate的值,示意图如下:

rotate值对应角度的示意图

        3、如何计算夹角

        在第一象限中,先计算出直线与x轴正方向的反正切值,然后将其转为角度,这个角度的余角就是夹角a的角度值,最后再针对不同象限做一些处理就行。计算角度的代码如下:

        function calculateAngle(x1,y1,x2,y2) {
            // 计算直线的斜率
            const slope = (y2 - y1) / (x2 - x1)

            // 计算直线与x轴的夹角的弧度值(需要转为角度)
            const angleRadians = Math.atan(slope);//反正切
            
            // 将弧度转换为度
            const angleDegrees = angleRadians * (180 / Math.PI);
            
            //比如在第二象限时,angleDegrees会大于90度,需要求绝对值,
            const angleBetween = Math.abs(90 - angleDegrees);// 求直线与y轴正方向的夹角 

            // 进行坐标系转化
            return x2 >= x1 ? 180 - angleBetween : 360 - angleBetween
        }

 luckySheet中鼠标移动时的代码如下:

 $(document).off("mousemove.rotate").on("mousemove.rotate",function (event) {
            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, "editObjects",false)){
                return;
            }
                        
            if(globalThis._isStartRotate){
                const endX = event.clientX
                const endY = event.clientY
                // 示例:使用起点(1, 2)和终点(3, 4)
                const  angle = calculateAngle(globalThis.initPos.x, globalThis.initPos.y, endX, endY);
                $('#luckysheet-modal-dialog-activeImage').css('transform',`rotate(${angle}deg)`)

                // 旋转的时候需要改img对应的对象数据
                let imgItem = _this.images[_this.currentImgId];
                imgItem.default.rotate = angle   
            }
        })

最后的效果END

针对luckySheet的代码还有一些细节的处理,这里不介绍,最后的效果如下:

最后的效果图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx详解(持续更新)

nginx定义 nginx安装 nginx目录 程序相关命令 服务相关命令 虚拟主机(server) 路由匹配(location) 代理(proxy_pass) 正向代理 反向代理 负载均衡(upstream) 负载均衡策略 动静分…

数据分析之POWER Piovt的KPI设置

内容总结: 1.两个表格关联不上:需要添加辅助列,建立关联 2.添加辅助列后还关联不上:将虚线变为实线 3.根据需求要增加一些度量值 4.设置KPI后,绝对值选1后设定百分比 5.在透视表里面加入KPI状态 导入所关联的数据后建立…

关于Linux中的history命令

前言:本文内容为实操学习记录,不具有调研价值,仅供参考! 正文: 接触过Linux操作系统的朋友一般都知道history命令,直接输入history命令,会显示当前用户的历史输入记录。这个原理是linux会记录我…

python--os和os.path模块

>>> import os >>> #curdir #获取当前脚本的绝对路径 >>> os.curdir . >>> import os.path >>> #获取绝对路径 >>> os.path.abspath(os.curdir) C:\\Users\\GUOGUO>>> #chdir #修改当前目录 >&g…

深入理解指针(7)函数指针变量及函数数组(文章最后放置本文所有原码)

一、函数指针变量 什么是函数指针变量呢? 既然是指针变量,那么它指向的一定是地址,而且我们可以通过地址来调用函数的。 函数是否有地址呢?地址是什么? 经过上面的测试可以看到函数也是有地址的,而且其地…

如何准备科学海报

科学会议上的海报展示可以为早期职业研究人员提供宝贵的机会来练习他们的沟通技巧,获得有关他们研究的反馈,并扩大他们的网络。“通过与其他研究人员一对一地讨论我的工作,[我发现]我可以确定哪些工作做得好,哪些需要改进&#xf…

dnf手游:如何利用副本和任务快速积累泰拉财富?

DNF手游中,搬砖赚钱的方式多种多样,其中利用副本和任务是一种快速赚取泰拉的有效途径。本攻略将介绍如何通过参与副本和任务来获取泰拉,帮助玩家在游戏中获得更多的经济收益。 一、认识游戏中的泰拉 在DNF手游中,泰拉是一种主要的…

HarmonyOS 开发之应用/组件级配置

在开发应用时,需要配置应用的一些标签,例如应用的包名、图标等标识特征的属性。本文描述了在开发应用需要配置的一些关键标签。 应用包名配置 应用需要在工程的AppScope目录下的 app.json5配置文件 中配置bundleName标签,该标签用于标识应用…

Containerd 介绍、安装和使用

Containerd介绍、安装和使用 文章目录 Containerd介绍、安装和使用1.containerd是什么?2.Containerd安装2.1 主机初始化2.1.1 设置ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 禁用swap2.1.6 设置时区 2.2 安装 containerd2.2.1 内核参数调整2.2…

基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spri…

每天五分钟深度学习:使用神经网络完成人脸的特征点检测

本文重点 我们上一节课程中学习了如何利用神经网络对图片中的对象进行定位,也就是通过输出四个参数值bx、by、bℎ和bw给出图片中对象的边界框。 本节课程我们学习特征点的检测,神经网络可以通过输出图片中对象的特征点的(x,y)坐标来实现对目标特征的识别,我们看几个例子。…

Oracle-MNIST代码学习

一、网络结构 二、代码学习 2.1、x = F.relu(self.conv1(x)) # self.conv1 = nn.Conv2d(1, 20, 5, 1) ​​​​​ 1)Conv2d 详解参考:PyTorch nn.Conv2d - 知乎 2) relu pytorch学习线性回归与非线性回归,以及理解nn.linear()和ReLU激活函数_pytorch 非线性函数作用-C…

访学博后须知|携带手机等电子产品入境美国注意事项

美国对携带手机等电子产品入境有着严格的规定,因此知识人网小编提醒拟出国做访问学者、博士后或联合培养的博士生了解以下注意事项,尽量减少不必要的麻烦。 随着互联网的普及,手机等电子产品在人民生活中占有不可或缺的地位。因为研究和工作需…

AcWing刷题-空调

空调 差分: N int(input()) p list(map(int, input().split())) t list(map(int, input().split())) d,s[0]*100010,[0]*100010 for i in range(N):d[i] p[i]-t[i]for i in range(N):s[i] d[i]s[i1] - d[i] ans 0 for i in range(N1):if s[i]>0:ans s[i]…

大话设计模式之代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。代理对象充当客户端和实际对象之间的中介,客户端通过代理对象间接访问实际对象,从而可以在访问控制、缓存、延迟加载等方面提…

二维随机变量的条件分布-已知X概率密度,X条件下的Y概率密度求解y的概率密度

问题&#xff1a;设数X在区间(0,1)上随机地取值,当观察到Xx(0<x<1)时,数Y在区间(x,1)上随机地取值.求Y的概率密度f(y)&#xff1f; 求解&#xff1a; 首先&#xff0c;数X在区间(0,1)上均匀分布&#xff0c;因此其概率密度函数fX​(x)为&#xff1a; fX​(x)1 0<…

PLC_博图系列☞N:扫描操作数的信号下降沿

PLC_博图系列☞N&#xff1a;扫描操作数的信号下降沿 文章目录 PLC_博图系列☞N&#xff1a;扫描操作数的信号下降沿背景介绍N&#xff1a;扫描操作数的信号下降沿说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 N 背景介绍 这是一篇关于PLC编程的文章…

代码随想录算法训练营第二十四天| 理论基础,77. 组合

题目与题解 参考资料&#xff1a;回溯法理论基础 带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 77. 组合 题目链接&#xff1a;​​​​​​​​​​​​​​77. 组合 代码随想录题解&#xff1a;77. 组合 视频讲解&#xff…

AI的“换脸“魔术,究竟是弊大于利还是利大于弊?

公众号&#xff1a;【可乐前端】&#xff0c;每天3分钟学习一个优秀的开源项目&#xff0c;分享web面试与实战知识&#xff0c;也有全栈交流学习摸鱼群&#xff0c;期待您的关注! 每天3分钟开源 hi&#xff0c;这里是每天3分钟开源&#xff0c;很高兴又跟大家见面了&#xff0…

知识图谱与大数据:区别、联系与应用

目录 前言1 知识图谱1.1 定义1.2 特点1.3 应用 2 大数据2.1 定义2.2 应用 3. 区别与联系3.1 区别3.2 联系 结语 前言 在当今信息爆炸的时代&#xff0c;数据成为了我们生活和工作中不可或缺的资源。知识图谱和大数据是两个关键概念&#xff0c;它们在人工智能、数据科学和信息…