日韩性视频-久久久蜜桃-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曲线的关系的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 97久久精品人人澡人人爽 | 国产超级av | 麻豆免费视频网站 | 成年人在线免费观看 | 性激情视频 | 欧美日韩在线二区 | 欧美野外猛男的大粗鳮 | 亚洲性影院| 中国一级片黄色一级片黄 | 国产91精品久久久 | 日本黄色特级片 | 久久精品国产清自在天天线 | 污污视频在线免费观看 | 国产成人精品一区二区三区免费 | 亚洲综合婷婷久久 | 高跟鞋丝袜猛烈xxxx | 亚洲黄色免费在线观看 | 国产视频在线观看一区二区 | 精品视频一区二区三区在线观看 | 国产精品99无码一区二区视频 | 师生出轨h灌满了1v1 | 国语对白做受xxxxx在线中国 | 538国产视频 | 国产免费三片 | av手机在线免费观看 | 成人无遮挡 | 亚洲拍拍视频 | 欧美人与性动交a欧美精品 日韩免费高清视频 | 天天摸天天做天天爽 | 国产性―交一乱―色―情人 | 亚洲AV无码乱码国产精品色欲 | 亚洲中文字幕一区二区 | 国产伦精品一区二区三区四区免费 | 欧美一级黄 | 成年人免费大片 | 亚洲色成人www永久网站 | 日韩中文字幕二区 | 日韩性网 | 国产黄在线观看 | 另类小说亚洲色图 | 激情视频91 | 国产-第1页-浮力影院 | av字幕在线 | 黄色性网站 | 免费黄色三级 | 亚洲国产传媒 | 超碰人人在线 | 69sex久久精品国产麻豆 | 日本理论片午伦夜理片在线观看 | 天天曰夜夜操 | 老妇裸体性激交老太视频 | 亚洲精品久久久久久动漫器材一区 | 桃花久久| 午夜生活片 | 亚洲福利专区 | 日韩免费专区 | 99xav| 91在线视频在线观看 | 丁香花电影免费播放在线观看 | 国产中文久久 | 污网站在线看 | 在线观看中文字幕第一页 | 国产女主播一区 | 亚洲爽爆 | 嫩模啪啪 | 精品国产免费无码久久久 | 成人免费看片在线观看 | 亚洲精品久久久蜜桃 | 久久久久久香蕉 | 丰满熟妇肥白一区二区在线 | 欧美黄色一级生活片 | 99re这里 | 欧美激情一区二区 | 一区二区三区在线免费观看视频 | 天天色综合色 | 在线观看污视频网站 | 大乳巨大乳j奶hd | 黄色你懂的 | 波多野结衣免费视频观看 | 亚洲精品一区二三区 | 8x国产一区二区三区精品推荐 | 337p日本欧洲亚洲大胆张筱雨 | 黄瓜视频在线观看 | 做爰视频毛片视频 | 四虎影视黄色 | 国产在线精品播放 | 丰满人妻一区二区三区大胸 | 欧美一区二区 | 欧美一区二区在线观看视频 | 久久免费少妇高潮久久精品99 | 图片区偷拍区小说区 | 国产黄色激情视频 | 男人av在线 | 老妇荒淫牲艳史 | 国产区久久| 永久av网站 | 亚洲激情视频小说 | 制服丝袜影音先锋 | 黄色的视频网站 |