样条之贝塞尔(Bezier)
我曾经发过两篇关于贝塞尔的文章:数学图形(1.47)贝塞尔(Bézier)曲线,数学图形之贝塞尔(Bézier)曲面。那是使用我自己定义的脚本语言生成贝塞尔图形。由于我自己定义的脚本语法功能有限,所以最多只能支持5次贝塞尔函数,而这里将实现N次。
N阶贝塞尔曲线可如下推断:
给定点P0、P1、…、Pn,其贝塞尔曲线即

看其公式需要先为之生成一套杨辉三角形数组。
关于插值与样条的介绍请看:http://www.cnblogs.com/WhyEngine/p/4020294.html
.h文件
/**************************************************************** File name : YcBezierSpline.h
Author : 叶峰
Version : 2.0
Create Date : 2014/08/18
Description : Bezier样条 *****************************************************************/ #ifndef __YcBezierSpline_H__
#define __YcBezierSpline_H__ // INCLUDES ----------------------------------------------------------------------------- #include "YicSpline.h" // -------------------------------------------------------------------------------------- #define YD_MAX_BEZIER_CONTROL_VALUE 33 // -------------------------------------------------------------------------------------- class YcBezierSpline : public YicSpline
{
public:
YcBezierSpline(); ~YcBezierSpline(); // 设置输出样条值的数目
void SetSplineValuesCount(Yuint count); // 获得输出样条值的数目
Yuint GetSplineValuesCount() const; // 计算样条数值
bool BuildSpline(const void* ctrlValuesPtr, Yuint ctrlStride, Yuint ctrlCount,
void* splineValuesPtr, Yuint splineStride) const; protected:
void ClearPowT(); void BuildPowT(); Yreal GetValueT(Yint t, Yint p) const
{
return m_pow_t[YD_MAX_BEZIER_CONTROL_VALUE*t + p];
} protected:
Yuint m_valuesCount;
Yreal* m_pow_t; protected:
static void BuildYanghuiTriangle();
static Yint m_yanghuiRowIndex[YD_MAX_BEZIER_CONTROL_VALUE];
static Yint m_yanghuiTriangle[(YD_MAX_BEZIER_CONTROL_VALUE+)*YD_MAX_BEZIER_CONTROL_VALUE/];
}; // -------------------------------------------------------------------------------------- #endif
CPP文件
/**************************************************************** File name : YcBezierSpline.cpp
Author : 叶峰
Version : 2.0
Create Date : 2014/08/18
Description : *****************************************************************/ // INCLUDES ----------------------------------------------------------------------------- #include "..\..\YCommon_h\YSpline\YcBezierSpline.h"
#include <assert.h> // -------------------------------------------------------------------------------------- Yint YcBezierSpline::m_yanghuiRowIndex[YD_MAX_BEZIER_CONTROL_VALUE] = {};
Yint YcBezierSpline::m_yanghuiTriangle[(YD_MAX_BEZIER_CONTROL_VALUE+)*YD_MAX_BEZIER_CONTROL_VALUE/] = {}; void YcBezierSpline::BuildYanghuiTriangle()
{
// 第0行
m_yanghuiRowIndex[] = ;
m_yanghuiTriangle[] = ; Yint index = ;
Yint t0,t1;
Yint* lastRow;
for (Yint i = ; i < YD_MAX_BEZIER_CONTROL_VALUE; i++)
{
m_yanghuiRowIndex[i] = index;
m_yanghuiTriangle[index] = ;
index++; for (Yint j = ; j <= i; j++)
{
lastRow = m_yanghuiTriangle + m_yanghuiRowIndex[i-];
t0 = lastRow[j - ];
t1 = (j < i) ? lastRow[j] : ; m_yanghuiTriangle[index] = t0 + t1;
index++;
}
} assert(index == (YD_MAX_BEZIER_CONTROL_VALUE+)*YD_MAX_BEZIER_CONTROL_VALUE/);
} // -------------------------------------------------------------------------------------- YcBezierSpline::YcBezierSpline()
{
if (m_yanghuiTriangle[] == )
{
BuildYanghuiTriangle();
} m_valuesCount = ;
m_pow_t = NULL; SetSplineValuesCount();
} YcBezierSpline::~YcBezierSpline()
{
ClearPowT();
} // 设置输出样条值的数目
void YcBezierSpline::SetSplineValuesCount(Yuint count)
{
if (count < )
{
count = ;
} if (count == m_valuesCount)
{
return;
}
m_valuesCount = count;
BuildPowT();
} // 获得输出样条值的数目
Yuint YcBezierSpline::GetSplineValuesCount() const
{
return m_valuesCount;
} void YcBezierSpline::ClearPowT()
{
if (m_pow_t)
{
free(m_pow_t);
m_pow_t = NULL;
}
} void YcBezierSpline::BuildPowT()
{
ClearPowT(); m_pow_t = (Yreal*)malloc(m_valuesCount*YD_MAX_BEZIER_CONTROL_VALUE*sizeof(Yreal));
Yreal t;
for (Yuint i = ; i < m_valuesCount; i++)
{
t = i/(m_valuesCount - 1.0f); m_pow_t[i*YD_MAX_BEZIER_CONTROL_VALUE] = 1.0f;
for (Yint j = ; j < YD_MAX_BEZIER_CONTROL_VALUE; j++)
{
m_pow_t[i*YD_MAX_BEZIER_CONTROL_VALUE + j] = m_pow_t[i*YD_MAX_BEZIER_CONTROL_VALUE + j - ]*t;
}
}
} // 计算样条数值
bool YcBezierSpline::BuildSpline(const void* ctrlValuesPtr, Yuint ctrlStride, Yuint ctrlCount,
void* splineValuesPtr, Yuint splineStride) const
{
if (ctrlCount < || ctrlCount > YD_MAX_BEZIER_CONTROL_VALUE)
{
return false;
} Yreal* destValue;
Yreal* srcValue;
Yreal v;
const Yint* yanghuiRow = m_yanghuiTriangle + m_yanghuiRowIndex[ctrlCount - ]; for (Yuint i = ; i < m_valuesCount; i++)
{
v = 0.0f;
for (Yuint j = ; j < ctrlCount; j++)
{
srcValue = (Yreal*)((char*)ctrlValuesPtr + ctrlStride*j);
v += yanghuiRow[j] * (*srcValue) * GetValueT(i, j) * GetValueT(m_valuesCount - - i, ctrlCount - - j);
} destValue = (Yreal*)((char*)splineValuesPtr + splineStride*i);
*destValue = v;
} return true;
} // --------------------------------------------------------------------------------------
图像:


相关软件的下载地址为:http://files.cnblogs.com/WhyEngine/TestSpline.zip
样条之贝塞尔(Bezier)的更多相关文章
- [摘抄] Bezier曲线、B样条和NURBS
Bezier曲线.B样条和NURBS,NURBS是Non-Uniform Rational B-Splines的缩写,都是根据控制点来生成曲线的,那么他们有什么区别了?简单来说,就是: Bezier曲 ...
- 3D中的OBJ文件格式详解
常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序:第二种是Alias|Wavefron ...
- SAP C/4HANA与人工智能和增强现实(AR)技术结合的又一个创新案例
今天这篇迟到的文章,来自我的同事Aviva. 去年SAP C/4HANA发布之后,SAP的从业者们可能或多或少都读过一些来自SAP官方渠道,比如微信公众号"SAP天天事"发布的一些 ...
- 3D中OBJ文件格式详解
常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序:第二种是Alias|Wavefron ...
- OpenCASCADE Conic to BSpline Curves-Circle
OpenCASCADE Conic to BSpline Curves-Circle eryar@163.com Abstract. The conic sections and circles pl ...
- OpenCascade B-Spline Basis Function
OpenCascade B-Spline Basis Function eryar@163.com Abstract. B-splines are quite a bit more flexible ...
- B样条曲线曲面(附代码)
1 B样条曲线 1.1 B样条曲线方程 B样条方法具有表示与设计自由型曲线曲面的强大功能,是形状数学描述的主流方法之一,另外B样条方法是目前工业产品几何定义国际标准——有理B样条方法 (NURBS)的 ...
- C#----Graphics中部分方法的使用和理解
1.DrawArc(Pen, Rectangle, Single, Single) 说明:绘制一段弧线,弧线是椭圆的一部分,椭圆是矩形Rectangle的内切椭圆. 参数:Pen是画弧线使用的画笔:R ...
- 【GDI+编程】--从三问开始
一. GDI+三问 1.1 GDI+是什么? GDI+是GDI(Graphics Device Interface)的后继者,是一种图形设备的接口,它构成了Win XP操作系统的子系统的API. 1. ...
随机推荐
- RabbitMQ for windows
一.搭建环境 Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装RabbitMQ之前要先安装Erlang. erlang:http://www.erlang.org/downloa ...
- HDU 4757 Tree 可持久化字典树 trie
http://acm.hdu.edu.cn/showproblem.php?pid=4757 给出一棵树,每个节点有权值,每次查询节点 (u,v) 以及 val,问 u 到 v 路径上的某个节点与 v ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A. Broken Clock 水题
A. Broken Clock 题目连接: http://codeforces.com/contest/722/problem/A Description You are given a broken ...
- iOS 七牛多张图片上传
-(void)uploadImages:(NSArray *)images atIndex:(NSInteger)index token:(NSString *)token uploadManager ...
- Tesseract ocr 3.02学习记录一
光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程.OCR技术非常专业,一般多是印刷.打印行 ...
- Java中使用多线程、curl及代理IP模拟post提交和get访问
Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...
- delphi下实现ribbon界面的方法(一)
http://www.cnblogs.com/shanmx/archive/2011/12/04/2275213.html
- 自定义一个可以被序列化的泛型Dictionary<TKey,TValue>集合
Dictionary是一个键值类型的集合.它有点像数组,但Dictionary的键可以是任何类型,内部使用Hash Table存储键和值.本篇自定义一个类型安全的泛型Dictionary<TKe ...
- eclipse中设置自定义文档签名(工具)
今天第一次认真学习eclipse的使用,看到自定义文档签名,步骤如下: 1.点击window->preferences->java->Code Style->Code Tem ...
- C#编程(七十四)----------释放非托管资源
释放非托管资源 在介绍释放非托管资源的时候,我觉得有必要先来认识一下啥叫非托管资源,既然有非托管资源,肯定有托管资源. 托管资源指的是.net可以自棕进行回收的资源,主要是指托管堆上分配的内存资源.托 ...