#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 等值面多边形平滑_三次贝塞尔曲线平滑多边形相关推荐

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

    #pragma once#include "opencv.hpp" #include "StdStrFile.h"void CurvePoly(const st ...

  2. Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数

    开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...

  3. Python绘制三次贝塞尔曲线

    对于贝塞尔曲线而言,其特点在于第一个控制点恰好是曲线的起点,最后一个控制点是曲线的终点,其他控制点并不在曲线上,而是起到控制曲线形状的作用.另外,曲线的起点处与前两个控制点构成的线段相切,而曲线的终点 ...

  4. Python+OpenGL绘制任意形状的三次贝塞尔曲线

    推荐阅读: 开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 推荐教材: <Python程序设计基础与应用(第2版) ...

  5. Python+Matplotlib绘制三次贝塞尔曲线

    开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...

  6. 【HTML 中的二次贝塞尔曲线 和三次贝塞尔曲线】(使用说明详解)

    二次 贝塞尔曲线 和三次 贝塞尔曲线 使用说明 1. 二次 贝塞尔曲线 和三次 贝塞尔曲线 1.1 贝塞尔曲线的 基本知识 1.2 贝塞尔曲线 生成动图 1.3 HTML 中 画贝塞尔曲线的 2 种方 ...

  7. 自定义view走势图(三、贝塞尔曲线)

    在开发中,对于走势图和统计图,会有用平滑的曲线来进行展示的需求,我首先想到的就是贝塞尔曲线.那么贝塞尔曲线是啥呢,贴上两张图多看一会就明白了 图一     图二 上面图一是二阶贝塞尔曲线,图二是三阶贝 ...

  8. 求二次、三次贝塞尔曲线的某个时间的位置及切线方向

    Public Module BezierHelper     ''' <summary>     ''' 获得二次贝塞尔曲线在某个时刻的位置     ''' B(t) = PA(1-t)^ ...

  9. OpenGL Cubic Bezier三次贝塞尔曲线修补实例

    OpenGL Cubic Bezier三次贝塞尔曲线修补 先上图,再解答. 正常显示 按下C键 按下W键 按下X键 完整主要的源代码 源代码剖析 先上图,再解答. 正常显示 按下C键 按下W键

  10. canvas笔记-二次贝塞尔曲线与三次贝塞尔曲线的用法

    此博文不研究其算法,只记录下其用法. 首先是二次贝塞尔曲线! 函数是这样的 quadraticCurveTo(cpx, cpy, x, y); 其中cpx为贝塞尔控制点x: 其中cpy为贝塞尔控制点y ...

最新文章

  1. linux删除指定创建时间文件(文件夹)脚本
  2. 安装HikVision(海康威视)网络摄像头
  3. beyond compare如何添加新文件并重新比较?
  4. 地图按照自己规定路线进行移动
  5. java java 大端_Java 大小端转换
  6. C/C++命令行参数那点事
  7. 如何在不跳转的情况下实现用户登录
  8. 2020年什么编程语言最受欢迎,待遇最高?
  9. python redis事务_python实现redis三种cas事务操作
  10. Sharepoint 2010 根据用户权限隐藏Ribbon菜单
  11. django-后台管理-表显示相关
  12. java 监听事件和处理事件_Java基础教程之事件和监听器
  13. 总结一下CSS中的定位 Position 属性
  14. python趣味编程100例-Python趣味编程100题
  15. php中include包含文件路径查找过程
  16. 热释电传感器三个引脚_热释电传感器电路图大全(六款热释电传感器电路设计原理图详解)...
  17. IQC来料检验平台开发部署(集成金蝶K3待检数据生成功能)
  18. win10企业版如何改为专业版?
  19. 枚举身份证后四位java代码
  20. 服务器安装版u盘如何制作,U盘怎么安装原版Windows server 2016?

热门文章

  1. Unity Shader 详细自学(一)
  2. Elasticsearch 实战(四、分词与IK分词器)
  3. 5款瞬间复活Win7/8/10工具
  4. android 动态壁纸 时钟,Android动态时钟壁纸开发
  5. Excel小技巧,隔行变色,多行变色
  6. Unity Shader 假光源效果
  7. 阿里视觉AI训练营-day05-创意日-你的图像识别项目
  8. 毕业论文/分页符/段前2行没用
  9. java 批量修改图片名称_java 批量修改文件名称
  10. JQuery的选择器对控件ID含有特殊字符的解决方法