贝塞尔曲线德卡斯特里奥(de Casteljau)算法及程序
设P0、P02、P2是一条抛物线上顺序三个不同的点。过P0和P2点的两切线交于P1点,在P02点的切线交P0P1和P2P1于P01和P11,则如下比例成立:
这是所谓抛物线的三切线定理。
当P0,P2固定,引入参数t,令上述比值为t:(1-t),即有:
t从0变到1,第一、二式就分别表示控制二边形的第一、二条边,它们是两条一次Bezier曲线。将一、二式代入第三式得:
当t从0变到1时,它表示了由三顶点P0、P1、P2三点定义的一条二次Bezier曲线。并且表明:这二次Bezier曲线P02可以定义为分别由前两个顶点(P0,P1)和后两个顶点(P1,P2)决定的一次Bezier曲线的线性组合。依次类推,由四个控制点定义的三次Bezier曲线P03可被定义为分别由(P0,P1,P2)和(P1,P2,P3)确定的二条二次Bezier曲线的线性组合,由(n+1)个控制点Pi(i=0,1,...,n)定义的n次Bezier曲线P0n可被定义为分别由前、后n个控制点定义的两条(n-1)次Bezier曲线P0n-1与P1n-1的线性组合:
这就是de Casteljau算法;
代码如下:
/*************
* pDC 设备
* flArrayx 组成点x坐标序列
* flArrayy 组成点y坐标序列
**************/
int deCasteljau(CDC *pDC,CArray<float,float>& flArrayx,CArray<float,float>& flArrayy)
{
if(flArrayx.GetSize()!=flArrayy.GetSize())
return 0;
float *pflX,*pflY;
float flTempx,flTempy,flU;//flu-------u参数(和上面t表示意思相同)
int i,n,j;
n=flArrayx.GetSize();
if(n<2) return 0;
pflX=new float[n];
pflY=new float[n];
flTempx=flArrayx.GetAt(0);
flTempy=flArrayy.GetAt(0);
for(i=0;i<n;i++){
pflX[i]=flArrayx.GetAt(i);
pflY[i]=flArrayy.GetAt(i);
}
for(flU=0;flU<=1;flU+=0.05/n){
for(i=1;i<n;i++){
for(j=0;j<n-i;j++){
pflX[j]=(1-flU)*pflX[j]+flU*pflX[j+1];
pflY[j]=(1-flU)*pflY[j]+flU*pflY[j+1];
}
}
pDC->MoveTo(flTempx,flTempy);
pDC->LineTo(pflX[0],pflY[0]);
flTempx=pflX[0];
flTempy=pflY[0];
}
delete[] pflX;
delete[] pflY;
return 1;
}
- 大小: 5.7 KB
- 大小: 6.8 KB
- 大小: 6 KB
分享到:
相关推荐
通过de Casteljau算法放置贝塞尔曲线,并计算它的切线,实现1-7阶贝塞尔曲线的形成动画。想深入了解德卡斯特里奥算法的同学可以参考我的翻译文章 。 产品特点 支持增加和删除控制点 支持1阶到7阶贝塞尔曲线,范围...
在屏幕上使用鼠标绘制任意控制点的控制多边形,基于de casteljau算法绘制所示的BEZIER曲线
通过de Casteljau算法绘制贝塞尔曲线,并计算它的切线,实现1-7阶贝塞尔曲线的形成动画。 德卡斯特里奥算法可以计算出Bezier曲线上的一个点,进而绘制出Bezier曲线。想深入了解德卡斯特里奥算法的同学可以参考我翻译...
这是一个Bezier曲线反算控制点(德卡里特斯奥算法)使用CArray类作参数传递,能够很容易的使用于自己的源码中;C++类
最初由保罗·德卡斯特里奥(Paul de Casteljau)于1959年运用德卡斯特里奥演算法开发(de Casteljau Algorithm),在1962,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表。目前广泛应用于图形绘制领域来...
德卡社保卡T6及P3测试程序 +开发包+T6单机测试程序+说明文档
德卡T10读卡器测试程序
(2)掌握德卡斯特里奥算法的几何意义 (3)掌握绘制二维Bezier曲线的方法 二、实验步骤 (1)定义deCasteljau(double t,long *p)函数 ①根据控制多边形的点数CtrlPointNum,构造n(CtrlPointNum - 1)个二维函数P[M...
德卡D3读IC卡WEB测试程序,这个是WEB版本的测试程序。方便WEB下开发使用的。
德卡t10读卡接口,包好动态库和demo测试环境
德卡D6读写器开发包及演示程序!各种语言的示例程序!
德卡 D3 读卡器实现读取卡号的基本功能。
德卡这个机器存在很多版本,我开发的这台C#Demo程序,使用的库是DC_Reader.dll这个,由于山东电子健康卡的需要,开发内容中只针对以下卡类型。读卡类型,接触式的诊疗卡,社保卡,身份证,电子健康卡(二维码),...
D3读卡器驱动,读写M1卡测试的小程序,这个小程序可以帮助你在D3读写卡上读写M1卡的各种操作
德卡T10的sdk开发包,包含demo,涉及语言C#,JAVA,ocx,Python,qt,VS
德卡D3读取IC卡程序,这里只做了读取IC卡的序列号。而后用序列号与人员编号对应。就可以获得相关人员的信息。
根据德卡的SDK自己写的德卡T10读卡器读取身份证与M1卡序列号程序,比那些无良的没什么用的付费资源肯定是有用些的。需要的拿去吧。
该开发包包含德卡T10读卡器C#,java,ocx,python,qt,vs的读卡sdk,通过修改德卡自带的ocx demo已经写好了IE浏览器 火狐浏览器读取身份证信息的html,IE8 火狐47测试有效,火狐52开始已经停止对npapi的支持了。...
德卡读卡器T10_SDK动态库10.1包括C# JAVA PYTHON QT VS例子程序
德卡Z90读卡器的c#端代码例子,如果有该设备可以参考当前代码进行二次开发。 由于当前读卡器的功能较为简单,所以例子也不复杂,代码简单易懂,连上设备后双击运行即可查看到效果。