三次贝塞尔曲线平滑多边形
生活随笔
收集整理的這篇文章主要介紹了
三次贝塞尔曲线平滑多边形
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#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
總結
以上是生活随笔為你收集整理的三次贝塞尔曲线平滑多边形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP与UDP在socket编程中的区别
- 下一篇: 201621123021《JAVA程序设