• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-14
  • 语言: 其他
  • 标签:

资源简介

2次贝塞尔曲线算法 用三次Bezier逼近圆弧:圆弧要等分成多少段 用三次Bezier逼近圆弧: 得到控制顶点数组 用三次Bezier逼近圆弧片段

资源截图

代码片段和文件信息

#include “stdafx.h“
#include “Arc2BezierAPI.h“

#include 

const float PI = 3.1415926f;
//static POINTF s_ptfCtrl[4];
////////////////////////////////////////////////////////////////////////// begin
// 用三次Bezier逼近圆弧时的分类
// 1,假设是完整圆,则先分成3份
// 2,否则,2.1 若大于240度,则划分为3份
//                      2.2  否则,若大于120度,则划分为2份
//                      2.3  否则,直接逼近
////////////////////////////////////////////////////////////////////////// end
// 用三次Bezier逼近圆弧:圆弧要等分成多少段
int Arc2Bezier_SplitNum(IN const POINTF ptfCenter // 圆心
IN const float fRadius // 半径
IN const BOOL bCircle // 是否整圆
IN const float fAngleStartIN // 起始角度 
IN const float fAngleEndIN // 终止角度 默认终止角度大于起始角度且都在0-2*PI之间
IN const float fThreshold // 误差阈值
IN OUT int & nArcs // 圆弧等分段数

{
//nArcs = 1;
float fStartAngle = fAngleStartIN;
float fEndAngle = fAngleEndIN;
// 完整圆
if (bCircle) 
{
nArcs = 3;
fStartAngle = 0.f;
fEndAngle = PI * 0.6666667f;
}
else
{
if (fAngleEndIN - fAngleStartIN > PI * 4 / 3)  // 大于240度
{
nArcs = 3;
fEndAngle = fStartAngle + (fEndAngle - fStartAngle) /3;
}
else if (fAngleEndIN - fAngleStartIN > PI * 2 / 3) // 大于120度
{
nArcs = 2;
fEndAngle = fStartAngle + (fEndAngle - fStartAngle) /2;
}
else
{
nArcs = 1;
}
}

// 对片段进行逼近
DividedArc2Bezier(ptfCenter fRadius fStartAngle fEndAngle fThreshold nArcs);
return nArcs;

} // END OF Arc2Bezier_SplitNum


// 用三次Bezier逼近圆弧: 得到控制顶点数组
void Arc2Bezier_GetCtrlPts(IN const POINTF ptfCenter // 圆心
IN const float fRadius // 半径
IN const float fAngleStart // 起始角度 
IN const float fAngleEnd // 终止角度 默认终止角度大于起始角度且都在0-2*PI之间
IN const int nArcs // 圆弧等分段数
OUT POINTF* ptfCtrlPts // 逼近结果 控制顶点数组 数组大小:nArcs * 3 + 1 

{
int i = 0;
int j = 0;
int k = 0;
POINTF ptfCtrl[4];
float fAngleGap = (fAngleEnd-fAngleStart)/nArcs;
float fStart = fAngleStart fEnd = fAngleStart + fAngleGap;
Get4CtrlPts(ptfCenter fRadius fStart fEnd ptfCtrl);
for (i=0; i<4; i++)
{
ptfCtrlPts[k++] = ptfCtrl[i];
} // end of for

// 可以在此处全部添加
for (i=1; i {
fStart = fEnd;
fEnd += fAngleGap;
Get4CtrlPts(ptfCenter fRadius fStart fEnd ptfCtrl);
for (j=1; j<4; j++)
{
ptfCtrlPts[k++] = ptfCtrl[j];
} // end of inner-for
} // end of outer-for

} // END OF Arc2Bezier_GetCtrlPts

// 用三次Bezier逼近圆弧片段
void DividedArc2Bezier(IN const POINTF ptfCenter // 圆心
   IN const float fRadius // 半径
   IN const float fAngleStart // 起始角度 
   IN OUT float fAngleEnd // 终止角度 默认终止角度大于起始角度且都在0-2*PI之间
   IN const float fThreshold // 误差阈值
   //IN OUT POINTF * ptfCtrlPts // 单段逼近结果 4个控制顶点
   //OUT CPtrArray *  pArrBezier // 逼近结果 控制顶点数组
   IN OUT int & nArcs // 圆等分段数
   )
{
// 算法步骤:
//1, 三分圆,或四分圆
//2, 求逼近的Bezier曲线
// 求最佳逼近Bezier曲线,或者用固定的方式求出Bezier曲线
//3, 求最大逼近误差
//4, 判断最大逼近误差是否满足误差要求

// 分段进

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       7009  2008-08-21 09:54  Arc2Bezier\Arc2BezierAPI.cpp

     文件       2072  2008-08-21 09:54  Arc2Bezier\Arc2BezierAPI.h

     目录          0  2009-03-27 11:07  Arc2Bezier

----------- ---------  ---------- -----  ----

                 9081                    3


评论

共有 条评论

相关资源