或许跟手拖拽已经足够普遍,可是跟手沿着圆弧转动的罗盘指针,却依然足够挑战,先来看看我们要实现的小目标,查看效果(请用手机打开,或者用chrome的手机模式打开)

任务分解、分析

一、 跟手拖拽的一般套路

  1. touchstart 的时候记录初始位置:ox,oy
  2. touchmove 的过程中移动到新的位置:x = x1-ox, y = x1 - oy
  3. touchend 的时候,这步好像也不需要干啥

二、圆弧转盘转动的一般做法

  1. 设定圆心转动的原点
  2. 动态的修改旋转的角度(或者弧度)

三、合二为一
如何将手势动作反应到圆弧的角度或者弧度变更上,这是问题的症结所在,起初我也为此而困顿不已

先是通过设定某一位移而旋转固定的角度,但是很难确定圆弧的有效位移,就算确定了有效位移,当旋转到一百八十度之后也蒙圈,反着动了~~
而且这种不均匀的运动实在也难以服众

纠结之际,我拿起了纸和笔,重新寻找灵感:

注意到图片红色的点是圆心,绿色的点是 touchstart 时候记录下的起始点,蓝色的点是 touchmove 的过程中不断变化的目标点。我们的目标很明确,计算指针变化的角度(或弧度),用我仅有的初中数学知识思考得知,知道三角形的每个顶点,是可以求出每个顶角的角度。运用三角形的余弦定理,求弧度值:

    //获得point2顶角的弧度值//point1传入起始点,point2传入圆心,point3传入结束点,可求得指针运动的夹角弧度function getAngle(point1, point2, point3) {var bb = (point2.y - point1.y)*(point2.y - point1.y) + (point2.x - point1.x)*(point2.x - point1.x);var aa = (point3.y - point1.y)*(point3.y - point1.y) + (point3.x - point1.x)*(point3.x - point1.x);var cc = (point3.y - point2.y)*(point3.y - point2.y) + (point3.x - point2.x)*(point3.x - point2.x);var cosa = (bb + cc - aa)/(2*Math.sqrt(bb)*Math.sqrt(cc));return Math.acos(cosa);}复制代码

刚才只考虑了顺时针的情况,不能忽略逆时针的方向:

这种情况的弧度值为 -getAngle(point1, point2, point3),这并不难理解,难点在于如何判断到底是逆时针还是顺时针,可以通过如下的面积量的方法来判断顺时针还是逆时针

//通过面积量的方法来判断顺时针还是逆时针//point1传入圆心,point2传入起始点,point3传入终点function duration(point1, point2, point3) {var sp = (point1.x-point3.x)*(point2.y-point3.y)-(point1.y-point3.y)*(point2.x-point3.x);console.log(sp);if(sp>0) {//顺时针return 1} else if(sp<0) {="" 逆时针="" return="" -1="" }="" else="" 0;="" }<="" code="">0)>复制代码

完整的程序代码

go ~~

结语

Js 特效,有时候代码不需要很多,但是找到其中的规律再转化为机器认识的语言绝非易事,难就难在这个数学建模的过程,需要一点想象力,可以给予的经验就是,拿起你的笔和纸,去画,灵感自来

欢迎来到我的会客厅:

Js 跟手转动的罗盘指针相关推荐

  1. js中怪异的this 指针

    2019独角兽企业重金招聘Python工程师标准>>> 这篇文章或许能说清问题http://yehudakatz.com/2011/08/11/understanding-javas ...

  2. js 图片视频跟着鼠标指针 “左右” 动

    var playerCount = 0;var imgCount = 0;/** @description:计算鼠标的方向* @param:浏览器属性,元素* @author:aleck* @crea ...

  3. babylon.js入门日记系列

    一直就有一个给宝宝写游戏的念头.百度一番.选了这个babylon.js(巴比伦).先说好,游戏开发方面我是啥也不会, 要是把你带沟里去了,你也别介意.好了,说干就干,开始......... babyl ...

  4. 抖音超火的罗盘时钟效果

    抖音超火的罗盘时钟 利用原生js,实现的罗盘时钟效果 实现效果 实现思路 将数字摆成圆环 获取当前时间,让圆环旋转一定的角度,转到水平位置 将当前时间变亮 实现的思路还是很简单的,但是在过程中会有很多 ...

  5. c语言使用node类型指针,C语言利用 void 类型指针实现面向对象类概念与抽象

    不使用C++时,很多C语言新手可能认为C语言缺乏了面向对象和抽象性,事实上,C语言通过某种组合方式,可以间接性的实现面对对象和抽象. 不过多态和继承这种实现,就有点小麻烦,但是依然可以实现. 核心: ...

  6. jQuery罗盘时钟代码

    源码介绍: jQuery罗盘时钟代码基于jquery-3.4.1.min.js制作,环形罗盘,时钟动画. 网盘下载地址: http://www.bytepan.com/4iimSDHOqnu 图片:

  7. 把jquery的this写入选择器里(伪写入)哈哈~

    通常在jquery里我们会这样写来选择当前元素的兄弟元素: $(this).parent().children(".brother") 或许是因为对this这个js特殊的唯一的指针 ...

  8. javascript清除map所占内存_【原创.54期】 JavaScript的V8引擎初探

    本文主要就下面三块内容展开 栈和堆空间 垃圾回收 解释器和编译器 一.栈空间和堆空间 先回顾下基本知识 1.静态语言就是强类型?二者的关系 (1-1)静态语言, 使用前 要确定数据类型 (1-2)动态 ...

  9. python手机版安卓-当python遇到Android手机 那么,万物皆可盘

    嚣张开场 今天不跟大家讲python知识,是不很失望?No,看过了今天的内容,你python的装13指数,至少上升1w+,并附带暴击.溅射.眩晕.致盲效果.没错,就是这么嚣张..... 当python ...

最新文章

  1. C++乘法的int越界问题
  2. AndEngine引擎学习之绘制直线
  3. @EnableGlobalMethodSecurity(prePostEnabled = true)
  4. 荷兰牛栏 荷兰售价_荷兰的公路货运是如何发展的
  5. 删除两个双向链表中值相同的结点--带空白头结点
  6. “一个千古绝伦的大智者”莱布尼茨
  7. C#学习基础--静态类和静态类成员
  8. 中兴的芯片,到底什么水平?
  9. 学习nodejs之restful
  10. 「leetcode」 1382. 将二叉搜索树变平衡:【构造平衡二叉搜索树】详解
  11. 二分法查找——C++代码
  12. percona-xtrabackup 文档
  13. python3 获取文件目录_python3--os.path获取当前文件的绝对路径和所在目录
  14. 关于Arduino下载并添加DHT11库文件的详细教程
  15. FIT2CLOUD飞致云发布MeterSphere开源持续测试平台
  16. 悬赏任务发布平台系统源码|威客任务网站源码PHP开源版
  17. css——样式化区块——背景
  18. python填充nan_Python Pandas Dataframe填充NaN值
  19. 《计算机网络自顶向下》 Miscellaneous Lab1 Implementing a Reliable Transport Protocol(实现可靠的传输协议(上))
  20. JavaScript——问卷星自动填写

热门文章

  1. Optimizing radiotherapy plans for cancer treatment with Tensor Networks解读
  2. 给出年、月、日,计算该日是该年的第几天。
  3. 旋转矩阵、欧拉角、旋转矢量及四元数的介绍和工程应用
  4. 星盘软件测试自学,谁能帮我解读一下我的星盘_测测星座app可以测什么?
  5. 使用EFR32作为Zigbee/Thread的sniffer的用法
  6. Linux 多线程(附带线程池代码加注释)
  7. 命令行发送SMTP协议邮件(163邮箱)
  8. 1967年图灵奖得主- 莫里斯·威尔克斯 (Maurice V. Wilkes)
  9. 信息平台和数据科学家的兴起
  10. NLP之——Word2Vec详解