2011-05-24 110 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