2011-06-24 15 views
6

こんにちは、私の質問は、離散的なステップを使用して空間の任意の弧のプロットに関連
離散的なステップにおけるアーク

背景をプロットします。しかし、私は典型的な意味でキャンバスに描かれていないという点でユニークです。私が設計しているファームウェアは、コマンドをステッピングモーターの動きに変換するCNCミル用のgcodeインタプリタです。今、私はすでにこのサイトで同様の質問を見つけましたが、提案された方法論(Bresenham's Algorithm)は、宇宙でオブジェクトを動かすためには互換性がないように見えます。残りの対称軸についてさらに、2つの任意の角度の間でアークを計算する所定の方法は、三角法(私はマイクロコントローラ上に実装しており、可能であれば高価な三角関数を避けたい)に依存し、単純に範囲外のステップをとらない。最後に、このアルゴリズムは、1つの回転方向(例えば反時計回り)で動作するようにのみ設計されている。実際の質問へのだから、

質問
、:誰もがまだ角度方向(CW /への尊敬の念を与えながら、離散ステップで任意の弧を「描く」ために使用できる汎用アルゴリズムを知っていますCCW)?最終的な実装はC言語で行われますが、質問の目的の言語は無関係です。

ありがとうございます。

参照
SOブレゼンハムのアルゴリズムを使用して、単純な円を描くに投稿:実装されるサークルのためのブレゼンハムのアルゴリズムを説明
"Drawing" an arc in discrete x-y steps

Wikiページを
http://en.wikipedia.org/wiki/Midpoint_circle_algorithm

Gコード命令(参照してください。 G2、G3)
http://linuxcnc.org/docs/html/gcode.html

+0

は、マイクロコントローラは、ハードウェアでサポートされている浮動小数点演算を持っているのですか? – titus

+0

はい、いいえ。私が現在サポートしているコントローラにはハードウェアFPはありませんが、適度に最適化されたソフトウェアFPライブラリ(AVR Mega32)はあります。私は、ハードウェアFPをサポートするより肥大な32ビットAVRにアップグレードすることを検討してきました。実際には、座標を整数ステップに変換し、FP誤差アキュムレータに頼るだけで、モーターのステップに "ラインアップ"しないと、FPのほとんどの要素を取り巻くことになっていました。しかし、私はこの時点で何かを開いています。何か違いがあれば、4000ステップ/インチになります。 – phobos51594

+0

ああ、固定小数点もオプションです。私が使用している安価な機械部品を使用すると、解像度が0.005であると見なされるだけではありません。それを過ぎていくつかの場所は、おそらく私の車よりもコストがかかる可能性があり、誤差蓄積に十分な機械の領域です。 – phobos51594

答えて

8

。これは、簡単に円と双曲線のような円錐曲線のために行うことができます。

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/NURBS/RB-conics.html

あなたは離散的なステップに曲線を再サンプリングし、合理的なベジェ曲線を持っていたら、あなたはデカステリョのアルゴリズムを使用する必要があります。このアルゴリズムは動的プログラミングを使用し、非常に高速かつ数値的に堅牢です。あなたが前にそれを聞いていない場合、私は本当にそれについての学習をお勧めします、それはかなり巧妙な少しアルゴリズムであることから:

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html

あなたはその後、離散を取得するためにデ・カステリョのアルゴリズムを使用することができますいくつかの方法がありますあなたの曲線のサンプリング。まず、パラメータ空間に沿って曲線を一様に増やして評価するために、それを単純に適用することができます。増分が均等に配置する必要がある場合、あなたはあなたの補間を変更する必要が弧長の単位に座標:

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/curves/continuity.html#Arc-Length-Parameterization

この技術の改良は、代わりにアーク長に近づく弦長パラメータに変換することです時間をかけパラメータ:あなたは、曲線上の点の多くを必要とする場合

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/INT-APP/PARA-chord-length.html

最後に、あなただけのリミットPに初期制御点ベクトルを絞り込むための手順をカットコーナーとして、デ・カステリョのアルゴリズムを適用することができます

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-sub.html

これらのノートは、教授C.K.から採取した:そのolygon任意の公差を指定した一部のユーザーにご希望の曲線を近似スプラインとサブディビジョンサーフェスについて学ぶための素晴らしいリソースですSheneのコースノート、:

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/

+1

すべてのリンクをありがとう。私は特に、これが表現可能な曲線をどのように扱うために簡単に拡張できるのが好きです。 – phobos51594

+0

np、これは今日のすべての産業用CADパッケージで使用されている標準的な技術です。 NURBSが他のすべてのプリミティブを代数的表面の支配的表現として置き換えた理由はあります:) – Mikola

0

これは馬鹿馬鹿しい考えですが、コンピュータ上で可能なすべての半径の円を計算し、マイクロコントローラのメモリにこの情報を保持するだけで動作します。

半径が1〜1000ピクセルの円があるとします。すべてのサークルで1000 *(1000 + 1)/ 2 * 2 * pi = 300万ポイント
実際に各ポイントに対して前のポイントからのオフセットのみが必要な場合は8個の場合、3ビットでエンコードすることができます
マイクロコントローラのビット数に応じて、たとえば8/16ビットの場合、2ピクセル/バイトまたは5ピクセル/ワードがあります。
8ビットマイクロで1.5MBのメモリ、16ビットマイクロで1.2MB必要です。
半径がkピクセル増分の円を保存し、1.5MB/kメモリだけを使用できます。
別の最適化では、円が多くの辺を持つポリゴンとしてモデル化され、前のポイントまでのオフセットは保持されず、2ステップ以上離れたポイントまで保持され、その間のピクセルが何らかの形で補間されます。
2ステップ離れたピクセルのオフセットを保持している場合、4ビット= 3/2millionポイント=> 750KBytes
にエンコードされている場合、sステップごとにピクセルを保持すると8 + log2(s)ビット。
LE:
画素毎32steps/8mils => 10インチの半径の円10 * 4000 * 2 * PI/32steps * 1バイト= 7.85キロバイト、 画素毎128steps/32mils => 10インチの半径の円10 * 4000 * 2 * PI/128 * 10ビット= 19634Kbits = 2.4キロバイト
LLE: あなたが実際にS * 8つの可能性を持っていないズームイン円は
直線であるので、それよりも少ないがあることすべてはどのようにダウンしていますデータをパックすることも、外部メモリを使用することもできます
別の最適化:四分円または八分円のみを格納し、残りを対称性から把握します LLLE:あなたはデ・カステリョのアルゴリズムを適用した後、合理的なベジェ曲線に変換することにより、任意の合理的な曲線のために正確かつ迅速にこの問題を解決することができます すべての

+0

うーん、興味深い考え。残念ながら、私はモーター/リードスクリューの選択により、1インチあたり4000ステップ(実際にはピクセル)が得られるので、1000ピクセル以上のものが必要です。問題のマイコンには合計32Kのフラッシュメモリが搭載されています。確かに私が考えていたものではありません。 – phobos51594

+0

円の半径分布は線形ではなく指数関数的なので、4,8,12,16、...の代わりに1,2,4,8,16、...となります。私は上記の両方の最適化を使用すれば32Kに適合すると思う。 – titus

関連する問題