样条之贝塞尔(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. ...
随机推荐
- csdn 音乐 怎么拦截 提交后的程序 csdn 栏目 音乐 csdn 添加 音乐
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha csdn 栏目 音乐 csdn 添加 音乐 ======= <embed src= ...
- 笔记本光驱位置装SSD固态硬盘(亲自试验)
我的笔记本买的早了,2010年的联想Z460,速度有点慢,本来想换台电脑,想想还是算了,没有太大必要.固态硬盘便宜了,于是在原来的光驱位置装了一个256G的SSD固态硬盘,现在的性能能达到刚买来时的1 ...
- 自动添加 Qt 开发生成的 exe 所需的依赖环境
双击获取 exe 文件路径 cd 进入文件目录的命令 调用 Qt 自带的软件进行环境配置,命令如下 windeployqt ***.exe 自动配置了依赖环境
- An Isolated DAC Using PWM Output
An Isolated DAC Using PWM Output Arduino‘s (ATmega328P) PWM outputs via analogWrite can be convenien ...
- 【Go命令教程】2. go build
go build 命令用于编译我们 指定的 源码文件 或 代码包 以及它们的依赖包. 例如,如果我们在执行 go build 命令时不后跟任何代码包,那么命令将试图编译当前目录所对应的代码包.例如, ...
- 酷播迷你flv,mp4网页视频播放器(CuPlayerMini)V2.2版[经典黑]演示实例
酷播迷你flv,mp4网页视频播放器(CuPlayerMini)V2.2版[经典黑]演示实例 http://www.cuplayer.com/cu/FreeDown/
- android开发之GestureDetector手势识别(调节音量、亮度、快进和后退)
写UI布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro ...
- C#写的COM组件注册问题兼论微软Regasm注册的BUG
工作中自己用C#写了专门读写EXCEL(不需要OFFICE环境,直接读原始文件,速度快)的COM组件,在使用过程中,发现原先的注册程序是有问题的.网上也有同样的网友碰到这个问题,但都没找到合适的解决办 ...
- ASP.NET MVC异步验证是如何工作的02,异步验证表单元素的创建
在上一篇"ASP.NET MVC异步验证是如何工作的01,jQuery的验证方式.错误信息提示.validate方法的背后"中,了解了jQuery如何验证,如何显示错误信息,本篇要 ...
- 在ASP.NET MVC中使用Knockout实践05,基本验证
本篇体验View Model验证.Knockout的subscribe方法能为View Model成员注册验证规则. @{ ViewBag.Title = "Index"; Lay ...