1

私はベジエ パスを使用して必要な曲線を描くプロジェクトに取り組んできました。私のプロジェクトの各基本形状は、3 つのキュービック ベジエ曲線で構成され、端から端まで配置され、勾配が交わる場所と一致します。

解決しなければならない基本的な問題は、3 つのベジエ曲線で構成される複合曲線がそれ自体と交差するかどうかです。しばらく考えた後、曲線の制約を考えると、タスクを別のものに単純化できることがわかりました。

3 つのベジエ パスのそれぞれの曲率は、隣接する曲線に対して曲率の方向が反対である必要があります。つまり、あるベジエ曲線が別のベジエ曲線に接する変曲点が存在する必要があります。そうでない場合は、カーブを生成したパラメータ セットを拒否して、別のセットを選択したいと考えています。

いずれにせよ、私の基本的な質問は、曲線が互いに接する変曲点があるかどうかを検出する方法です。

この図では、3 つのベジエ曲線がそれぞれ異なる色で示されています。左側の黒い曲線は、赤い曲線と交わる点で反対方向にカーブしていますが、右側の黒い曲線は同じ方向にカーブしています。赤と左の黒の曲線が交わる変曲点がありますが、赤と右の黒の曲線が交わる場所ではありません。

ベジエ パスのループ

編集: 以下に、ベジエ パスを囲むポリゴンを示す別の画像を追加しました。黒い曲線で示されている多角形の交差線は、ループではなく変曲点をテストします。赤と青の曲線で示されているように、ある曲線が別の曲線と交差しているかどうかは、囲んでいるポリゴンが交差しているかどうかを確認することでテストできると思います。 コントロール ポイント ポリゴンを使用したベジエ パス

PS 制約についていくつかの質問があったので、ここにそれらのいくつかをリストします。

  • 一番左の点と一番右の点の y 値は同じです。

  • 左端の制御点の x 値は、右端の制御点の x 値よりも小さいです。これにより
    、黒と青の曲線が互いに交差しなくなります。
  • 左端と右端の点の傾斜は、水平から約 +/- 10 度以内です。
  • 黒と赤の曲線の交点、および赤と青の曲線の交点は、曲線全体を約 3 分の 1 に分割します。正確な数値はわかりませんが、サンプル バウンドは、赤い曲線の左端の x 値が、右端の x 値の 25% から 40% の間のどこかにあるということです。
  • 交点の y 値は、全体の幅の +/- の一部です。
  • 交点の勾配は > 0.6 かつ < 3.0 (正または負) です。
4

4 に答える 4

1

@ Victor Engel : 説明ありがとうございます。これで、ソリューションはさらに簡単になりました。

つまり、両方の曲線のトルクを見てください。引き寄せれば「屈曲」が起こり、反対にすれば「湾曲」が続きます。

備考: 「屈折」「曲率」という言葉は、ここでは厳密な数学的意味よりも直感的な性質を持っているため、アポストロフィが使用されています。

前述のように、一連の点P0、P1、P2、P3が最初の 3 次ベジエ曲線を定義し、Q0、Q1、Q2、およびQ3が 2 番目の曲線を定義します。さらに、4 つのベクトル: a、b、u、w が役立ちます。

a = P2P3
b = P1P2
u = Q0Q1
v = Q1Q2

C1 連続性チェックは省略します。すでに完了しています。(これは、 P3 = Q0およびa x u =0 を意味します)

最後に、TpおよびTqトルクが表示されます。

Tp = b x a 

(「x」はベクトル積を意味しますが、平面上のTpはベクトルではなく単純な数値として扱われます。}

if Tp=0            {very rarely vectors a, b can be parallel.}
    b = P0P1
    Tp = b x a 
    if Tp=0 
        No! It's can't be! Who straightened the curve???
        STOP
    endif
endif

Tq = u x v 
if Tq=0            {also  vectors u, v can be parallel.}
    v = Q2Q3
    Tq = u x v 
    if Tq=0 
        Oh no! What happened to my curve???
        STOP
    endif
endif

最終テスト:

if Tp*Tq < 0  then    Houston! We have AN "INFLEXION"!
              else    WE CONTINUE THE TURN!
于 2016-08-14T20:42:19.650 に答える