4

円弧に沿ってパスを変換しようとしています。

私のプロジェクトは osX 10.8.2 で実行されており、ペイントは CALayers の CoreAnimation を介して行われます。

私のプロジェクトには、パスで描画される波形があります。底面にミラーリングされた約 200 のサンプル ポイントがあります。これらは 1 秒あたり 60 回ペイントされ、曲の位置に更新されます。

白い線は無視してください。これは単なる回転インジケータです。

状況

私が達成しようとしているのは、弧に沿って波形を描くことです。「上」は真ん中を指す必要があります。一周する必要はありません。波形は緑色の円に沿って描画されます。下のスケッチを見てください。

私が達成したいこと

パフォーマンスの高い方法でこれを達成する方法がわかりません。座標補正が必要なポイントは毎秒多くあります。

私は自分自身のいくつかのアイデアを考え出そうとしました:

1)パスに線形変換を追加する可能性がありますが、ここでは役に立たないと思います。私が考えることができる唯一のことは、ポイントの追加、変換によるパスの回転、別のポイントの追加、回転などです。しかし、これは非常に遅いと思います

2)パスを画像に描画して曲げると、画像アーティファクトが確実に発生します。

3) アーク上のサンプル ポイントを事前に計算してから、ベクトルを中心に保存するのが最善の方法かもしれません。波形の y 座標を取得し、それらをサンプル ポイントに配置し、ベクトルに沿って中心に移動します。

しかし、この問題に対する簡単な解決策が見当たらないだけかもしれません。ヘルプは本当にありがたいですし、新鮮なアイデアは大歓迎です。前もって感謝します!

4

1 に答える 1

2

私見、(CPU使用率の観点から)最も効率的な方法は、ディスプレイの解像度を考慮した事前計算されたアプローチを使用することです。

巧妙に事前計算された値

数学的変換 (線形から極へ) を行い、次の 2 つの事実を組み合わせます。

  1. 膨大な数学的計算を実行する必要はありません
  2. 互いに近すぎる 2 点をレンダリングする必要はありません

既製のアルゴリズムはありませんが、事前に計算された sin または cos テーブルを使用して、整数を操作するためにデータ範囲を表示サイズに一致させることができます。

たとえば、0 から 1E6 の範囲のデータがあり、各ポイントの sin 値を 100 ピクセルの高さの長方形に表示する必要があるとします。事前に計算された sin テーブルを使用して、整数を操作できます。このようにして、ポイントの sin 値を表示するのがずっと速くなります。この概念を改良して、より良い結果を得ることができます。また、表示された曲線が実際に元の曲線のように見えるように、曲線の重要な点のみを保持する方法がいくつかあります (wikipedia のRamer–Douglas–Peucker アルゴリズムを参照してください)。しかし、刻々と変化するデータをすばやく表示するには効率が悪いことがわかりました。

マルチコア レンダリングの使用

  1. 複数のコアを使用して、曲線のさまざまな領域を計算できます (注意が必要な場合があります)。
  2. または、複数のコアを使用して事前計算を使用し、1 つのコアでジョブを完了することもできます。
于 2013-01-05T01:29:08.833 に答える