2009-08-03 3 views
5

私は実際の解決策なしで過去数日間のパスレンダリングで困惑してきました。データポイントのセットを指定して滑らかなパスをレンダリングするにはどうすればよいですか?

パスレンダリングとは、与えられたデータセットポイントの間の一定の間隔で固定長の破線(または私の場合は回転した四角形)を描画するためのx、yデータポイントのセット滑らかなパスを作成します。

iPhone用のフライトコントロールがある場合、私はそのゲームのパスレンダリングと同様の効果を作り出そうとしています。

ここに私の問題があります。グラフィックの幅+ギャップが、2つのデータセットポイント間の距離に正確にはわからない場合は、オーバーラップまたはアンダーラップが残されます。これに対する私の唯一の解決策はどちらかです

1)オーバーラップ/アンダーラップポイントを次のデータセットポイントの終点とし、そこから次のポイントまで描画します。

2)必ず最終エンドポイントの下に描画し、次のデータポイントから新しいものを開始します。

いずれの解決策も理想的ではなく、どちらも問題があります。

誰かがより良い解決策を持っていますか?

ご協力いただければ幸いです。

次の画面では、私が作成しようとしているものを示していますhttp://www.firemint.com/flightcontrol/screenshots-peaceful.html

太い点線を。

更新:

こんにちは私は(4つの制御点を介して)次曲線を算出した曲線を介してレンダリングしようとしました。しかし、問題は補間の1つです。 0と1が与えられると、私は任意の2つの点を踏むことができます。しかし、私は全体の道を歩みたい(複数のコントロールポイント)。問題は、いくつかの制御点が異なる距離離れているため、一定のステップ増分(たとえば0.2)でステップインすると不規則な結果が生じることです。私はパス全体を正確に歩むために、私は曲線全体の長さを計算する必要があることを理解しています...質問はどうやってそれを行うのですか? ...または別の方法がありますか?

乾杯 リッチ

+0

このトピックについての解決策はありますか? –

答えて

0

あなたは、固定サイズの大腿四頭筋を完全に制限されていますか?理想的な解決策は、最後のクワッドを正しいサイズに切り捨てることです。

制限されている場合は、いくつかのことができます。破線を描いている場合は、端点の部分的な四角で終わることがないように、ダッシュの距離を変えることができます。これは、距離がセグメントの長さに基づいて調整されるため、視覚的に気を散らす可能性があります。

編集:

ああ、写真が役立ちます。これはiPhone上にあるので、それらの間に描画線が許容できる曲線を描く一連の点が得られていると思います。これがスプライン/カーブプリミティブを使用している場合、おそらく過剰です。私はおそらく、最後のデータ点から所定の距離にあるすべてのデータ点に四角形を描くだけで、描画線に近づくでしょう。

アルゴリズムのようなものになります:あなたが最後の点

  • から少なくともXの距離にいるまで、ポイントリストトラバース
  • (適切に回転した)最初のデータポイントにクワッドを描画

    1. 現在のポイントと最後に訪問されたポイントとの間を移動して、次のクワッドを配置する正確な中心を見つけます。
    2. は、あなたが最後のクワッドのための部分的なポイントを持っている場合(これはそれを切り捨てるよりも優れたビジュアルを与える)、通常のようにそれを描く2
    3. をステップ(適切に回転させ)、クワッド
    4. 移動を描画します。楽しみのために

    、2点間の距離よりも小さいいくつかの距離D(これはおそらく、2次元の場合に、より単純であるが、私は一般的に動作するように)ことにより、2つのポイント間lerpする:

    vector v = point2 - point1; 
    normalize(v); 
    v *= D; 
    finalPoint = point1 + v; 
    
  • +0

    私は、現在のものから所定の距離だけ離れたデータ点を受け入れますので、私の点の照合は最小の距離になります。私の回転したグラフィックと同じ距離です。しかし、ユーザーが指をすばやく動かすと、ポイント間の距離が大きくなります(したがって、補間します)。これは私が現在やっているのと同じように聞こえるので、Lerpingの部分をもう少し詳細にしてください。これはスクリーンショットのようにスムーズなパスを作りません。 – Rich

    +0

    私が説明した方法は、ダッシュの間の距離の2倍よりも離れていないデータポイントがある場合にのみ良好に見えます。データポイントがそれより遠い場合は、カーブフィッティング方法を調べる必要があります(このような問題の標準曲線フィッティングはCatmull-romになる傾向があります)。 –

    +0

    補間に関しては、データポイントが正確に四角形を描画したい場所の上にないことが多いため、2つのデータポイントの間のどこかに移動する必要があります。どの2つの間にしたいのか分かっている場合、線形補間を適用することができます(直線に沿ってどのくらいの距離にあるかに基づいていくつかの補間定数の2点間の線の方程式を解く) (上記のように)曲線近似補間を適用します。 –

    3

    "CGPathAddQuadCurveToPoint"というCoreGraphics関数があり、滑らかなパスの描画に使用されます。 An example on how to use it is on GitHub

    +0

    ありがとう、私は家に帰るときにそれを与えます。教えてください、Open GLESでできることは何ですか?私が知っているように、CoreGraphicsの多くはOpen GLESでは動作しません。 – Rich

    +0

    @Richは、CoreGraphicsのものをOpenGLと統合できる程度にOpenGLと統合することができます。私はこの問題についての経験はない。 =) –

    +0

    私はあなたが開いているglの表面のコアグラフィックスのもののontopをレンダリングできるとは思わなかったか??? – Rich

    関連する問題