前言

图片360度任意旋转,

一、设计思路

1.确定中心和起始点:当鼠标点击旋转图标时,中心点为左边图片中心,起始点为旋转图标中心;

2.确定结束点:当鼠标移动时,鼠标的每一次变换都会更新结束点的坐标;

3.通过坐标点计算出该三角形三条边的长度(勾股定理),再通过余弦函数算出弧度制,反余弦函数将弧度 制转换为角度制(思路详解中会详细介绍);

4.ie下通过滤镜,其它浏览器通过rotate实现最终效果;

二、思路详解

1.html部分

<div class="rotateImg"><img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.tukexw.com%2Fimg%2F1d3d6d3bc7578c21.jpg&refer=http%3A%2F%2Fimg.tukexw.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1621488806&t=9afe6c19464c4570f7ad05fc1d8f2daa"><div  @mousedown="rotate" class="rotate-char" ></div>
</div>
<style>.rotateImg{position:fixed;top:64px;left:256px;z-index:99999;background:#ccc;}.rotate-char{cursor:pointer;width:16px;height:16px;position:absolute;bottom:50%;margin-bottom:-8px;right:-36px;background:url('https://www.easyicon.net/api/resizeApi.php?id=1223185&size=16')}
</style>

2.旋转的方法

function rotate(){let rotate = document.querySelector(".rotate-char");let move = rotate.parentNode;let sum = 0;// 坐标定义,中心点,起始点,终点鼠标移动时,实时更新let centercoord = [move.offsetLeft+move.clientWidth/2,move.clientHeight/2+move.offsetTop],firstcoord = [centercoord[0]+rotate.offsetLeft+rotate.clientWidth/2-move.clientWidth/2,centercoord[1]],lastcoord = [];//鼠标按下后移动事件let moveFunc = () => {let deg = 0;let e = event || window.event,x = e.clientX,y=e.clientY;// 中心点 开始点 结束点lastcoord = [x,y];//结束点坐标随时更新deg = getAngle(centercoord,firstcoord,lastcoord);move.setAttribute("style","transform:rotate("+deg+"deg)")}//移动事件绑定window.document.addEventListener("mousemove",moveFunc);//鼠标抬起解绑移动事件let cancel = () => {window.document.removeEventListener("mousemove",moveFunc)};window.document.addEventListener("mouseup",cancel);
}

3.获取角度的方法

getAngle(cen,first,last){let c_f_x = first[0] - cen[0],c_f_y = first[1] - cen[1],l_c_x = last[0] - cen[0],l_c_y = last[1] - cen[1];//求导出逆时针还是顺时针旋转let dir = c_f_x * l_c_y - c_f_y * l_c_x;//算出三角形三条边的长度,pow可以将数据进行乘方运算let len_cf = Math.sqrt(Math.pow(cen[0] - first[0],2) + Math.pow(cen[1] - first[1],2)),len_cl = Math.sqrt(Math.pow(cen[0] - last[0],2) + Math.pow(cen[1] - last[1],2)),len_fl = Math.sqrt(Math.pow(first[0] - last[0],2) + Math.pow(first[1] - last[1],2));//算出三条边后通过余弦定理求出旋转角let cosA = (Math.pow(len_cf,2)+Math.pow(len_cl,2) - Math.pow(len_fl,2))/(len_cf*len_cl*2);//弧度制转为角度制let angle = Math.round(Math.acos(cosA) * 180 / Math.PI);// 判断逆时针,顺时针方向旋转if(dir < 0){//逆时针angle = -angle}return angle;},

ps:余弦定理,忘记的看这

图片360度无死角自由旋转相关推荐

  1. ACSI: 360度无死角测量顾客满意度

    除了CSAT.NPS .CES这三种指标之外,还有没有考量更周全的顾客满意度指数模型,能帮助企业360度无死角全方位测量其顾客的满意度指数? 答案:有.那就是美国顾客满意度指数ACSI. ACSI是什 ...

  2. 一种360度无死角开源的BMS电池保护板

    一种360度无死角开源的BMS电池保护板 感谢Danny Bokma和Jonathan French的无私贡献. 这款全开源的BMS电池保护板名叫DieBieMS. DieBieMS电池保护板主要特性 ...

  3. 继LSTM之父用世界模型来模拟2D赛车后,谷歌又推出全新世界模型助力导航:360度无死角,就问你怕了没?...

    来源:AI科技评论本文约3400字,建议阅读10分钟 今年2月,Google AI 也用世界模型,在 Atari 游戏中实现了达到人类水平的表现. 近年来,世界模型(World Model)在机器人. ...

  4. 停车还能360全方位影像_德国首创“新型汽车”不仅能无人驾驶,还能360度无死角停车...

    说在驾校除了理论外,第一个学的就是侧方停车和倒车入库.但等到实际开车的时候,停车仍然是一些新手司机最头疼的事情.有时候好不容易找到停车位,停车都要好半天--经常是前后左右险象环生,手忙脚乱半天车还是停 ...

  5. 360度无死角 | Pulsar与Kafka对比全解析

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 2020 年,Pulsar 受到持续关注,Pulsar 的应用场景也越来越广泛. 本文分别从性能. ...

  6. 为给微芯片拍照,IBM小哥用乐高拼了个电动显微镜,搭载树莓派,360度无死角拍摄...

    来源:IEEE Spectrum 本文约1739字,建议阅读5分钟. 本文介绍一位乐高爱好者Yuksel Temiz为了从各种角度拍摄微流控芯片,用乐高.Arduino和树莓派,一起DIY了一个高精度 ...

  7. 阿里巴巴前架构师360度无死角剖析微服务

    微服务是当前软件架构领域非常热门的词汇,在社区中也有很多热烈的讨论.因此,OSC第130期高手问答的主题是"究竟什么才是微服务",并邀请了黄勇作为高手嘉宾. 黄勇,现任特赞公司CT ...

  8. 360度无死角、近距离看「CNN」训练,是种什么体验?网友:美得不真实

    萧箫 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 做计算机视觉,离不开CNN. 可是,卷积.池化.Softmax--究竟长啥样,是怎样相互连接在一起的? 对着代码凭空想象,多少让人有点 ...

  9. 统计信号处理基础_0基础学Python,就业中你需要建立360度无死角技能树

    1956年,人工智能的概念就已经提出,但在以前,人工智能大多只是存在于书本和荧幕中,到了今天,生活中充斥着人工智能的影子,智能语音助手.翻译器.指纹识别.人脸识别.无人驾驶...... 自阿尔法围棋出 ...

最新文章

  1. 世界人工智能大赛方案解析!
  2. html5移动端底部效果,spring mvc +HTML5实现移动端底部上滑异步加载更多内容分页效果...
  3. init_cheap: VirtualAlloc pointer is null, Win32 error 487
  4. 【kafka】kafka broker 限流 topic 限流 配额
  5. php csv文件内容加粗,PHP强化之10 - CSV文件处理
  6. Revit API取得全部元素
  7. SpaceEmacs Rock Day2 学习笔记
  8. 自然语言处理 4.语义分析
  9. WPS2019专业版办公软件安装包+永久授权码!
  10. java实现大写转小写_java实现将大写字母转换为小写字母
  11. nginx 80 443 并存
  12. java Echarts的实战(Echarts图表数据封装)
  13. ASPCMS插件,批量ASPCMS采集发布插件
  14. 为什么公司要用企业邮箱
  15. 如何将Word压缩到最小,这个方法你该知道
  16. 深信服AD应用交付介绍
  17. boost::asio编程-同步TCP
  18. Python3-StringIO和BytesIO的总结
  19. 获取系统时间戳的方法(使用c,c++,ros)
  20. VScode创建第一个C++项目

热门文章

  1. export ‘createStore‘ (imported as ‘createStore‘) was not found in ‘./store/index.js‘ (possible expor
  2. 如何用计算机远程桌面连接不上,手把手教你电脑远程桌面无法连接怎么办
  3. 埃克森尔科技参与IEEE BDL SC数字身份标准工作组会议
  4. 小米路由器进入linux系统,小米路由器操作系统竟不是miui
  5. Spring IOC refresh()方法——告诉子类刷新内部bean工厂
  6. 罗马数字(Python)
  7. 【转】BCWS、BCWP、ACWP的理解
  8. [操作系统] 单道批处理操作系统、多道批处理系统、分时操作系统的区别
  9. wsl2 ping不通windows主机问题速查
  10. linux 系统 Shell语言 基础