我正在编写的部分应用程序要求我处理多点触控交互以处理平移和缩放等操作。在搞乱实现它的方法后,它让我思考...... 有没有办法实现平移和缩放具有恒定的内存量,无论有多少触摸屏幕?
输入是一种改变了触摸的形式。每次移动触摸时,必须更正缩放和平移。此活动提供的信息是移动的触摸的newPosition
和oldPosition
。
...另外,可以添加或删除触摸。在那种情况下,只有position
。
对于平移,屏幕将平移与所有触摸的平均位置变化一样多。因此,如果一次触摸移动(15,5),并且有5次触摸(其中4次保持放置),则屏幕将平移(3,1)
对于缩放,屏幕将与每次触摸距中心的平均距离(所有触摸的平均位置)的变化成比例缩放。
到目前为止,我已决定需要跟踪所有触摸的numberOfTouches
,center
或平均位置以及中心的averageDistance
。
平移很简单。每当触摸移动changeInPosition
时,请按changeInPosition/numberOfTouches
平移。容易。
我还没想出缩放。我想我需要跟踪center
,所以我知道要放大什么点。我还认为我需要跟踪averageDistance
,所以我知道要放大多少。但是......我无法弄清楚如何维持averageDistance
。很容易跟踪中心是否移动,但如果中心移动,如何找到新的averageDistance
?
所以,问题是,给定一个输入,一个改变点,一个新触摸,或一个删除触摸...有一种方法,而不将该触摸存储在一个数组中(AKA:具有恒定的记忆),实现缩放和平移?
我是否在正确的轨道上?可以用恒定的记忆来完成吗?或者必须跟踪所有的触摸?
答案 0 :(得分:2)
给你一个反例。
让我们假设这种方法存在恒定的记忆;并且你有一系列 100 触摸,所有这些都在(10,10),中心位于(15,15)因此平均距离中心的距离 5 。 您现在执行一个平移,使新中心(10,10)。实际上,如果你有完整的触摸历史,新中心的新平均距离现在 0 ,但因为你没有触摸历史记录你无法如何更新平均距离,它可能是任何东西。也许之前的100次触摸均匀分布在您的空间中,或者全部在一半中,或者在我选择的示例中,都在同一位置。
所以我会说没有恒定的记忆方法。你可以做的是保持最后 N 触摸的历史窗口,并每次重新计算它们的平均距离。您可以在历史记录中第一次触摸时保持缩放量( N )并应用其余的触摸'放大。在每次新触摸时,将初始缩放量更新为下一次触摸( N-1 ),并在插入新触摸之前丢弃最旧的触摸( N )( 1 强>)。
答案 1 :(得分:0)
不确定毕达哥拉斯是否会同意我,但也许这会引发一个不错的答案:
center.x = 0
center.y = 0
for each touch position 'p':
center.x = center.x + p.x
center.y = center.y + p.y
averageDistance = sqrt((center.x * center.x) + (center.y * center.y))
averageDistance = averageDistance / (2 * (NumberOfTouches - 1))
center.x = center.x / numberOfTouches
center.y = center.y / numberOfTouches
顺便说一句,如果你在缩放时允许中心移动,这将导致平移和缩放。