• 大小: 630KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-06-03
  • 语言: 其他
  • 标签: B样条  

资源简介

该文档中包含了二次、三次B样条曲线的实现方法,可以进行整合调用

资源截图

代码片段和文件信息

//****************************     BSpline.cpp     *********************************** 
// 包含功能:二次B样条平滑,三次B样条平滑;二次B样条平滑后节点插值
//
// 作者:    蒋锦朋   1034378054@qq.com
// 单位:    中国地质大学(武汉) 地球物理与空间信息学院
// 日期:    2014/12/03
//*************************************************************************************
#include “StdAfx.h“
#include “BSpline.h“


CBSpline::CBSpline(void)
{
}


CBSpline::~CBSpline(void)
{
}
//================================================================
// 函数功能: 二次B样条平滑
// 输入参数: *pt :给定点序列
//            Num:点个数
// 返回值:   无返回值

// 编辑日期:    2014/12/03
//================================================================
void CBSpline::TwoOrderBSpline(CPosition *ptint Num)
{
CPosition *temp=new CPosition[Num];
for(int i=0;i temp[i]=pt[i];

temp[0].x=2*temp[0].x-temp[1].x;                  //  将折线两端点换成延长线上两点
temp[0].y=2*temp[0].y-temp[1].y;

temp[Num-1].x=2*temp[Num-1].x-temp[Num-2].x;
temp[Num-1].y=2*temp[Num-1].y-temp[Num-2].y;

CPosition NodePt1NodePt2NodePt3;
double t;
    for(int i=0;i {
NodePt1=temp[i]; NodePt2=temp[i+1]; NodePt3=temp[i+2];
if(i==0)                                     //  第一段取t=0和t=0.5点
{   
t=0;
pt[i].x=F02(t)*NodePt1.x+F12(t)*NodePt2.x+F22(t)*NodePt3.x;
pt[i].y=F02(t)*NodePt1.y+F12(t)*NodePt2.y+F22(t)*NodePt3.y;
t=0.5;
pt[i+1].x=F02(t)*NodePt1.x+F12(t)*NodePt2.x+F22(t)*NodePt3.x;
pt[i+1].y=F02(t)*NodePt1.y+F12(t)*NodePt2.y+F22(t)*NodePt3.y;
}else if(i==Num-3)                          //  最后一段取t=0.5和t=1点
{
t=0.5;
pt[i+1].x=F02(t)*NodePt1.x+F12(t)*NodePt2.x+F22(t)*NodePt3.x;
pt[i+1].y=F02(t)*NodePt1.y+F12(t)*NodePt2.y+F22(t)*NodePt3.y;
t=1;
pt[i+2].x=F02(t)*NodePt1.x+F12(t)*NodePt2.x+F22(t)*NodePt3.x;
pt[i+2].y=F02(t)*NodePt1.y+F12(t)*NodePt2.y+F22(t)*NodePt3.y;
}else                                      //  中间段取t=0.5点
{
t=0.5;
pt[i+1].x=F02(t)*NodePt1.x+F12(t)*NodePt2.x+F22(t)*NodePt3.x;
pt[i+1].y=F02(t)*NodePt1.y+F12(t)*NodePt2.y+F22(t)*NodePt3.y;
}
}
delete []temp;
}

//================================================================
// 函数功能: 二次B样条平滑在节点之间均匀插入指定个数点
// 输入参数: *pt :给定点序列
//            Num:节点点个数
//            *InsertNum: 节点之间需要插入的点个数指针 
// 返回值:   无返回值
//
// 编辑日期:   2014/12/07
//=================================================================
void CBSpline::TwoOrderBSplineInterpolatePt(CPosition *&ptint &Numint *InsertNum)
{
if(pt==NULL || InsertNum==NULL) return;

int InsertNumSum=0;                               //  计算需要插入的点总数
for(int i=0;i
CPosition *temp=new CPosition[Num];               //  二次B样条不需要增加点数,需要将首尾点替换掉
for(int i=0;i temp[i]=pt[i];

temp[0].x=2*temp[0].x-temp[1].x;                  //  将折线两端点换成延长线上两点
temp[0].y=2*temp[0].y-temp[1].y;

temp[Num-1].x=2*temp[Num-1].x-temp[Num-2].x;
temp[Num-1].y=2*temp[Num-1].y-temp[Num-2].y;

delete [

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        8506  2014-12-07 21:39  B样条曲线\BSpline.cpp
     文件         453  2014-12-07 21:40  B样条曲线\BSpline.h
     文件      178176  2014-12-02 15:51  B样条曲线\b样条曲线.ppt
     文件         931  2014-09-27 08:28  B样条曲线\position.h
     文件         162  2016-09-20 15:56  B样条曲线\~$调用.docx
     文件     1473536  2014-12-04 16:39  B样条曲线\离散点拟合曲线_Bezier_B样条.ppt
     文件       19788  2014-12-07 21:49  B样条曲线\调用.docx
     目录           0  2016-11-15 18:44  B样条曲线\

评论

共有 条评论