python 等值面多边形平滑_三次贝塞尔曲线平滑多边形
#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<:point>& vPtsInput, std::vector<:point> &curvePoint)
{//控制点收缩系数 ,经调试0.6较好,cv::Point是opencv的,可自行定义结构体(x,y)
int originCount =vPtsInput.size();float scale = 0.6;
cv::Point* midpoints = newcv::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<: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;
}
python 等值面多边形平滑_三次贝塞尔曲线平滑多边形相关推荐
- 三次贝塞尔曲线平滑多边形
#pragma once#include "opencv.hpp" #include "StdStrFile.h"void CurvePoly(const st ...
- Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数
开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...
- Python绘制三次贝塞尔曲线
对于贝塞尔曲线而言,其特点在于第一个控制点恰好是曲线的起点,最后一个控制点是曲线的终点,其他控制点并不在曲线上,而是起到控制曲线形状的作用.另外,曲线的起点处与前两个控制点构成的线段相切,而曲线的终点 ...
- Python+OpenGL绘制任意形状的三次贝塞尔曲线
推荐阅读: 开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 推荐教材: <Python程序设计基础与应用(第2版) ...
- Python+Matplotlib绘制三次贝塞尔曲线
开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...
- 【HTML 中的二次贝塞尔曲线 和三次贝塞尔曲线】(使用说明详解)
二次 贝塞尔曲线 和三次 贝塞尔曲线 使用说明 1. 二次 贝塞尔曲线 和三次 贝塞尔曲线 1.1 贝塞尔曲线的 基本知识 1.2 贝塞尔曲线 生成动图 1.3 HTML 中 画贝塞尔曲线的 2 种方 ...
- 自定义view走势图(三、贝塞尔曲线)
在开发中,对于走势图和统计图,会有用平滑的曲线来进行展示的需求,我首先想到的就是贝塞尔曲线.那么贝塞尔曲线是啥呢,贴上两张图多看一会就明白了 图一 图二 上面图一是二阶贝塞尔曲线,图二是三阶贝 ...
- 求二次、三次贝塞尔曲线的某个时间的位置及切线方向
Public Module BezierHelper ''' <summary> ''' 获得二次贝塞尔曲线在某个时刻的位置 ''' B(t) = PA(1-t)^ ...
- OpenGL Cubic Bezier三次贝塞尔曲线修补实例
OpenGL Cubic Bezier三次贝塞尔曲线修补 先上图,再解答. 正常显示 按下C键 按下W键 按下X键 完整主要的源代码 源代码剖析 先上图,再解答. 正常显示 按下C键 按下W键
- canvas笔记-二次贝塞尔曲线与三次贝塞尔曲线的用法
此博文不研究其算法,只记录下其用法. 首先是二次贝塞尔曲线! 函数是这样的 quadraticCurveTo(cpx, cpy, x, y); 其中cpx为贝塞尔控制点x: 其中cpy为贝塞尔控制点y ...
最新文章
- linux删除指定创建时间文件(文件夹)脚本
- 安装HikVision(海康威视)网络摄像头
- beyond compare如何添加新文件并重新比较?
- 地图按照自己规定路线进行移动
- java java 大端_Java 大小端转换
- C/C++命令行参数那点事
- 如何在不跳转的情况下实现用户登录
- 2020年什么编程语言最受欢迎,待遇最高?
- python redis事务_python实现redis三种cas事务操作
- Sharepoint 2010 根据用户权限隐藏Ribbon菜单
- django-后台管理-表显示相关
- java 监听事件和处理事件_Java基础教程之事件和监听器
- 总结一下CSS中的定位 Position 属性
- python趣味编程100例-Python趣味编程100题
- php中include包含文件路径查找过程
- 热释电传感器三个引脚_热释电传感器电路图大全(六款热释电传感器电路设计原理图详解)...
- IQC来料检验平台开发部署(集成金蝶K3待检数据生成功能)
- win10企业版如何改为专业版?
- 枚举身份证后四位java代码
- 服务器安装版u盘如何制作,U盘怎么安装原版Windows server 2016?