2011-05-24 105 views
5

我正在撕裂我的头发,试图弄清楚什么似乎是一个非常简单的问题。我知道很多这些东西都被切成线索讨论过,所以如果这个问题在覆盖面很大的情况下表示道歉,但我找不到任何与我的解决方案相关的任何东西(相信我,我已经看过)。iOS - 沿弯曲路径拖动对象

基本上我想沿着预先定义的弯曲路径(不只是移动它,但拖动它)拖动一个对象/精灵。想想iPhone的“滑动解锁”的东西,但不是从左到右拖动滑块,而是将路径设为弧线或波浪线。

我的基本思路是:

  • 定义贝塞尔路径,设置对象的起点。
  • 如果对象被触摸,请检查touchesMoved(或某些类似功能)中bezier路径上的命中检测。如果触摸停留在路径上,沿着路径推进精灵直到路径结束(在这种情况下,任务完成)或用户的手指离开路径(在这种情况下,对象应该返回到开始处)。

这一切都不重要(至少,这是它的样子)。例如:

  • 在Bezier路径上执行命中检测是一个皇家痛苦,因为您实际上需要在描边部分而不是填充部分执行命中检测。即使如此,我似乎也无法找到一种方法在任何宽度的路径上进行 - 只有在Bezier的1点宽路径上。
  • 部分沿着路径移动对象似乎是不可能的:所有的动画方法都沿着整个路径移动精灵。此外,这样做需要您找到距离用户触摸最近的路径上的点,如果您曾经查看过该点,则会涉及惊人的复杂数学。
  • 我想过使用刚体占据除路径之外的所有空间,所以对象只能在路径中移动。但是,这需要定义弯曲的刚体,其中一些必须是凹形的。死路。

我是不是在做这个太难?这似乎并不复杂。我不需要一个完整的解决方案,只是一种思考这个问题并朝正确方向发展的新方法。任何帮助将非常感激。

+0

我知道很久以前就有人问到这个问题,但我现在遇到了一些非常相似的东西,并且想知道你是否想到了这个并可能能够帮助指引我走下正确的道路。 – gikygik 2015-04-29 16:31:21

回答

1

这个怎么样?

  • 考虑您的贝塞尔路径的X轴。
  • 每次用户点击或与屏幕交互只需看看触摸的x部分
  • 将X与您的路径进行坐标并将对象移动到正确的位置。
+0

如果曲线不止一次穿过X轴上的同一点,该解决方案是否可以工作?例如,如果曲线只是字母“S”会怎样。对于曲线上不同的Y点,相同的X点可以出现多次... – johnnysports 2011-05-24 20:40:41

+0

不,不会。你可以做的是使用Y轴来决定曲线中哪一点你应该调整到 – arclight 2011-05-24 20:48:04

0

是的,你让这太难了。

采取上述建议的简化(或沿圆,直线等),它是否适合,或者如果你真的想这样做对贝塞尔曲线,考虑以下因素:

  1. 看那bézier曲线的定义
  2. 您正在寻找的是从当前位置P和触摸位置D的变化定义一个新的对象位置P'。
  3. 如果你改写在t方面原P(X,Y)(贝塞尔曲线的参数),那么问题就变得找到多少吨如何弥补基础上添加D.
  4. 一些涉及贝塞尔的差在P的fn可能是一个很好的方法来做到这一点。也就是说,如果曲线刚好是P点沿曲线的一条直线,那么将添加多少t。

编辑:段之间的过渡 : 如果每段具有吨[0,1),则可以检测T> = 1,并且移动到下一个段,设置P到以前的端部分段,并再次评估与该点相关的移动。如果你有很多小点数等等,可能需要一些启发式方法。

+0

Andrew,谢谢你的回应。请耐心等待,因为我真的很想理解这一点,但它仍然困扰着我。我认为你和arclight的解决方案可能无法适用于更复杂的路径。我相信(纠正我,如果我错了),如果我的曲线是单贝塞尔曲线,您的解决方案将工作。但是,如果我构建了一个由多个段组成的路径,一些直线,一些四边形曲线,一些弧(SDK允许),我需要弄清楚我在哪个段上,然后计算新的位置。你看到我在说什么吗? – johnnysports 2011-05-24 19:53:29

+0

请参阅上面的解决办法。 – 2011-05-25 08:00:26

+0

我知道这是很久以前所有人都问过的,但我正在尝试做类似的事情,并想知道你可能会回答这个问题。我想拖动一个我使用beizerpath绘制的椭圆。有没有办法让所有的点在椭圆中,这样我就可以做你上面推荐的东西了? – gikygik 2015-04-29 16:37:11