//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TGGeArc弧类 // = Version : ver2.0 // = Author : wlw // = CreateDate : 2002-09-09 // = Description: TGGeArc类声明 // = Maintainers: // //-----------------------------------------------------------------------------+ #ifndef _TGGEARC_H_ #define _TGGEARC_H_ #ifndef _TGGECIRCLE_H_ #include "TGGeCircle.h" #endif #ifndef _TGGESECTOR_H_ #include "TGGeSector.h" #endif #ifndef _TADSGEPOINT3D_H_ #include "TADSGePoint3d.h" #endif class TEntitySet; class GEOAPI TGGeArc : public TGGeCircle, public TGGeSector { public : TGGeArc(); TGGeArc(const TGGeArc &src); TGGeArc(const TEntitySet &aCircle); TGGeArc(const TEntitySet &aArc, ads_matrix mat); TGGeArc(const TADSGePoint3d &spt, const TADSGePoint3d &ept, ads_real dang); TGGeArc(const TADSGePoint3d &ptStart, const TADSGePoint3d &pt2, const TADSGePoint3d &ptEnd); TGGeArc(ads_point ptcenter, double dradius, double ptstartAngle, double ptendAngle); virtual ~TGGeArc(); virtual bool IsKindOf(TEntityId entType) const; virtual TEntityId Type() const; virtual void CopyFrom(const TGGeEntity* pImpSrc); virtual int Make(const TCHAR *szlay = NULL) const; virtual int Modify(const TEntitySet* pEnt) const; virtual int GetExtend(ads_point lowPt, ads_point upPt) const; virtual int MakeEntity(const TEntitySet* pEnt) const; virtual int GetSubArc(const TADSGePoint3d &ptloc, ads_real dchordLen, TGGeArc &arcRes) const; //图形长度,周长 virtual ads_real GetLength() const; TGGeArc& operator = (const TGGeSector &src); TGGeArc& operator = (const TGGeArc &src); bool operator == (const TGGeArc &src) const; int operator ! () const; virtual int HitTest2d(const TADSGePoint3d &ptTest) const; virtual int OSnap(int nMode, TADSGePoint3d &ptPick) const; bool Set(const TADSGePoint3d &spt, const TADSGePoint3d &ept, ads_real dang); bool Set(const TADSGePoint3d &ptStart, const TADSGePoint3d &ptOn, const TADSGePoint3d &ptEnd); void SetAngleByPoints(const TADSGePoint3d &ptStart, const TADSGePoint3d &ptEnd); void GetStartPoint(TADSGePoint3d &ptStart) const; void GetEndPoint(TADSGePoint3d &ptEnd) const; void MidPoint(TADSGePoint3d &ptres) const; TADSGePoint3d MidPoint() const; //求弦长 ads_real ChordLength() const; // 扇形面积 ads_real Area() const; //起点到终点的积分面积 ads_real PathArea() const; TGGeArc Offset(ads_real dist) const; virtual void TransUCS(ads_matrix mat); //上华direction ads_real IDirection(int pt) const; ads_real ODirection(int pt) const; virtual int Intersection(const TGGeLine* pLine, ads_point ptRp1 = NULL, ads_point ptRp2 = NULL) const; virtual int Intersection(const TGGeArc* pArc, ads_point ptRp1 = NULL, ads_point ptRp2 = NULL) const; virtual int Intersection(const TGGeCircle* pCir, ads_point ptRp1 = NULL, ads_point ptRp2 = NULL) const; ads_real * SelectNear(ads_point pt1, ads_point pt2) const; int PtOnArc(const TADSGePoint3d &pt) const; }; inline TGGeArc& TGGeArc::operator = (const TGGeSector &src) { m_dstartAngle = src.m_dstartAngle; m_dendAngle = src.m_dendAngle; return *this; } inline TGGeArc& TGGeArc::operator = (const TGGeArc &src) { if (this != &src) { m_dstartAngle = src.m_dstartAngle; m_dendAngle = src.m_dendAngle; m_ptCenter = src.m_ptCenter; m_dRadius = src.m_dRadius; } return *this; } inline int TGGeArc::operator ! () const { return (TGGeCircle::operator !() || GetLength() < TchGeLib::_DIST_SNAP); } inline bool TGGeArc::operator == (const TGGeArc &src) const { return (TGGeCircle::operator == (src) && TGGeSector::operator == (src)); } inline TGGeArc TGGeArc::Offset(ads_real dist) const { ads_real r = m_dRadius + dist; if (r < TchGeLib::_DIST_SNAP) { r = 0; } return TGGeArc(m_ptCenter, r, m_dstartAngle, m_dendAngle); } inline ads_real TGGeArc::GetLength() const { return Bulge() * m_dRadius; } inline ads_real TGGeArc::ChordLength() const { return fabs(2.0 * m_dRadius * sin(Bulge() / 2.0)); } inline void TGGeArc::MidPoint(TADSGePoint3d &ptres) const { ads_polar(m_ptCenter, MidAngle(), m_dRadius, ptres); } inline TADSGePoint3d TGGeArc::MidPoint() const { TADSGePoint3d ptres; ads_polar(m_ptCenter, MidAngle(), m_dRadius, ptres); return ptres; } #endif