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

224 lines
3.8 KiB
C++

//-------------------------------------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TGVector3D 类
// = Version : ver2.0
// = Author : wlw
// = CreateDate : 2002-09-09
// = Description: TGVector3D 定义
// = Maintainers:
//
//-------------------------------------------------------------------------------------------------------+
#include "StdAfx.h"
#include "TGVector3D.h"
TGVector3D::TGVector3D(double x /*= 0*/,double y /*= 0*/,double z /*= 0*/):TGPoint(x,y,z)
{
}
TGVector3D::TGVector3D(double *p):TGPoint(p)
{
}
TGVector3D::TGVector3D(float*p):TGPoint(p)
{
}
TGVector3D::TGVector3D(const TGPoint& pt):TGPoint(pt)
{
}
TGVector3D::TGVector3D(const TGPoint& fromPt,const TGPoint& toPt):TGPoint(toPt.x-fromPt.x,toPt.y-fromPt.y,toPt.z-fromPt.z)
{
}
TGVector3D::~TGVector3D()
{
}
double TGVector3D::Length() const
{
return Length3D();
}
bool TGVector3D::IsValid() const
{
return UP_ZEROD(Length());
}
bool TGVector3D::IsNullVector() const
{
double l = Length();
return EQUAL_ZEROD(l);
}
bool TGVector3D::IsNormalized() const
{
double temp = 1 - Length();
return EQUAL_ZEROD(temp);
}
void TGVector3D::SetVector(double x,double y,double z)
{
TGPoint::SetPoint(x,y,z);
}
void TGVector3D::SetLength(double len)
{
(*this) *= (len/Length());
}
void TGVector3D::Reverse()
{
x = -x;
y = -y;
z = -z;
}
TGVector3D TGVector3D::operator -() const
{
return TGVector3D(-x,-y,-z);
}
TGVector3D TGVector3D::operator +(const TGPoint& vt) const
{
return TGVector3D(x+vt.x, y+vt.y, z+vt.z);
}
TGVector3D TGVector3D::operator -(const TGPoint& vt) const
{
return TGVector3D(x-vt.x, y-vt.y, z-vt.z);
}
TGVector3D TGVector3D::operator *(double rate) const
{
return TGVector3D(x*rate, y*rate, z*rate);
}
TGVector3D TGVector3D::operator /(double rate) const
{
return TGVector3D(x/rate, y/rate, z/rate);
}
TGVector3D TGVector3D::operator *(const TGPoint& vt) const
{
return TGVector3D(y * vt.z - z * vt.y, z * vt.x - x * vt.z, x * vt.y - y * vt.x);
}
double TGVector3D::operator & (const TGPoint& vt) const
{
return x * vt.x + y * vt.y + z * vt.z;
}
bool TGVector3D::Normalize()
{
double len = Length();
if (UP_ZERO(len))
{
x /= len;
y /= len;
z /= len;
return true;
}
return false;
}
bool TGVector3D::IsParallel(const TGPoint& vt,bool bNormalized) const
{
if (bNormalized)
{
return ((*this)*vt).IsNullVector();
}
TGVector3D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
return (vt0*vt1).IsNullVector();
}
bool TGVector3D::IsVert(const TGPoint& vt,bool bNormalized) const
{
double temp;
if (bNormalized)
{
temp = (*this)& vt;
}
else
{
TGVector3D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
temp = vt0& vt1;
}
return EQUAL_ZERO(temp);
}
bool TGVector3D::IsSameDirection(const TGPoint& vt,bool bNormalized) const
{
double temp;
if (bNormalized)
{
temp = (*this)& vt;
}
else
{
TGVector3D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
temp = vt0 & vt1;
}
return UP_ZERO(temp);
}
bool TGVector3D::IsReverseDirection(const TGPoint& vt,bool bNormalized) const
{
double temp;
if (bNormalized)
{
temp = (*this)& vt;
}
else
{
TGVector3D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
temp = vt0 & vt1;
}
return DOWN_ZERO(temp);
}
double TGVector3D::GetAngleWith(const TGPoint& vt,bool bNormalized) const
{
if (bNormalized)
{
return acos((*this)& vt);
}
else
{
TGVector3D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
return acos(vt0 & vt1);
}
}
bool TGVector3D::GetVertVector(TGPoint& vt) const
{
if(EQUAL_ZERO(x) && EQUAL_ZERO(y))
{
if(EQUAL_ZERO(z))
{
return false;
}
vt.x = 1;
vt.y = 0;
vt.z = 0;
}
else
{
vt.x = -y;
vt.y = x;
vt.z = 0;
}
return true;
}