5

私は過去数日間、実際の解決策なしでパスレンダリングについて困惑してきました。

パスレンダリングとは、(さまざまな距離にある)x、yデータポイントのセットを指定して、指定されたデータセットポイント間に一定の間隔で固定長の破線(または私の場合は回転したクワッド)を描画して、滑らかなパスを作成することを意味します。

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

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

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

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

これらのソリューションはどちらも理想的ではなく、どちらにも問題があります。

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

どんな助けでも大歓迎です。

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

太い点線。

アップデート:

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

乾杯リッチ

4

4 に答える 4

3

滑らかなパスを描画するために使用される「CGPathAddQuadCurveToPoint」と呼ばれる CoreGraphics 関数があります。 使い方の例は GitHub にあります

于 2009-08-03T15:01:28.367 に答える
1

ベジエ曲線またはエルミート曲線を見たいと思うかもしれませんが、 それらは計算がそれほど難しくなく、素敵な柔らかい曲線が得られます.

于 2009-08-03T14:35:30.047 に答える
1

おそらく、ベジエ曲線スプラインアルゴリズムを確認する必要があります。

于 2009-08-03T14:36:24.447 に答える
0

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

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

編集:

あ、写真助かります。これはiPhone上にあるので、それらの間に線を引くと許容できる曲線が生成される一連の点を取得していると思います。この場合、スプライン/カーブ プリミティブを使用するのはおそらくやり過ぎです。おそらく、最後のデータ ポイントから一定の距離にあるすべてのデータ ポイントでクワッドを描画するだけで、示されているように線を描画することになります。

アルゴリズムは次のようになります。

  1. 最初のデータ ポイントにクワッドを描画します (適切に回転させます)
  2. 最後のポイントから少なくとも X の距離になるまで、ポイント リストをトラバースします。
  3. 現在のポイントと最後に訪れたポイントの間を Lerp して、次のクワッドを配置する正確な中心を見つけます。
  4. クワッドを描画します (適切に回転させます)
  5. 手順 2 に進みます
  6. 最後のクワッドの部分的なポイントがある場合は、通常どおりに描画します (これにより、切り詰めるよりもビジュアルが向上します)。

楽しみのために、2 点間の距離よりも短い距離 D で 2 点間を lerp します (これはおそらく 2D の場合はより単純ですが、私は一般的に作業するのが好きです):

vector v = point2 - point1;
normalize(v);
v *= D;
finalPoint = point1 + v;
于 2009-08-03T14:24:25.750 に答える