资源简介
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
评论
共有 条评论