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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

三次贝塞尔曲线平滑多边形

發布時間:2024/4/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三次贝塞尔曲线平滑多边形 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#pragma once#include "opencv.hpp" #include "StdStrFile.h"void CurvePoly(const std::vector<cv::Point>& vPtsInput, std::vector<cv::Point> &curvePoint); #include "CurvePoly.h"//三次貝塞爾曲線 float bezier3funcX(float uu, cv::Point *controlP){float part0 = controlP[0].x * uu * uu * uu;float part1 = 3 * controlP[1].x * uu * uu * (1 - uu);float part2 = 3 * controlP[2].x * uu * (1 - uu) * (1 - uu);float part3 = controlP[3].x * (1 - uu) * (1 - uu) * (1 - uu);return part0 + part1 + part2 + part3; } float bezier3funcY(float uu, cv::Point *controlP){float part0 = controlP[0].y * uu * uu * uu;float part1 = 3 * controlP[1].y * uu * uu * (1 - uu);float part2 = 3 * controlP[2].y * uu * (1 - uu) * (1 - uu);float part3 = controlP[3].y * (1 - uu) * (1 - uu) * (1 - uu);return part0 + part1 + part2 + part3; }void CurvePoly(const std::vector<cv::Point>& vPtsInput, std::vector<cv::Point> &curvePoint) {//控制點收縮系數 ,經調試0.6較好,cv::Point是opencv的,可自行定義結構體(x,y)int originCount = vPtsInput.size();float scale = 0.6;cv::Point* midpoints = new cv::Point[originCount];//生成中點 for (int i = 0; i < originCount; i++){int nexti = (i + 1) % originCount;midpoints[i].x = (vPtsInput[i].x + vPtsInput[nexti].x) / 2.0;midpoints[i].y = (vPtsInput[i].y + vPtsInput[nexti].y) / 2.0;}//平移中點 cv::Point* extrapoints = new cv::Point[2 * originCount];for (int i = 0; i < originCount; i++){int nexti = (i + 1) % originCount;int backi = (i + originCount - 1) % originCount;cv::Point midinmid;midinmid.x = (midpoints[i].x + midpoints[backi].x) / 2.0;midinmid.y = (midpoints[i].y + midpoints[backi].y) / 2.0;int offsetx = vPtsInput[i].x - midinmid.x;int offsety = vPtsInput[i].y - midinmid.y;int extraindex = 2 * i;extrapoints[extraindex].x = midpoints[backi].x + offsetx;extrapoints[extraindex].y = midpoints[backi].y + offsety;//朝 originPoint[i]方向收縮 int addx = (extrapoints[extraindex].x - vPtsInput[i].x) * scale;int addy = (extrapoints[extraindex].y - vPtsInput[i].y) * scale;extrapoints[extraindex].x = vPtsInput[i].x + addx;extrapoints[extraindex].y = vPtsInput[i].y + addy;int extranexti = (extraindex + 1) % (2 * originCount);extrapoints[extranexti].x = midpoints[i].x + offsetx;extrapoints[extranexti].y = midpoints[i].y + offsety;//朝 originPoint[i]方向收縮 addx = (extrapoints[extranexti].x - vPtsInput[i].x) * scale;addy = (extrapoints[extranexti].y - vPtsInput[i].y) * scale;extrapoints[extranexti].x = vPtsInput[i].x + addx;extrapoints[extranexti].y = vPtsInput[i].y + addy;}CStdStrFile ssf;std::vector<cv::Point> vResPts;cv::Point controlPoint[4];//生成4控制點,產生貝塞爾曲線for (int i = 0; i < originCount; i++){controlPoint[0] = vPtsInput[i];int extraindex = 2 * i;controlPoint[1] = extrapoints[extraindex + 1];int extranexti = (extraindex + 2) % (2 * originCount);controlPoint[2] = extrapoints[extranexti];int nexti = (i + 1) % originCount;controlPoint[3] = vPtsInput[nexti];float u = 1;while (u >= 0){int px = bezier3funcX(u, controlPoint);int py = bezier3funcY(u, controlPoint);//u的步長決定曲線的疏密 u -= 0.05;cv::Point tempP = cv::Point(px, py);//存入曲線點 if (!ssf.VectorContains(vResPts, tempP)){vResPts.push_back(tempP);}}}//這樣做是為了讓函數輸入和輸出可以使用同一個參數curvePoint = vResPts;delete[] midpoints;midpoints = nullptr;delete[] extrapoints;extrapoints = nullptr; }

?

轉載于:https://www.cnblogs.com/autumoonchina/p/7700091.html

總結

以上是生活随笔為你收集整理的三次贝塞尔曲线平滑多边形的全部內容,希望文章能夠幫你解決所遇到的問題。

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