//-------------------------------------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TPGeGLineSeg2D 类 // = Version : ver2.0 // = Author : wlw // = CreateDate : 2002-09-09 // = Description: TPGeGLineSeg2D 定义 // = Maintainers: // //-------------------------------------------------------------------------------------------------------+ #include "StdAfx.h" #include "TPGeGLineSeg2D.h" #include "TPGeGLineSeg3D.h" #include "TGPoint2D.h" IMPLEMENT_RUN_TIME_CLASS1(TPGeGLineSeg2D,"TPGeGLineSeg2D",TPGeGLine2D) TPGeGLineSeg2D::TPGeGLineSeg2D() { } TPGeGLineSeg2D::TPGeGLineSeg2D(const TGVector2D& vt,const TGPoint& pt):TPGeGLine2D(vt,pt) { } TPGeGLineSeg2D::TPGeGLineSeg2D(const TGPoint& pt0,const TGPoint& pt1):TPGeGLine2D(pt0,pt1) { } TPGeGLineSeg2D::TPGeGLineSeg2D(const TPGeLine2D& line):TPGeGLine2D(line) { } TPGeGLineSeg2D::~TPGeGLineSeg2D() { } const TGPoint& TPGeGLineSeg2D::GetStartPoint() const { return basePoint; } TGPoint TPGeGLineSeg2D::GetEndPoint() const { return TGPoint(basePoint.x + a,basePoint.y + b,basePoint.z + c); } TGPoint TPGeGLineSeg2D::GetMidPoint() const { return TGPoint(basePoint.x + a / 2,basePoint.y + b / 2,basePoint.z + c / 2); } void TPGeGLineSeg2D::GetStartPoint(TGPoint& pt) const { pt = basePoint; } void TPGeGLineSeg2D::GetEndPoint(TGPoint& pt) const { pt = GetEndPoint(); } bool TPGeGLineSeg2D::IsFinite(bool bStart) const { return true; } TPGeCurve2D* TPGeGLineSeg2D::GetExtendCurve() const { return new TPGeGLine2D(*this); } double TPGeGLineSeg2D::Length() const { return TPGeLine2D::Length(); } void TPGeGLineSeg2D::Reverse() { basePoint = GetEndPoint(); TPGeLine2D::Reverse(); } TGObject * TPGeGLineSeg2D::Clone() const { return new TPGeGLineSeg2D(*this); } bool TPGeGLineSeg2D::IsSameSeg(const TPGeGLineSeg2D&seg,bool bSameDirection) const { if (TGVector2D::operator == (seg) && basePoint.Equal2D(seg.basePoint)) { return true; } else if (!bSameDirection) { return basePoint.Equal2D(seg.GetEndPoint()) && seg.basePoint.Equal2D(GetEndPoint()); } else { return false; } } GRelation TPGeGLineSeg2D::HitTest(const TGPoint&pt) const { GRelation r = TPGeLine2D::HitTest(pt); if (r.Is(GR_IN)) { double pa; Pt2Pa(pt,pa); if (DOWN_ZERO(pa) && UP_ZEROD(Distance2D(basePoint,pt))) { return GR_OUT; } else { pa -= 1; if (UP_ZERO(pa) && UP_ZEROD(Distance2D(GetEndPoint(),pt))) { return GR_OUT; } else { return GR_IN; } } } return r; } void TPGeGLineSeg2D::Split(const TTable&paTable,TGObjectList&res) const { if (paTable.IsEmpty()) { return; } TGPoint pt0; if (UP_ZERO(paTable.GetAt(0))) { Pa2Pt(paTable.GetAt(0),pt0); res< 0) { x0 = basePoint.x; x1 = x0 + a; } else { x1 = basePoint.x; x0 = x1 + a; } if (b > 0) { y0 = basePoint.y; y1 = y0 + b; } else { y1 = basePoint.y; y0 = y1 + b; } ext.SetRange(x0,x1,y0,y1); return true; } TGMLine2D* TPGeGLineSeg2D::MLinearize(double paDist) const { TGMLine2D* pMLine = new TGMLine2D(2,false); (*pMLine)[0] = GetStartPoint(); (*pMLine)[1] = GetEndPoint(); return pMLine; } TGObject3D* TPGeGLineSeg2D::Convert3D() const { return new TPGeGLineSeg3D(TGVector3D(x,y,z),basePoint); }