3

曲線を弦の高さが等しいセグメントに分割したいと思います。Divide Distance ツールを使用して弦の長さを均等に分割できることはわかっていますが、高さのオプションが見つかりません。ここでそれを行ういくつかの本当に汚いコードを書きました。(私を判断しないでください。それは非エレガントで非効率的ですが、仕事はします。)

曲線を弦の高さで割った値

私が本当に聞きたいのは、Grasshopperにはすでにそれを行う機能があるため、バイナリ検索のようなものを作成しても意味がないということですが、それが失敗した場合、誰かがそれを行う方法について何か提案がありますか?より効率的な方法は?

4

1 に答える 1

3

私の答えは、細分化プロセスではなく、ベジェ曲線のコードの高さ (sagitta?) を見つけることに関係しています。

制御点 P0、P1、P2、P3 を持つ 3 次ベジェを考えます。サジッタは、コード セグメント C=P0P3 からの最大距離です。曲線の方向ベクトル (ホドグラフ、1 次導関数) が弦ベクトルと平行になると、最大距離に達します。3 次ベジェ曲線のホドグラフは、制御点を持つ 2 次ベジェ曲線です ( Sederberg book CAGD、セクション 2.7 )。

D0=3(P1-P0), D1=3(P2-P1), D2=3(P3-P2)

外積がゼロの場合、ベクトルは平行であるため、次の式が得られます

Cx*Dy-CyDx=0   or 
(P3x-P0x)*((P1y-P0y)*(1-t)^2+2*(P2y-P1y)*t*(1-t)+(P3y-P2y)*t^2) = 
(P3y-P0y)*((P1x-P0x)*(1-t)^2+2*(P2x-P1x)*t*(1-t)+(P3x-P2x)*t^2)

これは 2 次方程式です。範囲 [0..1] の t に対して 0、1、または 2 つの解がある場合があります (S 字型の曲線ではケース 2 が可能です)。次に、式から求めた t パラメータでベジエ曲線を評価し、コードまでの距離を計算できます。

于 2013-04-12T06:30:49.033 に答える