Files
envi-code/SourceCode/Code2026/tg_shs/shs_subgeLib/TPGePlane.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

273 lines
5.0 KiB
C++

//-------------------------------------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TPGePlane 类
// = Version : ver2.0
// = Author : wlw
// = CreateDate : 2002-09-09
// = Description: TPGePlane 定义
// = Maintainers:
//
//-------------------------------------------------------------------------------------------------------+
#include "StdAfx.h"
#include "TPGePlane.h"
#include "TGMatrix.h"
TPGePlane::TPGePlane()
: a(x),b(y),c(z)
{
}
TPGePlane::TPGePlane(const TGVector3D& vt,const TGPoint& pt)
: TGVector3D(vt),d(-(vt&pt)),a(x),b(y),c(z)
{
}
TPGePlane::TPGePlane(const TPGePlane& plane)
: TGVector3D(plane),d(plane.d),a(x),b(y),c(z)
{
}
TPGePlane::~TPGePlane()
{
}
TPGePlane& TPGePlane::operator =(const TPGePlane& plane)
{
SetNormal(plane);
d = plane.d;
return *this;
}
bool TPGePlane::IsValid() const
{
return !IsNullVector();
}
void TPGePlane::SetNormal(const TGPoint& vt)
{
a = vt.x;
b = vt.y;
c = vt.z;
}
void TPGePlane::SetBasePoint(const TGPoint& pt)
{
d = -((*this)& pt);
}
TGPoint TPGePlane::GetSamplePoint() const
{
if(fabs(a) > fabs(b) && fabs(a) > fabs(c))
{
return TGPoint(-d / a,0,0);
}
else if(fabs(b) > fabs(c))
{
return TGPoint(0,-d / b,0);
}
else
{
return TGPoint(0,0,-d / c);
}
}
bool TPGePlane::IsSamePlane(const TPGePlane& plane,bool bSameDirection,bool bNormalized) const
{
if(HitTest(plane.GetSamplePoint(),bNormalized).IsNot(GR_IN))
{
return false;
}
if(bSameDirection)
{
return IsSameDirection(plane,bNormalized);
}
else
{
return IsParallel(plane,bNormalized);
}
}
bool TPGePlane::Normalize()
{
double len = Length();
if(UP_ZERO(len))
{
a /= len;
b /= len;
c /= len;
d /= len;
return true;
}
return false;
}
GRelation TPGePlane::HitTest(const TGPoint& pt,bool bNormalized) const
{
double temp;
if(bNormalized)
{
temp = a * pt.x + b * pt.y + c * pt.z + d;
}
else
{
double dl = Length();
temp = (a / dl) * pt.x + (b / dl) * pt.y + (c / dl) * pt.z + d / dl;
}
if(UP_ZERO(temp))
{
return GR_UP;
}
else if(DOWN_ZERO(temp))
{
return GR_DOWN;
}
else
{
return GR_IN;
}
}
int TPGePlane::Intersect(const TPGeLine3D& line,double& pa,bool bNormalized) const
{
if(bNormalized)
{
return LinePlaneInt3D(a,b,c,d,line.basePoint,line,pa);
}
double dl = Length(), dl1 = line.Length();
TGVector3D vt(line);
vt /= dl1;
int iRet = LinePlaneInt3D(a / dl, b / dl, c / dl, d / dl, line.basePoint, vt, pa);
pa /= dl1;
return iRet;
}
int TPGePlane::Intersect(const TPGeLine3D& line,TGPoint& pt,bool bNormalized) const
{
if(bNormalized)
{
return LinePlaneInt3DPt(a,b,c,d,line.basePoint,line,pt);
}
double dl = Length();
TGVector3D vt(line);
vt.Normalize();
return LinePlaneInt3DPt(a / dl,b / dl,c / dl,d / dl,line.basePoint,vt,pt);
}
int TPGePlane::Intersect(const TPGePlane& plane,TPGeLine3D& line,bool bNormalized) const
{
if(bNormalized)
{
return PlaneInt(a,b,c,d,plane.a,plane.b,plane.c,plane.d,line.basePoint,line);
}
double dl0 = Length(),dl1 = plane.Length();
return PlaneInt(a / dl0,b / dl0,c / dl0,d / dl0,plane.a / dl1,plane.b / dl1,plane.c / dl1,plane.d / dl1,line.basePoint,line);
}
void TPGePlane::TransformBy(const TGMatrix* pMat)
{
ASSERT(pMat != NULL);
TGPoint ptBase = GetSamplePoint();
pMat->Transform(*this);
pMat->Transform3D(ptBase);
SetBasePoint(ptBase);
}
int TPGePlane::LinePlaneInt3D(double A,double B,double C,double D, const TGPoint &pt0,const TGVector3D &vt, double &pa) const
{
TGVector3D vt1(A,B,C);
double n1 = vt1 & vt;
double n2 = -D - (vt1 & pt0);
if (EQUAL_ZERO(n1))
{
if (EQUAL_ZERO(n2))
{
return INT_LINE;
}
else
{
return INT_NULL;
}
}
pa = n2 / n1;
return INT_1PT;
}
int TPGePlane::LinePlaneInt3DPt(double A,double B,double C,double D, const TGPoint &pt0,const TGVector3D &vt, TGPoint &pt) const
{
TGVector3D vt1(A,B,C);
double n1 = vt1 & vt;
double n2 = -D - (vt1 & pt0);
if (EQUAL_ZERO(n1))
{
if (EQUAL_ZERO(n2))
{
return INT_LINE;
}
else
{
return INT_NULL;
}
}
double pa = n2 / n1;
pt.x = pt0.x + vt.x * pa;
pt.y = pt0.y + vt.y * pa;
pt.z = pt0.z + vt.z * pa;
return INT_1PT;
}
int TPGePlane::PlaneInt(double A1,double B1,double C1,double D1, double A2,double B2,double C2,double D2, TGPoint &pt,TGVector3D &vt) const
{
double A3 = B1 * C2 - C1 * B2,B3 = C1 * A2 - A1 * C2,C3 = A1 * B2 - B1 * A2;
if (EQUAL_ZERO(A3) && EQUAL_ZERO(B3) && EQUAL_ZERO(C3))
{
double temp = A1 * D2 - A2 * D1;
if (EQUAL_ZERO(temp))
{
return INT_PLANE;
}
else
{
return INT_NULL;
}
}
vt.x = A3;
vt.y = B3;
vt.z = C3;
if (!EQUAL_ZERO(C3))
{
pt.z = 0;
pt.x = (B1 * D2 - B2 * D1) / C3;
pt.y = (-A1 * D2 + A2 * D1) / C3;
}
else if (!EQUAL_ZERO(B3))
{
pt.y = 0;
pt.x = (-C1 * D2 + C2 * D1) / B3;
pt.z = (A1 * D2 - A2 * D1) / B3;
}
else if (!EQUAL_ZERO(A3))
{
pt.x = 0;
pt.z = (-B1 * D2 + B2 * D1) / A3;
pt.y = (C1 * D2 - C2 * D1) / A3;
}
else
{
return INT_NULL;
}
vt.Normalize();
return INT_LINE;
}