スプラインポリラインの変換

 

スプライン曲線のフィッティング

//定义PI
#ifndefのPIと
の#define PI 4×ATAN(1.0)//提高PI的精度
#endifの
BOOL getSplineSamplePoints(AcDbSpline *&スプライン、AcGePoint3dArray&PNTS)
{
アサート(スプライン= NULL!)。
AcGePoint3d orgPt;
spline-> getStartPoint(orgPt)。
pnts.append(orgPt)。
二重dStartParam = 0.0。
spline-> getStartParam(dStartParam)。
二重dEntParam = 0.0。
spline-> getEndParam(dEntParam)。
二重dDist = 0.0。
spline-> getDistAtParam(dEntParam、dDist)。
INT NNUM =(INT)dDist / 0.005。
(NNUM <25)であれば
{
NNUM = 25。
}

もし(NNUM> 10000)

{

NNUM = 10000;

}
(INT I = 0; iについて<NNUM; I ++)
{
= 0.0ダブルdTmpParam;
spline-> getParamAtDist(dDist *(1 + I)/ NNUM、dTmpParam。);
spline-> getPointAtParam(dTmpParam、orgPt)
PNTS。追記(orgPt);
}
pnts.logicalLengthを返す()> 2;
}
AcGePoint2d convert3dPointTo2d(AcGePoint3dのPt)
{
AcGePoint2d PM;
pm.set(pt.x、pt.y);
戻りPM;
}
//は、3つの点を取得します角度
ダブルGetIntersectionDngle(AcGePoint2d PT1、PT2 AcGePoint2d、AcGePoint2d PT3)
{
AcGeVector2d-PT1 = PT2 VT1;
AcGeVector2d VT2 = PT2、PT3、
リターンvt1.angleTo(VT2);
}
// 3つのドットの角度を取得する
ダブルGetIntersectionDngle(AcGePoint3d PT1、PT2 AcGePoint3d、 AcGePoint3d PT3)
{
戻りGetIntersectionDngle(convert3dPointTo2d(PT1)、convert3dPointTo2d(PT2)、convert3dPointTo2d(PT3));
}
//点間の直線を構成する3つのポイントを削除
// dMinAngle、最小の角度の設定は、デフォルト値は0.5度である
ボイドRemovePointBetweenLine (AcGePoint3dArray&PNTS、PI-ダブルdMinAngle = 0.5 * PI / 180.0)
{
AcGePoint3dArray RCPTS;
IF(pnts.logicalLength()<= 2)
{
リターン;
}
rcPts.append(pnts.at(0));
rcPts.append( pnts.at);(1)
I ++);(; I <pnts.logicalLength(INT I = 2)のための
{
AcGePoint3d rcPts.at PT1 =(rcPts.logicalLength() - 2);
AcGePoint3d rcPts.at PT2 =(RCPTS .logicalLength() - 1);
AcGePoint3d PT3 = pnts.at(I);
ダブルブラブラ= GetIntersectionDngle(PT1、PT2、PT3)。
IF(ダングル> = dMinAngle &&ブラブラ<= PI)
{
rcPts.setAt(rcPts.logicalLength() - 1、PT3);
}

{
rcPts.append(PT3);
}
}
pnts.setLogicalLength(0);
pnts.append(RCPTS );
}
//関数:エンティティIDの配列にセットを選択
ssName、選択セット:パラメータ@
// objidsは、エンティティIDアレイ
//リターン:
ボイドSSToIds(AcDbObjectIdArray&objidsは、ads_name ssname)
{
AcDbObjectId OBJID;
ads_name EntName。
NLENGTH 0 =ロング;
acedSSLength(ssname、&NLENGTH)。

用(INT nLen = 0; nLen <NLENGTH; nLen ++)
{
acedSSName(ssname、nLen、EntName);
acdbGetObjectId(OBJID、EntName);
ObjIds.append(OBJID);
}
}
//関数:エンティティのブロックテーブルレコードに追加
//パラメータ:ペント:追加するエンティティポインタ
// btrID、AcDbBlockTableRecord ID
//戻り値:オブジェクトIDエンティティを、障害が空のインサートのObjectId返すように場合
AcDbObjectId AppendEntity(AcDbObjectId btrID CONST AcDbEntity PENT *、)
{
AcDbObjectIdするresultId;
するresultIdを.setNull()。

AcDbBlockTableRecord * pBlkRec = NULL; //オープンテーブル
アカデミー:: ErrorStatus ES = acdbOpenObject(pBlkRec、btrID、ACDB :: kForWrite);
IF(=エスアカデミー:: EOK!)
{
acutPrintf(_T(「\ nは空間モデルが開きません!%のS「)、acadErrorStatusText(ES));
リターンするresultId;
}

ES = pBlkRec-> appendAcDbEntity(するresultId、ペント); // 追加エンティティ
IF(!::アカデミーEOK = ES)
{
)acutPrintf(_T( "!%sの失敗したモデル空間に\ n型アドオブジェクト"、acadErrorStatusText( ES) );
pBlkRec->クローズ();
戻りするresultId;
}
ES = pBlkRec->クローズ();

するresultIdを返します。
}
アカデミー:: ErrorStatus TOPLINE(AcDbSpline *スプライン)
{
AcGePoint3dArrayのPNTS。
BOOL RC = getSplineSamplePoints(スプライン、PNTS)。
(!RC)であれば
、戻りアカデミー:: eInvalidInput。
RemovePointBetweenLine(PNTS)。
AcDbPolyline * PLINE =新しいAcDbPolyline(pnts.logicalLength());
以下のために(INT I = 0; I <pnts.logicalLength(); I ++)
{
pLine-> addVertexAt(I、convert3dPointTo2d(pnts.at(I)))。
}
AppendEntity(PLINE、spline-> BLOCKID());
pLine->クローズ();
アカデミー:: EOKを返します。
}
アカデミー:: ErrorStatus TOPLINE(AcDbObjectIdのID)
{
AcDbObjectPointer <AcDbSpline>スプライン(ID、ACDB :: kForRead)。
もし(spLine.openStatus()!=アカデミー:: EOK)
リターンspLine.openStatus();
リターンTOPLINE(spLine.object());

}
ボイドTOPLINE()
{
アカデミー:: ErrorStatus ES = EOK。
resbuf * RB = acutBuildList(RTDXF0、_T(「SPLINE」)、0);
ads_name ssName;
acutPrintf(_T(「\ nは请选择样条曲线ます:\ n」));
INT RC = acedSSGet(NULL、NULL、NULL、RB、ssName)。
もし(RC = RTNORM!)
{
acutRelRb(RB);
リターン;
}
AcDbObjectIdArrayのIDS。
SSToIds(IDS、ssName)。
acedSSFree(ssName)。
AcDbObjectIdのID。
以下のために(INT I 0 =; I <ids.logicalLength(); I ++)
{
ID = ids.at(I)。
トップライン(ID)。
}
}

おすすめ

転載: www.cnblogs.com/mjgw/p/12406133.html