02
2020
07

单指拖动、双指缩放

单指拖动、双指缩放

两个手指不可能同时触发,必然是一前一后。


两个手指(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


效果如何,有待验证。



« 上一篇下一篇 »

相关文章:

双指缩放的计算  (2020-9-3 9:24:31)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。