Files
envi-code/SourceCode/Code2026/tg_shs/shs_subgeLib/TGVector2D.cpp
T
2026-09-28 15:28:50 +08:00

302 lines
4.8 KiB
C++

//-------------------------------------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TGVector2D Àà
// = Version : ver2.0
// = Author : wlw
// = CreateDate : 2002-09-09
// = Description: TGVector2D ÉùÃ÷
// = Maintainers:
//
//-------------------------------------------------------------------------------------------------------+
#include "StdAfx.h"
#include "TGVector2D.h"
TGVector2D::TGVector2D(double x,double y,double z):TGPoint(x,y,z)
{
}
TGVector2D::TGVector2D(double*p):TGPoint(p[0],p[1])
{
}
TGVector2D::TGVector2D(float*p):TGPoint(p[0],p[1])
{
}
TGVector2D::TGVector2D(const TGPoint& pt):TGPoint(pt)
{
}
TGVector2D::TGVector2D(const TGPoint& fromPt,const TGPoint& toPt):TGPoint(toPt.x-fromPt.x,toPt.y-fromPt.y)
{
}
TGVector2D::~TGVector2D()
{
}
void TGVector2D::Polar(double angle)
{
x = cos(angle);
y = sin(angle);
}
double TGVector2D::Length() const
{
return Length2D();
}
bool TGVector2D::IsValid() const
{
return UP_ZEROD(Length());
}
bool TGVector2D::IsNullVector() const
{
double l = Length();
return EQUAL_ZEROD(l);
}
bool TGVector2D::IsNormalized() const
{
double temp = Length()-1;
return EQUAL_ZEROD(temp);
}
void TGVector2D::SetVector(double x,double y)
{
TGPoint::SetPoint(x,y);
}
void TGVector2D::SetLength(double len)
{
(*this) *= (len/Length());
}
void TGVector2D::Reverse()
{
x = -x;
y = -y;
}
TGVector2D TGVector2D::operator -() const
{
return TGVector2D(-x,-y);
}
TGVector2D TGVector2D::operator +(const TGPoint& vt) const
{
return TGVector2D(x+vt.x,y+vt.y);
}
TGVector2D TGVector2D::operator -(const TGPoint& vt) const
{
return TGVector2D(x-vt.x,y-vt.y);
}
TGVector2D TGVector2D::operator *(double rate) const
{
return TGVector2D(x*rate,y*rate);
}
TGVector2D TGVector2D::operator /(double rate) const
{
return TGVector2D(x/rate,y/rate);
}
void TGVector2D::operator += (const TGPoint& vt)
{
x += vt.x;
y += vt.y;
}
void TGVector2D::operator -= (const TGPoint& vt)
{
x -= vt.x;
y -= vt.y;
}
void TGVector2D::operator *= (double rate)
{
x *= rate;
y *= rate;
}
void TGVector2D::operator /= (double rate)
{
x /= rate;
y /= rate;
}
double TGVector2D::operator & (const TGPoint& vt) const
{
return x * vt.x + y * vt.y;
}
double TGVector2D::operator *(const TGPoint& vt) const
{
return x*vt.y-y*vt.x;
}
bool TGVector2D::operator == (const TGPoint& pt) const
{
return Equal2D(pt);
}
bool TGVector2D::operator != (const TGPoint& pt) const
{
return !Equal2D(pt);
}
void TGVector2D::GetLVertVector(TGPoint& vt) const
{
vt = TGVector2D(-y,x);
}
void TGVector2D::GetRVertVector(TGPoint& vt) const
{
vt = TGVector2D(y,-x);
}
bool TGVector2D::Normalize()
{
double len = Length();
if (UP_ZERO(len))
{
x /= len;
y /= len;
return true;
}
return false;
}
bool TGVector2D::IsParallel(const TGPoint& vt,bool bNormalized) const
{
double temp;
if (bNormalized)
{
temp = (*this)*vt;
}
else
{
TGVector2D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
temp = vt0*vt1;
}
return EQUAL_ZERO(temp);
}
bool TGVector2D::IsVectorLeft(const TGPoint& vt,bool bNormalized) const
{
double temp;
if (bNormalized)
{
temp = (*this)*vt;
}
else
{
TGVector2D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
temp = vt0*vt1;
}
return UP_ZERO(temp);
}
bool TGVector2D::IsVectorRight(const TGPoint& vt,bool bNormalized) const
{
double temp;
if (bNormalized)
{
temp = (*this)*vt;
}
else
{
TGVector2D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
temp = vt0*vt1;
}
return DOWN_ZERO(temp);
}
bool TGVector2D::IsVert(const TGPoint& vt,bool bNormalized) const
{
double temp;
if (bNormalized)
{
temp = (*this)&vt;
}
else
{
TGVector2D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
temp = vt0 & vt1;
}
return EQUAL_ZERO(temp);
}
bool TGVector2D::IsSameDirection(const TGPoint& vt,bool bNormalized) const
{
double temp;
if (bNormalized)
{
temp = (*this)&vt;
}
else
{
TGVector2D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
temp = vt0 & vt1;
}
return UP_ZERO(temp);
}
bool TGVector2D::IsReverseDirection(const TGPoint& vt,bool bNormalized) const
{
double temp;
if (bNormalized)
{
temp = (*this)& vt;
}
else
{
TGVector2D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
temp = vt0 & vt1;
}
return DOWN_ZERO(temp);
}
double TGVector2D::GetAngleWith(const TGPoint& vt,bool bNormalized) const
{
if (bNormalized)
{
double result = acos((*this)& vt);
return IsVectorLeft(vt,true) ? PI2 - result : result;
}
else
{
TGVector2D vt0(*this),vt1(vt);
vt0.Normalize();
vt1.Normalize();
double result = acos(vt0& vt1);
return vt0.IsVectorLeft(vt1,true) ? PI2 - result : result;
}
}
double TGVector2D::GetAngle() const
{
double result = acos(x / Length());
return y < 0 ? PI2 - result : result;
}