分享

用VC的PolyBezier()函数绘制曲线中反算控制点

 imelee 2016-08-27
 CDC类中的BOOL PolyBezier(const POINT *lpPoints,int nCount)可以用来绘制Bezier曲线,参数lpPoints指向存储绘制曲线的控制点数组,nCount是绘制曲线所用的点数目(一般满足3n+1的条件)。
  由图形学知识知道一段Bezier曲线由4个控制点p0,p1,p2,p3决定,该曲线经过p0和p3点,即该曲线起于p0点,终于p3点。一条经过鼠标点击点的曲线就可以由多段的Bezier曲线连续而成。
  
用VC的PolyBezier()函数绘制曲线中反算控制点
        图1

     以绘制图1中曲线为例,该曲线由两段构成,p0~p3段和p4~p7段,不难看出

p3=p4,即前段曲线的终点是后段曲线的起点。

   lpPoints结构中会顺序存储p0,p1,p2,p3(p4),p5,p6,p7七个点。

其中p0,p3(p4),p7是已知的,也就是在鼠标绘图过程中p0,p3(p4),p7都是鼠标经过点,已知需要根据这3点反求控制点p1,p2,p5,p6.

   这里可用两端Bezier曲线连续的条件(具体内容可参考计算机图形学,因为公室在这里不好录入),总的来说,就是p1p0连线即为曲线在p0处切线,p2p3连线为p3处切线,p4p5为p4处切线,p6p7为p7处切线,两段曲线连续(这里用的是一阶连续条件)必然要求p2p3与p4p5在一条线上。端点处可令其倒数为0,即可算得控制点。

根据条件可算得

     p1.x=p0.x;

     p1.y=p0.y;

     p2.x=(p0.x+4*p3.x-p7.x)/4;

     p2.y=(p0.y+4*p3.y-p7.y)/4;

     p5.x=(4*p3.x+p7.x-p0.x)/4;

     p5.y=(4*p3.y+p7.y-p0.y)/4;

     p6.x=p7.x;

     p6.y=p7.y;//一阶倒在端点处为0

把这些点存到lpPoints结构中对应位置即可,每增加一个端点,都要计算更新数据。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多