平滑曲线生成:贝塞尔曲线拟合 您所在的位置:网站首页 平滑曲线拟合解读 平滑曲线生成:贝塞尔曲线拟合

平滑曲线生成:贝塞尔曲线拟合

2023-08-07 02:43| 来源: 网络整理| 查看: 265

平滑曲线生成是一个很实用的技术

很多时候,我们都需要通过绘制一些折线,然后让计算机平滑的连接起来,或者是生成一些平滑的面

这里介绍利用一种贝塞尔曲线拟合的方法,先给出我们最终的效果

    

图1 、折线拟合                                                                      图2、多边形拟合(封闭的折线)

 

继续阅读本文之前,你需要先掌握贝塞尔曲线的基本知识,这个网上资料很多,这里直接给出源代码

//count为插入点数, outPoints为输出点集合,长度为count + 2(含首尾) void BezierHelper::parseBezier(const Ogre::Vector2& start, const Ogre::Vector2& end, const Ogre::Vector2& control1, const Ogre::Vector2& control2, int count, std::vector& outPoints) { if(count < 0) count = Bezier3DefaultPointNum; outPoints.push_back(start); for(int i = 1; i1) 12 { 13 delta = p1 - (pt + ( p2 - pt) / (v + 0.000001)); 14 } 15 else 16 { 17 delta = pt + (p1-pt) * v - p2 ; 18 } 19 20 delta *= ratio; 21 control1 = pt + delta; 22 control2 = pt - delta; 23 }

ratio参数为调整系数,因为相对与总长,一般取0.1-0.3之间

 

折线生成

同样方法可以计算p1,p2的前后控制点,这样通过p1和p1的后控制点、pt和c1可以绘制曲线p1~pt,依次类推....

对于首尾节点,可以简单的取其控制点为自身

实现:

void BezierHelper::parsePolyline(const std::vector& points, int count, std::vector& outPoints, double ratio) { std::vector::size_type pointsSize = points.size(); if(pointsSize < 3 )//插值至少需要三点 { for(int i = 0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有