資源簡介
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
評論
共有 條評論