176 lines
3.2 KiB
C++
176 lines
3.2 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
|
|
// = FileName : TPGeGLine3D.cpp
|
|
// = Version : ver2.0
|
|
// = Author : xlc
|
|
// = CreateDate : 2002-09-09
|
|
// = Description: ÀàµÄ¶¨Òå
|
|
// = Maintainers:
|
|
//
|
|
//-----------------------------------------------------------------------------+
|
|
#include "StdAfx.h"
|
|
#include "TPGeGLine3D.h"
|
|
#include "TPGeGLine2D.h"
|
|
#include "TGPoint3D.h"
|
|
#include "TPGeGLineRay3D.h"
|
|
#include "TPGeGLineSeg3D.h"
|
|
|
|
IMPLEMENT_RUN_TIME_CLASS1(TPGeGLine3D,"TPGeGLine3D",TPGeCurve3D)
|
|
|
|
TPGeGLine3D::TPGeGLine3D()
|
|
{
|
|
|
|
}
|
|
|
|
TPGeGLine3D::TPGeGLine3D(const TGVector3D&vt,const TGPoint&pt)
|
|
: TPGeLine3D(vt,pt)
|
|
{
|
|
|
|
}
|
|
|
|
TPGeGLine3D::TPGeGLine3D(const TGPoint&pt0,const TGPoint&pt1)
|
|
: TPGeLine3D(pt0,pt1)
|
|
{
|
|
|
|
}
|
|
|
|
TPGeGLine3D::TPGeGLine3D(const TPGeLine3D&line)
|
|
: TPGeLine3D(line)
|
|
{
|
|
|
|
}
|
|
|
|
TPGeGLine3D::~TPGeGLine3D()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
const TPGeLine3D& TPGeGLine3D::GetGeLine() const
|
|
{
|
|
return *this;
|
|
}
|
|
|
|
bool TPGeGLine3D::IsClosed() const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool TPGeGLine3D::IsFinite(bool bStart) const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void TPGeGLine3D::Pa2Pt(double pa,TGPoint&pt) const
|
|
{
|
|
TPGeLine3D::Pa2Pt(pa,pt);
|
|
}
|
|
|
|
void TPGeGLine3D::Pt2Pa(const TGPoint&pt,double&pa) const
|
|
{
|
|
TPGeLine3D::Pt2Pa(pt,pa);
|
|
}
|
|
|
|
void TPGeGLine3D::Reverse()
|
|
{
|
|
TPGeLine3D::Reverse();
|
|
}
|
|
|
|
TGObject2D* TPGeGLine3D::Convert2D() const
|
|
{
|
|
return new TPGeGLine2D(TGVector2D(x,y),basePoint);
|
|
}
|
|
|
|
bool TPGeGLine3D::IsValid() const
|
|
{
|
|
return TPGeLine3D::IsValid();
|
|
}
|
|
|
|
void TPGeGLine3D::TransformBy(const TGMatrix&matrix)
|
|
{
|
|
TPGeLine3D::TransformBy(&matrix);
|
|
}
|
|
|
|
TGObject * TPGeGLine3D::Clone() const
|
|
{
|
|
return new TPGeGLine3D(*this);
|
|
}
|
|
|
|
GRelation TPGeGLine3D::HitTest(const TGPoint&pt) const
|
|
{
|
|
return TPGeLine3D::HitTest(pt);
|
|
}
|
|
|
|
bool TPGeGLine3D::Intersect(const TGObject&obj,TGObjectList&res) const
|
|
{
|
|
if (IS_TYPE(&obj,TPGeGLine3D))
|
|
{
|
|
double pa;
|
|
int ret = TPGeLine3D::Intersect((const TPGeGLine3D&)obj,pa);
|
|
if (ret == INT_NULL)
|
|
{
|
|
return false;
|
|
}
|
|
else if (ret == INT_LINE)
|
|
{
|
|
res << new TPGeGLine3D(*this);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
TGPoint3D *pPt=new TGPoint3D;
|
|
Pa2Pt(pa,*pPt);
|
|
res << pPt;
|
|
|
|
return true;
|
|
}
|
|
}
|
|
return obj.Intersect(*this, res);
|
|
}
|
|
|
|
bool TPGeGLine3D::IsInclude(const TGObject&obj) const
|
|
{
|
|
switch(obj.GetClassID())
|
|
{
|
|
case CID_GLine3D:
|
|
return IsSameLine((const TPGeGLine3D&)obj,false);
|
|
case CID_GLineRay3D:
|
|
return IsSameLine((const TPGeGLineRay3D&)obj,false);
|
|
case CID_GLineSeg3D:
|
|
return IsSameLine((const TPGeGLineSeg3D&)obj,false);
|
|
default:
|
|
return TPGeCurve3D::IsInclude(obj);
|
|
}
|
|
}
|
|
|
|
TPGeCurve3D* TPGeGLine3D::GetSubCurve(double pa0,double pa1) const
|
|
{
|
|
TGPoint pt0,pt1;
|
|
Pa2Pt(pa0,pt0);
|
|
Pa2Pt(pa1,pt1);
|
|
return new TPGeGLineSeg3D(pt0,pt1);
|
|
}
|
|
|
|
void TPGeGLine3D::Split(const TTable<double>&paTable,TGObjectList&res) const
|
|
{
|
|
if (paTable.IsEmpty())
|
|
{
|
|
return;
|
|
}
|
|
|
|
TGPoint pt0;
|
|
Pa2Pt(paTable.GetAt(0),pt0);
|
|
TGVector3D vt(*this);
|
|
res << new TPGeGLineRay3D(-vt,pt0);
|
|
for (long i = 1;i < paTable.GetLength();i++)
|
|
{
|
|
if (UP_ZERO(paTable.GetAt(i) - paTable.GetAt(i - 1)))
|
|
{
|
|
TGPoint pt1;
|
|
Pa2Pt(paTable.GetAt(i),pt1);
|
|
res << new TPGeGLineSeg3D(pt0,pt1);
|
|
pt0 = pt1;
|
|
}
|
|
res << new TPGeGLineRay3D(vt,pt0);
|
|
}
|
|
} |