//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TPGeGLineSeg3D.cpp // = Version : ver2.0 // = Author : xlc // = CreateDate : 2002-09-09 // = Description: 类的定义 // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "TPGeGLineSeg3D.h" #include "TGPoint3D.h" #include "TPGeGLineRay3D.h" IMPLEMENT_RUN_TIME_CLASS1(TPGeGLineSeg3D,"TPGeGLineSeg3D",TPGeGLine3D) TPGeGLineSeg3D::TPGeGLineSeg3D() { } TPGeGLineSeg3D::TPGeGLineSeg3D(const TGVector3D&vt,const TGPoint&pt) : TPGeGLine3D(vt,pt) { } TPGeGLineSeg3D::TPGeGLineSeg3D(const TGPoint&pt0,const TGPoint&pt1) : TPGeGLine3D(pt0,pt1) { } TPGeGLineSeg3D::TPGeGLineSeg3D(const TPGeLine3D&line) : TPGeGLine3D(line) { } TPGeGLineSeg3D::~TPGeGLineSeg3D() { } const TGPoint& TPGeGLineSeg3D::GetStartPoint()const { return basePoint; } TGPoint TPGeGLineSeg3D::GetEndPoint()const { return TGPoint(basePoint.x + a,basePoint.y + b,basePoint.z + c); } TGPoint TPGeGLineSeg3D::GetMidPoint()const { return TGPoint(basePoint.x + a / 2,basePoint.y + b / 2,basePoint.z + c / 2); } const TPGeLine3D &TPGeGLineSeg3D::GetGeLine()const { return *this; } void TPGeGLineSeg3D::GetStartPoint(TGPoint&pt)const { pt = basePoint; } void TPGeGLineSeg3D::GetEndPoint(TGPoint&pt)const { pt = GetEndPoint(); } bool TPGeGLineSeg3D::IsFinite(bool bStart)const { return true; } double TPGeGLineSeg3D::Length()const { return TPGeLine3D::Length(); } void TPGeGLineSeg3D::Reverse() { basePoint = GetEndPoint(); TPGeLine3D::Reverse(); } TGObject2D* TPGeGLineSeg3D::Convert2D()const { return new TPGeGLineSeg2D(TGVector2D(x,y),basePoint); } TGObject * TPGeGLineSeg3D::Clone()const { return new TPGeGLineSeg3D(*this); } GRelation TPGeGLineSeg3D::HitTest(const TGPoint&pt)const { GRelation r = TPGeLine3D::HitTest(pt); if (r.Is(GR_IN)) { double pa; Pt2Pa(pt,pa); if (DOWN_ZERO(pa)) { return GR_OUT; } else { pa -= 1 ; if (UP_ZERO(pa)) { return GR_OUT; } else { return GR_IN; } } } return r; } bool TPGeGLineSeg3D::Intersect(const TGObject&obj,TGObjectList&res)const { switch(obj.GetClassID()) { case CID_GLine3D: { double pa; int ret = TPGeLine3D::Intersect((const TPGeGLine3D&)obj,pa); if (ret == INT_NULL) { return false; } else if (ret == INT_LINE) { 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; } bool TPGeGLineSeg3D::GetExtend3D(TPGeExtend3D&ext)const { double x0,x1,y0,y1,z0,z1; if (a > 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; } if (c > 0) { z0 = basePoint.z; z1 = z0+c; } else { z1 = basePoint.z; z0 = z1+c; } ext.SetRange(x0,x1,y0,y1,z0,z1); return true; } void TPGeGLineSeg3D::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<