日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hermite曲线与Bezier曲线的关系

發布時間:2025/4/16 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hermite曲线与Bezier曲线的关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

結論

最近在研究3次樣條曲線。曲線由四個控制點控制,依次記為P0,P1,P2,P3。在繪制Hermite曲線的時候,發現如果令P0處的導數為3倍P1-P0,P3處的導數為3倍P3-P2,則P0,P1,P2,P3構成的Hermite曲線與P0,P1,P2,P3構成的Bezier曲線完全相同。

下面詳細分析說明這一點

分析

通用的三次Hermite曲線的參數表達式為

P(u)=P0(2u3?3u2+1)+P3(?2u3+3u2)+P0′(u3?2u2+u)+P3′(u3?u2)P(u)=P_0(2u^3-3u^2+1)+P_3(-2u^3+3u^2)+P'_0(u^3-2u^2+u)+P'_3(u^3-u^2)P(u)=P0?(2u3?3u2+1)+P3?(?2u3+3u2)+P0?(u3?2u2+u)+P3?(u3?u2)

剛剛我們說明了,如果P0′=3(P1?P0)P'_0=3(P_1-P_0)P0?=3(P1??P0?),P3′=3(P3?P2)P'_3=3(P_3-P_2)P3?=3(P3??P2?),那么上式又可以化為
P(u)=(u3?3u2+1)P0+(?2u3+3u2)P3+3(P1?P0)(u3?2u2+u)+3(P3?P2)(u3?u2)P(u)=(u^3-3u^2+1)P_0+(-2u^3+3u^2)P_3+3(P_1-P_0)(u^3-2u^2+u)+3(P_3-P_2)(u^3-u^2)P(u)=(u3?3u2+1)P0?+(?2u3+3u2)P3?+3(P1??P0?)(u3?2u2+u)+3(P3??P2?)(u3?u2)
整理一下可以得到
P(u)=(1?3u+3u2?u3)P0+(3u?6u2+3u3)P1+(3u2?3u3)P2+u3P3P(u)=(1-3u+3u^2-u^3)P_0+ (3u-6u^2+3u^3)P_1+(3u^2-3u^3)P_2+u^3P_3P(u)=(1?3u+3u2?u3)P0?+(3u?6u2+3u3)P1?+(3u2?3u3)P2?+u3P3?
P(u)=(1?u)3P0+3u(1?u)2P1+3u2(1?u)P2+u3P3P(u)=(1-u)^3P_0+3u(1-u)^2P_1+3u^2(1-u)P_2+u^3P_3P(u)=(1?u)3P0?+3u(1?u)2P1?+3u2(1?u)P2?+u3P3?

這正是三次Bezier曲線的公式

Demo演示

下面用OpenCV分別畫Hermite曲線和Bezier曲線,兩條曲線完全重合。

Demo演示代碼

#include <opencv2/opencv.hpp> #include <iostream> #include <vector> #include <cmath>using namespace std; using namespace cv;string mainwindow = "構造線";Point2d control_points[4]; int control_points_index = 0;int height = 600; int width = 800;Mat screen_mat;const double CHOOSE_THRESHOLD = 20;bool choose_flag = false; int choose_point;const int LINE_N = 1000; // 線段的個數,點數為LINE_N+1void on_mouse_handler(int event, int x, int y, int flag, void* param) /* x, y 的原點在左上角 */ {double dist;if (event == EVENT_LBUTTONDOWN){if (control_points_index < 4){control_points[control_points_index].x = x;control_points[control_points_index].y = y;control_points_index++;}else{for (int i = 0; i < 4; i++){dist = (control_points[i].x - x) * (control_points[i].x - x) + (control_points[i].y - y) * (control_points[i].y - y);if (dist < CHOOSE_THRESHOLD * CHOOSE_THRESHOLD){//cout << "Choose " << i << endl;choose_flag = true;choose_point = i;return;}}}}else if (event == EVENT_LBUTTONUP){choose_flag = false;}else if (event == EVENT_MOUSEMOVE){if (choose_flag){control_points[choose_point].x = x;control_points[choose_point].y = y;}} }void imag_update() {screen_mat = Mat::zeros(height, width, CV_8UC4);for (int i = 0; i < control_points_index; i++){drawMarker(screen_mat, control_points[i], Scalar(0, 0, 255, 255), MARKER_STAR, 5);}if (control_points_index == 4){Point2d v0, v1, v2, v3;Point2d bv0, bv1, bv2, bv3;//Hermitev0 = control_points[0];v1 = control_points[3];v2 = control_points[1] - control_points[0];v3 = control_points[3] - control_points[2];v2 = 3 * v2;v3 = 3 * v3;//Bezierbv0 = control_points[0];bv1 = control_points[1];bv2 = control_points[2];bv3 = control_points[3];Point2d p0 = control_points[0];Point2d bp0 = control_points[0];Point2d p1;Point2d bp1;double u;double c0, c1, c2, c3;double bc0, bc1, bc2, bc3;for (int i = 1; i < LINE_N; i++){u = i * 1.0 / LINE_N; c0 = 2 * u * u * u - 3 * u * u + 1;c1 = -2 * u * u * u + 3 * u * u;c2 = u * u * u - 2 * u * u + u;c3 = u * u * u - u * u;//Bezierbc0 = (1 - u) * (1 - u) * (1 - u);bc1 = 3 * u * (1 - u) * (1 - u);bc2 = 3 * u * u * (1 - u);bc3 = u * u * u;p1.x = v0.x * c0 + v1.x * c1 + v2.x * c2 + v3.x * c3;p1.y = v0.y * c0 + v1.y * c1 + v2.y * c2 + v3.y * c3;bp1.x = bv0.x * bc0 + bv1.x * bc1 + bv2.x * bc2 + bv3.x * bc3;bp1.y = bv0.y * bc0 + bv1.y * bc1 + bv2.y * bc2 + bv3.y * bc3;line(screen_mat, p0, p1, Scalar(0, 0, 255, 128), 1, LINE_AA);line(screen_mat, bp0, bp1, Scalar(0, 255, 0, 128), 1, LINE_AA);p0 = p1;bp0 = bp1;}}imshow(mainwindow, screen_mat); }void window_initialize() {namedWindow(mainwindow, WINDOW_AUTOSIZE);setMouseCallback(mainwindow, on_mouse_handler); }void main_loop() {/* Endless loop until ESC key pressed*/bool finished = false;int pressed_key = 0;while (!finished){imag_update();pressed_key = waitKey(10);if (pressed_key == 27) finished = true;} }int main() {window_initialize();main_loop();return 0; }

總結

以上是生活随笔為你收集整理的Hermite曲线与Bezier曲线的关系的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲第一在线视频 | 极品美女销魂一区二区三区 | 久久精品亚洲精品国产欧美 | 国产一区视频在线观看免费 | 漂亮人妻被黑人久久精品 | av网天堂 | 播播激情网 | 日韩毛片免费看 | 日本一区二区视频免费 | 超碰超碰超碰超碰超碰 | 国产精品黄色在线观看 | 亚洲社区在线 | 成年人在线免费看 | 欧美永久精品 | 一区二区三区91 | 国产精品二三区 | 精品欧美久久 | 天堂av资源在线 | 福利视频免费 | 国产成人精品一区二区三区网站观看 | 麻豆网| 免费国产黄色 | 美女一级| 性猛交ⅹxxx富婆video | 日韩在线精品 | 一区在线观看视频 | 在线观看av一区二区 | 精品人妻一区二区三区免费 | 成人看片网 | 亚洲国产欧美一区二区三区深喉 | 日韩欧美综合久久 | 91精品入口 | 国产香蕉一区二区三区 | 婷婷国产| 777av| 日韩人妻精品一区二区三区视频 | 日本三区在线 | 日韩精品乱码久久久久久 | 大陆女明星乱淫合集 | 双性高h1v1 | 久久久久99精品成人片 | 手机天堂网 | 日韩黄色网页 | 最近高清中文在线字幕在线观看 | 九草在线视频 | 夜夜爽日日澡人人添 | 青青草国内自拍 | 亚洲精品亚洲 | 久久久久久久久久网站 | 欧美国产成人在线 | 美女张开腿流出白浆 | 人人妻人人澡人人爽欧美一区 | 免费av在线网 | 久久久久久精 | 亚洲精品一二三四 | 麻豆视频国产 | 久久久久女人精品毛片九一 | 逼逼爱插插网站 | 中文字幕在线播放日韩 | 久久天堂视频 | 一本色道久久hezyo加勒比 | 色欲av无码精品一区 | 午夜精品福利一区二区三区蜜桃 | 国产香蕉视频在线 | 久久久久亚洲av成人网人人网站 | 黄a网站 | 波多野42部无码喷潮在线 | 日韩精品电影在线观看 | 欧美色图亚洲天堂 | 国产三级视频在线 | 美日韩黄色片 | 久久精品国产99精品国产亚洲性色 | 国产手机在线视频 | 蜜桃av一区二区三区 | 91蝌蚪少妇 | 日本黄色录像片 | 成人精品一区二区三区电影 | 久久久国产一区二区三区 | 在线观看网站av | 上原亚衣在线 | 黑人玩弄人妻一区二区三区免费看 | 91麻豆映画传媒 | 日韩一级免费毛片 | 午夜亚洲AV永久无码精品蜜芽 | 久久亚洲影院 | 中文字幕在线观看第二页 | 奇米色777 | 午夜精品久久久久久久久久久久久蜜桃 | 熟女俱乐部五十路六十路av | 亚洲欧美日韩综合在线 | 女人高潮潮呻吟喷水 | 中文天堂在线观看 | 我要操av| 亚洲激情短视频 | 日本五十路在线 | 综合久久91| 奇米影视亚洲春色 | 欧美丝袜一区二区三区 | 欧美精产国品一二三区 |