计算机与数学 —— 使用高斯勒让得求积来获得样条的长度
来源:互联网 发布:模拟定位器软件下载 编辑:程序博客网 时间:2024/05/18 03:14
这篇博客介绍了如何使用高斯勒让得求积(Legendre-Gauss quadrature)来获得样条函数的长度的方法。
背景
在我构建海飞丝插件(Hair Strand Plugin)时,由于每一根发束的构建都是使用了Hermit spline,在某些约束运算的时候需要获得样条的长度。因此查找了一些资料,最终发现在数值方法中,高斯勒让得求积的方法的表现比较好。
总体来讲,只需要5次采样就能够获得一个合理的结果。
高斯勒让得求积
当我们想要求解函数
于是乎,我们可以把函数
而针对于高斯勒让得求积来说,针对于权重函数
而
针对于五个采样点的计算,其
这些值可以提前计算出来,到时候直接使用:
struct FLegendreGaussCoefficient { float Abscissa; float Weight; }; static const FLegendreGaussCoefficient LegendreGaussCoefficients[] = { { 0.0f, 0.5688889f }, { -0.5384693f, 0.47862867f }, { 0.5384693f, 0.47862867f }, { -0.90617985f, 0.23692688f }, { 0.90617985f, 0.23692688f } };
代码实现
了解了算法之后其实代码实现就很简单了,输入四个向量
代码如下:
float LengthOfSegment(FVector P0, FVector P1, FVector T0, FVector T1){ FVector Coeff1 = ((P0 - P1) * 2.0f + T0 + T1) * 3.0f; FVector Coeff2 = (P1 - P0) * 6.0f - T0 * 4.0f - T1 * 2.0f; FVector Coeff3 = T0; float HalfParam = 0.5f; float Length = 0.0f; for (const auto& LegendreGaussCoefficient : LegendreGaussCoefficients) { // Calculate derivative at each Legendre-Gauss sample, and perform a weighted sum const float Alpha = HalfParam * (1.0f + LegendreGaussCoefficient.Abscissa); const FVector Derivative = ((Coeff1 * Alpha + Coeff2) * Alpha + Coeff3); Length += Derivative.Size() * LegendreGaussCoefficient.Weight; } Length *= HalfParam; return Length;}
<全文完>
0 0
- 计算机与数学 —— 使用高斯勒让得求积来获得样条的长度
- 计算机与数学 —— 四元数的应用与分析
- 计算机与数学的关系
- 计算机与数学的关系
- 计算机与数学的关系
- 计算机与数学的关系
- 计算机图形学使用的数学
- 计算机与数学 —— 检测圆与矩形相交的快速判定算法
- 计算机与数学 —— 圆与矩形相交判定算法的优化
- 计算机与数学 —— 三角形内生成均匀的随机点
- DNA计算机:数学与生命的交融
- 数学与计算机编程
- 计算机与数学
- 数学与计算机开篇
- 计算机与数学
- 数学归纳法的计算机实现——递归
- 数的长度 69 (数学+log的使用)
- 在texlive下使用CJK的3条小心得
- Mark!Android最佳的开源库集锦
- 3DTouch在Unity游戏开发中的一个坑
- ZBrush中的皮肤纹理该怎么添加
- spring 中怎么创建自定义标签来简化bean的配置?
- STL中map的成员函数insert的返回值
- 计算机与数学 —— 使用高斯勒让得求积来获得样条的长度
- Hadoop2.7.3 安装
- WebView的缓存处理(中)
- PC端与移动端浏览器内核
- mysql主从复制配置
- spmc编译
- SQLite数据库的添加(Create),查询(Retrieve),更新(Updata),删除(Delete)
- SuSE11之useradd命令不能创建主目录
- eclipse+Pydev,常见问题