您现在的位置:计算机技术学习网 > 技术中心 > 编程开发 > C >

贝赛尔曲线的拆分算法

来源:网络收集 责任编辑:栏目编辑 发表时间:2013-07-01 17:32 点击:
     贝赛尔曲线的拆分是指将贝赛尔曲线分解成逼近的多边形。可以用来判断贝赛尔曲线的选中,以及显示贝赛尔曲线的旋转效果等。 
  贝赛尔曲线简单介绍:
  贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度。所以本函数的顶点数组的记录方式是:控制点+顶点+控制点+控制点+顶点+控制点+……。所以两个顶点之间的曲线是由两个顶点以及两个顶点之间的控制点来决定的。
  ==主函数PolyBezierToPolys==
  【主要类型申明】
   typedef CArray<CPoint,CPoint> CPtArray;//点动态数组类型
  【参数说明】
       bezierPts[in]---贝赛尔曲线顶点和控制点数组
       bClose[in]------是否封闭的贝赛尔曲线
  polyPt[out]-----拆分后的多边形点数组
  precision[in]---拆分精度
  bool PolyBezierToPolys(CPtArray &bezierPts,
                     bool bClose,CPtArray &polyPt,int precision)
  {
       polyPt.RemoveAll();
       CPtArray apt;
       int i,count = bezierPts.GetSize();
  //从1开始,是因为第一个是控制点,如果曲线不封闭,那么第一个控制点是没有用的。
  //每一段贝赛尔曲线由相邻的两个顶点和之间的两个控制点决定,所以频率为3(后一个顶点在下一组中还要使用)
       for(i=1;i<count-2;i+=3){     
       BezierToPoly(&bezierPts[i],apt,precision); //拆分每一段
  polyPt.Append(apt);//拆分完成,加入数组
       }
       //如果是封闭曲线,那么需要将最后一个顶点和第一个顶点以及最后一个控制点以及第一个控制点组成一组进行拆分
       if(bClose){
              CPoint ptBuffer[4];
              ptBuffer[0] = bezierPts[count-2];
              ptBuffer[1] = bezierPts[count-1];
              ptBuffer[2] = bezierPts[0];
ptBuffer[3] = bezierPts[1]; 
              BezierToPoly(&ptBuffer[0], apt,precision);
              polyPt.Append(apt);
       }
       count = polyPt.GetSize();
       i=0;
    //过滤相邻的值相等的点(由于精度和误差,可能会有一些坐标值相同的相邻拆分点)
       while(i<count-1){
              if(polyPt[i] ==polyPt[i+1]){
                     polyPt.RemoveAt(i+1);
                     count--;
                     continue;
              }
              i++;
       }

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Glib实例学习(2)双链表
      • C程序员要学C++吗?
      • C++中实现Singleton的正确方法
      • 编程思维训练(一)
      • 【编程好习惯】引入中间变量使程序更易读
      • 在C++中通过模板规避潜在错误
      • 在C++中通过模板去除强制转换
      • 【编程好习惯】减少搜索头文件的目录数
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1