您的位置:首页 > Web前端

Ferguson曲线原理及绘制程序

2014-06-05 20:01 375 查看
给定两点P0 P1和两点处的切线P0t P1t,可以确定两点间的三次曲线。曲线的参数方程为:
P(u) = a * u^3 + b* u^2 + c * u + d
导数 P(u)t = 3*a*u^2 + 2*b*u + c

带入可得
d = P0
a + b + c +d = P1
c = P0t
3a + 2b + c = P1t

-->
a = 2 * P0 - 2 * P1 + P0t + P1t
b = -3 * P0 + 3 * P1 - 2 * P0t - P1t
c = P0t
d = P0

--->
2 -2 1 1 P0
P(u) = [u^3 u^2 u 1][ -3 3 -2 -1 ] [ P1 ]
0 0 1 0 P0t
1 0 0 0 P1t

当给定多个点时保证连接点的切线大小方向相同,曲线连续。

下图中蓝色点为型值点(P0, P1, ...),红色点是为了绘制曲线生成的插值点,绿色为型值点处切线矢量。
此图中Pn点处的切失为(Pn+1 - Pn-1)/2



SplineDrawer_Ferguson说明:
Vec2.h Vec2.cpp定义了一个简单的二维矢量类
SDSpline.h SDSpline.cpp实现了Ferguson曲线型值点管理,曲线插值计算功能。
ChildView显示曲线并提供菜单响应

操作:
菜单 -- DrawSpline -- Begin: 清空当前绘制,并开始新绘制
菜单 -- DrawSpline -- End: 结束绘制,完成曲线

补充:
SDSpline每插入一个型值点Pn会先计算前一个点Pn-1的切失,然后生成Pn-2到Pn-1之间的曲线,曲线内部插值采用均匀插值固定点数的方式生成插值点,点击End菜单时将使最后一个点的切失为0,0,完成曲线绘制

程序下载地址:
http://download.csdn.net/detail/piaobotudou/7453109
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: