Bezier曲线一、1.1程序的实现环境VS2010,基于MFC1.2硬件配置a.处理器型号及内存容量:P1及以上,内存大于32M;b.外存容量:10G;c.输入及输出设备的型号和数量,联机或脱机;联机脱机均可;d.功能键及其他专用硬件:快捷键。1.3操作系统WindowsXP及以上的Windows操作系统1.4编程语言C++二、算法思想2.1Bezier曲线的描述在空间给定n+1个点P0,P1,P2,…,Pn列参数曲线为n次的Bezier曲线。其中Ji,n(t)是Bernstein基函数,即一般称折P0,P1,P2,…,Pn为曲线P(t)的控制多边形;称点P0,P1,P2,…,Pn为P(t)的控制顶点。在空间曲线的情况下,曲线P(t)=(x(t),y(t),z(t))和控制顶点Pi=(Xi,Yi,Zi)的关系用分量写出即为:]1,0[)()(0,ttJPtPntniinitttiininttCtJininiinni,..,1,0]1,0[)1()!(!!)1()(,]1,0[)()(0,ttJXtXntnii]1,0[)()(0,ttJYtYntnii]1,0[)()(0,ttJZtZntnii当t在区间[0,1]上变动时,就产生了Bezier曲线。若只考虑x和y,就是平面上的Bezier曲线。2.2三次Bezier曲线P(t)=B0,3(t)P0+B1,3(t)P1+B2,3(t)P2﹢B3,3(t)P3B0,3(t)﹦(1-t)3B1,3(t)﹦3t(1-t)2B2,3(t)﹦3t2(1-t)B3,3(t)﹦t30≤t≤02.3Bezier曲线的连接由于Bezier曲线通过端点,比较容易获得0阶连续性,因此问题的关键在于如何保证连接处具有G1和G2连续性。假设有两段Bezier曲线P1(t)和P2(t),其控制多边形顶点分别为P0,P1,P2,P3,P4和Q0,Q1,和Q2,Q3,并且有P3=Q0。由公式可计算两段曲线在端点P3(Q0)处的一阶导数:为了实现G1连续,需要有即式中,为比例因子。由此可知,实现G1连续的条件是P2,P3(Q0)和Q1在同一条直线上,并且P2和Q1应该分布在P3(Q0)的两侧。三、怎样使用该软件画Bezier曲线时,在屏幕视图区随意按下鼠标左键,拖动,然后放开,即可形成直线,分别画两条直线,则可保存4个点,这4个点将作为控制点绘制Bezier曲线,可用鼠标多次绘制Bezier曲线,但每次都会刷新,只显示最新的32102300010033036313311ttPPPPttP01'223'1_3031QQPPPP01'2'1PP0123QQPP一条Bezier曲线如上图所示,鼠标轨迹如两条红线,则最后输出的控制线即为加上黑色线后的上图对于Bezier曲线的连接,因为要求连接处三个点在同一直线上,所以在程序中已经确定了两条Bezier曲线,已经连接好四、图示实验结果Bezier曲线的绘制Bezier曲线的连接五、程序适用范围可随意在视图区画Bezier曲线,只支持拿鼠标画,虽然可以多次画Bezier曲线,但每次都只显示一条六、测试结果只能在视图区画,一旦鼠标超出这个范围,Bezier曲线就画不出来了测试用例合法当鼠标轨迹如图所示时将无法成功捕获四个点,所以无法绘制Bezier曲线非法,实际屏幕上什么都不显示