// Copyright (C), 1998-2007, Beijing Tangent Engineering Software Co. Ltd. // = FileName: RoadArith.h // = Version: 8.5 // = Author: lgh // = Date: 2010-9-7 14:44:54 // = Description: 道路相关密切的一些处理算法 // = Maintainers: #ifndef __TCH_SITIPLAN_ROADADAPTERFORLINK_H__ #define __TCH_SITIPLAN_ROADADAPTERFORLINK_H__ #include class CRoadArith { private: CRoadArith() {}; ~CRoadArith(){}; public: // 处理道路的倒角 // 按照正常情况考虑问题,排除异常情况 // 返回值:是否正确的执行倒角 // InterCircle:生成的倒角 // 线段跟线段的倒角 static bool InterCircleLineAndLine(AcGeCurve2d *pEnt1, bool bDir1, AcGeCurve2d *pEnt2, bool bDir2, double dRadius, AcGeCircArc2d &interCircle); // 线段跟弧线的倒角,参数同上 static bool InterCircleLineAndArc(AcGeCurve2d *pEnt1, bool bDir1, AcGeCurve2d *pEnt2, bool bDir2, double dRadius, AcGeCircArc2d &interCircle); static bool InterCircleArcAndLine(AcGeCurve2d *pEnt1, bool bDir1, AcGeCurve2d *pEnt2, bool bDir2, double dRadius, AcGeCircArc2d &interCircle); // 弧线跟弧线的倒角,参数同上 static bool InterCircleArcAndArc(AcGeCurve2d *pEnt1, bool bDir1, AcGeCurve2d *pEnt2, bool bDir2, double dRadius, AcGeCircArc2d &interCircle); // 倒角线在延长线附近存在两个交点, 应该从中选取一个合适的交点。 static bool TestProperPoint(const AcGeLineSeg2d &line1, bool bStart1, const AcGeCircArc2d &arc2, bool bStart2, const AcGePoint2d &pt1, const AcGePoint2d &pt2, AcGePoint2d &ptDest); static bool TestProperPoint(const AcGeCircArc2d &arc1, bool bStart1, const AcGeCircArc2d &arc2, bool bStart2, const AcGePoint2d &pt1, const AcGePoint2d &pt2, AcGePoint2d &ptDest); private: // 交点是否在bDir的方向上。验证点在线上,或者在对应段的延伸线上。 static bool PointInLineDir(const AcGeLineSeg2d &line, bool bDir, const AcGePoint2d &ptInter); static bool PointInArcDir(const AcGeCircArc2d &arc, bool bDir, const AcGePoint2d &ptInter); // 计算距离bStart端的距离。 static void NearPtInLine(const AcGeLineSeg2d &line, bool bStart, const AcGePoint2d &pt1, const AcGePoint2d &pt2, double &dLen1, double &dLen2); static void NearPtInArc(const AcGeCircArc2d &arc, bool bStart, const AcGePoint2d &pt1, const AcGePoint2d &pt2, double &dLen1, double &dLen2); // 判断两线段(圆弧)是否可以执行倒角,如果可以倒角则计算交点 static bool ForCenterLineAndLine(AcGeCurve2d *pEnt1, bool bDir1, AcGeCurve2d *pEnt2, bool bDir2, double dRadius, AcGePoint2d &ptCenter); static bool ForCenterLineAndArc(AcGeCurve2d *pEnt1, bool bDir1, AcGeCurve2d *pEnt2, bool bDir2, double dRadius, AcGePoint2d &ptCenter); static bool ForCenterArcAndLine(AcGeCurve2d *pEnt1, bool bDir1, AcGeCurve2d *pEnt2, bool bDir2, double dRadius, AcGePoint2d &ptCenter); static bool ForCenterArcAndArc(AcGeCurve2d *pEnt1, bool bDir1, AcGeCurve2d *pEnt2, bool bDir2, double dRadius, AcGePoint2d &ptCenter); // 构造线段所对应的弧线 static AcGeRay2d LineSegToRay(const AcGeLineSeg2d &line, bool bDir); // 算法:以两个起点相连的线段为例,讲解该偏移算法。 // line1 的两个向量:左向量vecL1,右向量vecR1 // line2 的两个向量:左向量vecL2,右向量vecR2 // line1,line2分别有两个方向向量:dri1, dir2; // line1、line2的左向量和右向量分别跟对方的方向向量比较。点积为正的即偏移方向。 // 以统一的向量形式来描述两条相交边线的关系。判断他们应该的偏移方向 static bool Off(const AcGeVector2d &vecL1, const AcGeVector2d &vecR1, const AcGeVector2d &vecL2, const AcGeVector2d &vecR2, const AcGeVector2d &dir1, const AcGeVector2d &dir2, bool &bLeft1, bool &bLeft2); // 计算两个倒角线的偏向, // ret:bLeft1, bLeft2; static bool FindUnitVec(const AcGeLineSeg2d &line1, bool bDir1, const AcGeLineSeg2d &line2, bool bDir2, bool &bLeft1, bool &bLeft2); static bool FindUnitVec(const AcGeLineSeg2d &line1, bool bDir1, const AcGeCircArc2d &arc2, bool bDir2, bool &bLeft1, bool &bIn2); static bool FindUnitVec(const AcGeCircArc2d &arc1, bool bDir1, const AcGeCircArc2d &arc2, bool bDir2, bool &bIn1, bool &bIn2); // 构造圆弧, static void ConInterCircle(const AcGePoint2d &ptCenter, const AcGePoint2d &pt1, const AcGePoint2d &pt2, AcGeCircArc2d &interArc); }; #endif