2011-05-24 15 views
5

私は非常に簡単な問題であると思われるものを理解しようとしている私の髪を裂いています。私はこの事の多くが接線的に話されていることを知っているので、これがうまく覆われた地面を歩いている場合は謝罪しますが、私の解決策に特有のものは見つけられません。iOS - カーブしたパスに沿ってオブジェクトをドラッグ

基本的には、オブジェクト/スプライトをあらかじめ定義されたカーブしたパス(ドラッグするだけでなく、ドラッグする)にドラッグします。 iPhoneの「Slide to unlock」のことを考えてください。スライダを左から右にドラッグするのではなく、パスを円弧または波線にします。

私の基本的な考え方は以下のとおりであった:

  • 始点にオブジェクトを設定し、ベジエパスを定義します。
  • オブジェクトに触れる場合は、touchesMoved(または同様の機能)のベジェパスでヒット検出をチェックします。接触がパス上に残っている場合は、パスが終了するまでパスに沿ってスプライトを前進させます(この場合、タスクが終了します)。またはユーザーの指がパスから外れます(この場合、オブジェクトは先頭に戻る必要があります)。

これは些細なことではありません(少なくとも、そう思われます)。たとえば、

  • ベジェパスでのヒット検出は、実際には塗りつぶし部分ではなく、ストローク部分で行う必要があるため、王様の痛みです。そして、それでも、私はBezierの1ポイント幅のパス上でのみ、あらゆる幅のパスでそれを行う方法を見つけることができません。
  • オブジェクトをパスに沿って部分的に移動することは、可能ではありません。すべてのアニメーションメソッドは、スプライトをENTIREパスに沿って移動します。また、これを実行するには、ユーザーのタッチに最も近いパス上の点を見つける必要があります。これを見たことがあれば、驚くほど複雑な数学が必要になります。
  • 剛体を使ってすべてのスペースを占有すると考えましたが、オブジェクトはパス内を移動することしかできません。しかし、これには曲面剛体の定義が必要であり、その一部は凹形でなければならない。デッドエンド。

私はこれをあまりにも難しくしていますか?複雑ではないようです。私は全体的な解決策を必要としません。これについて考え、正しい方向にキックする新しい方法です。どんな助けでも本当に感謝しています。

+0

これは長い時間前に尋ねられたものですが、私は非常に類似していると思います。私を正しい道に導く助けとなるかもしれません。 – gikygik

答えて

1

これはいかがですか?

  • ベゼル パスのX軸を考えてみましょう。
  • ユーザーが画面をタップまたはタッチするたびに、タッチのx部分を見るだけで
  • あなたのパスにX座標をマッピングし、オブジェクトを正しい位置に移動します。
+0

曲線がX軸上の同じ点を複数回通過する場合、この解決策は機能しますか?たとえば、曲線が単純に文字「S」の場合はどうなりますか?曲線上の異なるY点に対して、同じX点が複数回現れることがあります。 – johnnysports

+0

いいえ、そうではありません。あなたができることは、Y軸を使用してカーブのどのポイントを – arclight

0

はい、あなたはこれを難しくしています。それがために動作するかどう

(ETCやサークル、ラインに沿って、)上記に提案簡素化してください、またはあなたが本当にベジェ曲線に対してそれを実行したい場合は、以下の点を考慮:で

  1. ルックベジエ曲線の定義
  2. あなたが探しているのは、現在の位置Pからの新しいオブジェクトの位置P 'とタッチ位置Dの変化を定義することです。
  3. オリジナルのP(x、y)をt(ベジエ曲線がパラメトリック)で表現すると、Dに基づいてどのくらいのオフセットを追加するのかが決まります。
  4. ベジェの微分を含むものPでのfnはそれを行う良い方法かもしれません。つまり、カーブはポイントPからカーブに沿って直線に近づいていただけです。

EDIT:セグメント間 遷移: [0,1)の各セグメントは、Tがある場合、あなたは、T> = 1を検出することができ、以前の最後にPを設定し、次のセグメントに進みその点に関連して運動を再度評価することができる。小さな点などがたくさんある場合は、ヒューリスティックスが必要な場合があります。

+0

Andrewに調整するかを決めることです。あなたの応答に感謝します。私は本当にこれを理解しようとしているので、私と一緒に耐えられますが、それはまだ私を逃しています。私は、あなたとアークライトのソリューションは、より複雑なパスではうまくいかないかもしれないと思います。自分の曲線が単一のベジェ曲線であれば、あなたのソリューションがうまくいくと思います。しかし、複数のセグメント、いくつかの直線、いくつかのクワッドカーブ、いくつかのアーク(SDKが許す)で構成されるパスを構築すると、私はどのセグメントにいるのか把握し、新しい位置を計算する必要があります。私は何を言っているのか見ていますか? – johnnysports

+0

これを処理する方法については、上記を参照してください。 –

+0

これは長い時間前に尋ねられたものですが、私はこれと同様のことをやろうとしています。私はビーサーパスを使って描いた楕円に沿ってドラッグしたいと思っています。あなたが上で推奨したことをすることができるように、楕円のすべての点を取得する方法はありますか? – gikygik

関連する問題