簡體   English   中英

在二維貝塞爾曲線上找到拐點

[英]Finding points of inflection on a 2d Bezier curve

我需要確定2d Bezier曲線上的拐點(曲率發生變化的點),參數為t ,如果存在,則0 <= t <= 1。 我最初的方法是沿曲線采樣,評估二階導數並找到導數符號變化的點。

2DVector curvature1, curvature2;
for (double t = 0, t <= 1.0; t += STEP) {
    curvature1 = bezier.CurvatureAt(t);
    curvature2 = bezier.CurvatureAt(t + (STEP/2.0 >= 1.0 ? 0 : t + STEP/2.0));
    if (isNegative(curvature1) ? isPositive(curvature2) : isNegative(curvature2)) {
        inflection_point = t;
    }
 }

其中CurvatureAt()是一種在t處評估貝塞爾曲線的二階導數的方法,但是由於貝塞爾曲線是矢量值的函​​數,該導數作為2D向量(不是std :: vector,是2D向量類)返回的。 我不知道如何解釋矢量的“符號變化之處”。 基本上我不知道如何在上述代碼段中編寫isNegative或isPositive。

還有其他方法可以找到2d Bezier曲線上的拐點嗎?

由於貝塞爾曲線可以是任意程度的,所以我認為不可能確定一個封閉形式的解決方案,但是如果我錯了,請糾正我。

曲率與二階導數相關但不相同。

參數曲線P(t) = (x(t), y(t))有符號曲率實際上是一個數字,定義為:

k(t) = (x'y'' - x''y') / (x' * x' + y' * y')^(3/2)

如果使用此公式,則您的原始想法應該可行。

若要確定貝塞爾曲線上的拐點,請在時間間隔(0,1)中找到一個或多個[當然不包括端點],貝塞爾曲線參數方程的一階和二階導數的叉積為零即f'X f''= 0。

此頁本文的第4 等各種來源中對此進行了說明

我認為您不需要這樣的循環。 根據此頁面 ,您可以在任何點計算貝塞爾曲線的曲率。 由於貝塞爾曲線具有多項式表達式,因此您可以輕松計算出曲率的符號何時發生變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM