10

ここでわかるように、ベジエ曲線に平行に引かれた線のねじれを検出するための計算コストの低い方法を誰かが見つけ出すのを手伝ってくれることを望んでいました

ベジエ曲線に平行な線のねじれ

私がやりたいことは、キンクの交点、交点の前の始点を持つセグメント、およびキンクの後の終点を持つ最初のセグメントを決定できるようにすることです。このようにして、不要なセグメントを簡単に削除し、最初と最後のセグメントが交差点で交わるように調整できます。

間違った用語を使用している場合はお詫び申し上げます。しかし、私が理解している限り、これらのセグメントを配置する方法は、ベジエ曲線 (黄色) のセグメントの単位ベクトルを決定し、それをオフセットで乗算し、法線ベクトルを見つけて 2 つの新しい開始点と終了点を作成することです。オフセット セグメント用 (白)。

数学は私の得意分野ではないので、誰かが私を正しい方向に押し上げてくれることを願っています.

編集: 画像は実際には HTML によってサイズ変更されているため、私が話していることを理解するのに苦労している場合は、ここに直接リンクがあります: http://i.stack.imgur.com/xtils.png

4

1 に答える 1

5

最初の概算として、ベジエ曲線の曲率半径を計算します。オフセットが曲率半径以上の場合は、ねじれを探す必要があります。

具体的には、制御点を持つ 3 次ベジエの場合P0, P1, P2, P3:

B(t) = P0 * (1-t)^3 + P1 * 3*t*(1-t)^2 + P2 * 3*t^2*(1-t) + P3 * t^3
-> B'(t)  = (P1-P0) * 3*(1-t)^2 + (P2-P1) * 6*t*(1-t) + (P3-P2) * 3*t^2 
-> B''(t) = (P2+P0-2*P1) * 6*(1-t) + (P3+P1-2*P2) * 6*t

let:  cross2d(p, q) = p.x*q.y - p.y*q.x
then, radius of curvature = |B'(t)|^3 / cross2d(B'(t), B''(t))

曲率半径を署名付きの形式のままにしました。記号は、ねじれが予想される曲線の側を示す必要があります。

注: 曲率半径をゼロにすることも、曲率半径を無限にすることもできます。|B'(t)|^3と比べたほうがいいかもしれませんsigned_offset * cross2d(B'(t), B''(t))

于 2012-04-03T22:28:56.327 に答える