簡體   English   中英

將單個貝塞爾曲線擬合到 3D 中的 4 個點

[英]Fitting a single bezier curve to 4 points in 3D

是否有一種簡單的方法可以將貝塞爾曲線的單段曲線擬合為 3D 中的 4 個點?

這是我正在嘗試做的一個例子:

bezier_1

這是該段生成的 Bezier 句柄的另一張圖片:

bezier_2

在這種情況下,我嘗試手動排列貝塞爾曲線,使其與 4 個給定點相交,並產生盡可能短的曲線。 理想情況下,我想以某種方式以編程方式執行此操作-我在網上找到了一些執行此操作的算法,但其中大多數似乎用於創建具有任意數量段的曲線……而我只需要擬合一個單線段(兩個點,兩個控制點)到 3D 中的四個點盡可能接近。

解決這個問題的最佳方法是什么?

要使單個貝塞爾曲線通過所需的點,您應該知道這些點的參數t

似乎您沒有關於曲線的附加信息,因此作為第一個近似值,您可以先將參數t=1/3分配給第一個點,將參數t=2/3分配給第二個點,然后計算貝塞爾曲線的控制點以提供P(1/3) == InternalPoint1 and P(2/3) == InternalPoint2

如果第一個內部點靠近起點,這種假設可能會導致奇怪的曲線形式,因此在一般情況下,粗略評估參數是值得的 - 例如,使用對P0-P3, P0-P1, P2-P3之間的距離比.

鏈接答案中的更多信息和圖片

從我的 Delphi 函數中摘錄一些偽代碼

  procedure CalcBezierFromPoints(SrcPt: 4 source points
                                 BezPt: 4 resulting control points
                                 t1: Double = 1 / 3; t2: Double = 2 / 3);
 var
    tt1, tt2: Double;
    Det, a11, a12, a21, a22, b1, b2: Double;
begin
   //start and end points remains the same
   BezPt[0] := SrcPt[0];
   BezPt[3] := SrcPt[3];

   //auxiliary values
   tt1 := 1 - t1;
   tt2 := 1 - t2;

   //Solution of linear equation system
   a11 := 3 * tt1 * tt1 * t1;
   a12 := 3 * tt1 * t1 * t1;
   a21 := 3 * tt2 * tt2 * t2;
   a22 := 3 * tt2 * t2 * t2;
   Det := a11 * a22 - a12 * a21;

   b1 := SrcPt[1].X - SrcPt[0].X * tt1 * tt1 * tt1 - SrcPt[3].X * t1 * t1 * t1;
   b2 := SrcPt[2].X - SrcPt[0].X * tt2 * tt2 * tt2 - SrcPt[3].X * t2 * t2 * t2;
   BezPt[1].X := Round((b1 * a22 - b2 * a12) / Det);
   BezPt[2].X := Round((-b1 * a21 + b2 * a11) / Det);

  //the same for Y and Z components
end;

暫無
暫無

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

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