单指拖动、双指缩放
两个手指不可能同时触发,必然是一前一后。
两个手指(finger0, finger1):单指(finger0)、单指(finger1)、双指(finger0-finger1)
三个手指(finger0, finger1, finger2):单指(finger0)、单指(finger1)、单指(finger2)、双指(finger0-finger1)、双指(finger0-finger2)、双指(finger1-finger2)
四指、五指......:很多种情况......
如果纯粹按照定义,不加任何限制,就会出现多种情况并存的现象,最终得到的结果和预期不一致。
解决方案1:
重新定义,对单指双指的定义进行限制。
定义为:手势。
比如:
自由手指:没有触发任何手势的手指。
单指:自由手指按下->移动一小段距离
双指:两个自由手指按下->一个或两个自由手指移动一小段距离
三指:...
多指:...
还是会存在多种手势同时发生的情况,可以通过定义优先级来解决。
优先级:单指双指同时满足时,优先选择双指。
手势发生时,可能存在多种组合形式,可以定义优先级来解决。比如按按下的时间顺序、按与移动手指的距离。
解决方案2:
不动点法(待检验)。
把手指想象成钉子,屏幕想象成一张可以拉伸的纸。
一个手指的时候,钉子钉到纸上,移动的时候,纸会跟着移动。
两个手指的时候(先只考虑沿两个手指连线方向移动),一个钉子动,一个不动,或者两个钉子同时移动,都会产生缩放。
存在的问题:
当两个手指不沿手指的连线方向移动时,按照不动点模型,应该会产生旋转,因为我们不考虑旋转,所以不动点就不成立了。
当三个或者更多手指的时候,不动点也不成立。
因为找不到一个缩放值和平移值,是的所有点都从当前点变换到目标点。
不动点法,我们其实是在做这样一件事,有n个点p0~pn-1,通过缩放和平移变换到p0'~pn-1'。
一个点的时候。
假设p0=(x0,y0),p0'=(x0',y0').缩放值为s,平移值为tx、ty。
有
|s, 0, tx| . |x0| = |x0'|
|0, s, ty| |y0| |y0'|
两个方程,3个未知数,无解(有无穷多解,没有唯一解)。
但是我们知道,一个点的时候,s = 1(只需要平移,不需要缩放)。
所以,有解。
两个点的时候。
有
|s, 0, tx| . |x0| = |x0'|
|0, s, ty| |y0| |y0'|
|s, 0, tx| |x1| |x1'|
|0, s, ty| |y1| |y1'|
4个方程,3个未知数,无解。
同理,多个点的情况。
回到一个点的情况,我们想要求的是s、tx、ty,我们对方程式做一下变换,把s、tx、ty作为变量。
有
|x0, 1, 0| . |s | = |x0'|
|y0, 0, 1| |tx| |y0'|
|1 , 0, 0| |ty| |1 |
最后多加了一列,s = 1。
通过矩阵求解可以解出s、tx、ty。(这里不讨论细节)
两个点的情况
有
|x0, 1, 0| . |s | = |x0'|
|y0, 0, 1| |tx| |y0'|
|x1, 1, 0| |ty| |x1'|
|y1, 0, 1| |y1'|
|1 , 0, 0| |1 |
方程组无解,但是我们可以求它的最小二乘解。
参考:https://zhuanlan.zhihu.com/p/105359152?utm_medium=social&utm_source=qq&utm_oi=990759351451267072
Ax = b无解
可以找到近似解:
x' = (AᵀA)⁻¹Aᵀb
效果如何,有待验证。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。