三階貝塞爾曲線擬合1/4圓

根據(jù)貝塞爾曲線的知識(shí),我們知道三階貝塞爾曲線的參數(shù)方程如下,其中A、B、C、D為四個(gè)控制點(diǎn)坐標(biāo),P(t)表示曲線上的每一點(diǎn)。


因?yàn)橐M1/4圓,所以通過P(0)和P(1)的切線方向,應(yīng)該按照下圖所示位置安放。
其中AB為水平方向,DC為垂直方向,并且線段長(zhǎng)度|AB| = |DC| = h。



那么這個(gè)問題實(shí)際上,就轉(zhuǎn)換為計(jì)算出合理的h值,使得半徑|OJ| = 1,也即J點(diǎn)剛好在圓弧上。



根據(jù)貝塞爾曲線的對(duì)稱性,不難想出J點(diǎn)在P(0.5)處,代入公式即可求得:

同樣的結(jié)論,也可以直接由貝塞爾曲線的幾何圖形特征來推定,也即:





所以也可以再次確認(rèn)P(0.5)和J是同一點(diǎn)。

代入四個(gè)控制點(diǎn)坐標(biāo)A(0, 1),B(h, 1),C(1, h)和D(1, 0),可以求解P(0.5)點(diǎn)坐標(biāo)如下:



根據(jù)圓形方程定義,可以擬出下面方程:



從而求解出h的值為:

所以,可以最終求解出三階貝塞爾曲線模擬1/4圓的參數(shù)方程P(t)定義如下:


另一方面,該方程描述的曲線與真實(shí)1/4圓有多大差異呢?下面就針對(duì)這個(gè)問題進(jìn)行數(shù)值求解。
采用t = 0.0到1.0,步進(jìn)值0.01,求解每個(gè)點(diǎn)到原點(diǎn)的距離與半徑1的差異。

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <math.h>  
  
double bezier3(double a, double b, double c, double d, double t)  
{  
    double nt = 1.0 - t;  
    double nt2 = nt * nt;  
    double nt3 = nt * nt * nt;  
    double t2 = t * t;  
    double t3 = t * t * t;  
  
    return (a * nt3 + b * 3.0 * nt2 * t + c * 3.0 * nt * t2 + d * t3);  
}  
  
int main()  
{  
        double t, a;  
        double d, e;  
        double max_e = 0.0, min_e = 1.0;  
  
        double x, y;  
        double h = (sqrt(2) - 1.0) * 4.0 / 3.0;  
        for(t = 0.0; t < 1.01; t+=0.01)  
        {  
                x = bezier3(0, h, 1, 1, t);  
                y = bezier3(1, 1, h, 0, t);  
                d = sqrt(x * x + y * y);  
                e = d - 1.0;  
  
                a = atan2(y, x);  
                a = a * 180.0 / 3.1415926;  
  
                if(max_e < e) max_e = e;  
                if(min_e > e) min_e = e;  
                printf("%4.1f, %f\n", a, e);  
        }  
        printf("max_e = %f, min_e = %f\n", max_e, min_e);  
    return 0;  
}  

輸出結(jié)果如下:

90.0, 0.000000  
89.1, 0.000003  
88.1, 0.000010  
87.2, 0.000022  
86.2, 0.000037  
85.3, 0.000054  
84.4, 0.000073  
83.4, 0.000092  
82.5, 0.000113  
81.6, 0.000133  
80.7, 0.000153  
79.7, 0.000172  
78.8, 0.000190  
77.9, 0.000206  
77.0, 0.000221  
76.1, 0.000234  
75.2, 0.000246  
74.3, 0.000255  
73.4, 0.000263  
72.5, 0.000268  
71.6, 0.000271  
70.7, 0.000273  
69.8, 0.000272  
68.9, 0.000269  
68.0, 0.000265  
67.1, 0.000259  
66.2, 0.000251  
65.3, 0.000242  
64.4, 0.000232  
63.5, 0.000220  
62.6, 0.000208  
61.8, 0.000194  
60.9, 0.000181  
60.0, 0.000166  
59.1, 0.000152  
58.2, 0.000137  
57.3, 0.000123  
56.5, 0.000108  
55.6, 0.000094  
54.7, 0.000081  
53.8, 0.000068  
52.9, 0.000056  
52.0, 0.000045  
51.2, 0.000035  
50.3, 0.000026  
49.4, 0.000018  
48.5, 0.000012  
47.6, 0.000007  
46.8, 0.000003  
45.9, 0.000001  
45.0, 0.000000  
44.1, 0.000001  
43.2, 0.000003  
42.4, 0.000007  
41.5, 0.000012  
40.6, 0.000018  
39.7, 0.000026  
38.8, 0.000035  
38.0, 0.000045  
37.1, 0.000056  
36.2, 0.000068  
35.3, 0.000081  
34.4, 0.000094  
33.5, 0.000108  
32.7, 0.000123  
31.8, 0.000137  
30.9, 0.000152  
30.0, 0.000166  
29.1, 0.000181  
28.2, 0.000194  
27.4, 0.000208  
26.5, 0.000220  
25.6, 0.000232  
24.7, 0.000242  
23.8, 0.000251  
22.9, 0.000259  
22.0, 0.000265  
21.1, 0.000269  
20.2, 0.000272  
19.3, 0.000273  
18.4, 0.000271  
17.5, 0.000268  
16.6, 0.000263  
15.7, 0.000255  
14.8, 0.000246  
13.9, 0.000234  
13.0, 0.000221  
12.1, 0.000206  
11.2, 0.000190  
10.3, 0.000172  
 9.3, 0.000153  
 8.4, 0.000133  
 7.5, 0.000113  
 6.6, 0.000092  
 5.6, 0.000073  
 4.7, 0.000054  
 3.8, 0.000037  
 2.8, 0.000022  
 1.9, 0.000010  
 0.9, 0.000003  
-0.0, 0.000000  
max_e = 0.000273, min_e = 0.000000  

從輸出結(jié)果分析可以看到,誤差均為向著圓弧外凸,0度到45度一段,45度到90度一段。
在0度、45度和90度為最小誤差0.000000,在19.3度和70.7度達(dá)到最大誤差為0.000273,基本上非常接近1/4圓弧了。

以上,即為三階貝塞爾曲線模擬1/4圓弧的全部?jī)?nèi)容。
感謝Grapher和GeoGebra軟件,使得方便排版文章中使用的公式和曲線。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容