一、實(shí)現(xiàn)方案
? ? ? ?貝塞爾曲線原理:貝塞爾曲線是計(jì)算機(jī)圖形圖像造型的基本工具,是圖形造型運(yùn)用得最多的基本線條之一。它通過(guò)控制曲線上的四個(gè)點(diǎn)(起始點(diǎn)、終止點(diǎn)以及兩個(gè)相互分離的中間點(diǎn))來(lái)創(chuàng)造、編輯圖形。其中起重要作用的是位于曲線中央的控制線。這條線是虛擬的,中間與貝塞爾曲線交叉,兩端是控制端點(diǎn)。移動(dòng)兩端的端點(diǎn)時(shí)貝塞爾曲線改變曲線的曲率(彎曲的程度);移動(dòng)中間點(diǎn)(也就是移動(dòng)虛擬的控制線)時(shí),貝塞爾曲線在起始點(diǎn)和終止點(diǎn)鎖定的情況下做均勻移動(dòng)。注意,貝塞爾曲線上的所有控制點(diǎn)、節(jié)點(diǎn)均可編輯。
? ? ? ?具體實(shí)現(xiàn)通過(guò)貝塞爾公式推導(dǎo):
? ? ? ?定義:給定點(diǎn)Po,P..... Pn,則n次貝塞爾曲線由下式給出:
? ? ? ?n次貝塞爾曲線的公式可由如下遞歸表達(dá):
? ? ? ??進(jìn)一步可以得到貝塞爾曲線的遞推計(jì)算公式:
? ? ? ?所以,想要實(shí)現(xiàn)三次Bezier曲線的繪制,只需要令n=k,可得公式為:
? ? ? ?為了更好的通過(guò)計(jì)算機(jī)來(lái)實(shí)現(xiàn)此公式,通過(guò)相應(yīng)的轉(zhuǎn)換,可以得到三次Bezier曲線的矩陣,再通過(guò)此推導(dǎo)公式從t=0到t=1之間連續(xù)繪制100個(gè)點(diǎn)即可得到Bezier曲線。???
?
二、代碼實(shí)現(xiàn)
?
//坐標(biāo)點(diǎn)
struct Point
{
double x, y;
};
int fac(int n) {
if (n == 1 || n == 0)
return 1;
else
return n * fac(n - 1);
}
double powi(double base, int n) {
double res = 1;
for (int i = 1; i <= n; ++i)
res *= base;
return res;
}
void DrawBezierCurve(Point* p, int n, CDC* pDC,int color) {
double a, b;
double temp, temp1, temp2, bi;
for (double t = 0.0; t <= 1; t += 0.01) {
a = 0.0; b = 0.0;
for (int i = 0; i <= n; ++i) {
temp = double(fac(n) / fac(i) / fac(n - i));
temp1 = powi(t, i);
temp2 = powi(1 - t, n - i);
bi = temp * temp1 * temp2;
a = a + bi * p[i].x;
b = b + bi * p[i].y;
}
CPen m_newPen, * m_oldPen;
//創(chuàng)建新畫(huà)筆
m_newPen.CreatePen(PS_SOLID, 2, color);
//將新畫(huà)筆選入設(shè)備上下文,并且保存舊畫(huà)筆
m_oldPen = pDC->SelectObject(&m_newPen);
if (t == 0) {
pDC->MoveTo(a, b);
}
else {
pDC->LineTo(a, b);
}
pDC->SelectObject(m_oldPen);
}
}
Ondraw代碼:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-504464.html
Point p[4] = { {28,5},{30,20},{35.25},{40,5}};
DrawBezierCurve(p,3, pDC,RGB(10,222,55));
Line(pDC, p[0], p[1]);
Line(pDC, p[1], p[2]);
Line(pDC, p[2], p[3]);
三、代碼結(jié)果
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-504464.html
到了這里,關(guān)于計(jì)算機(jī)圖形學(xué):三次Bezier曲線的繪制(算法原理及代碼實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!