www.pudn.com > cad3d.zip > 3DPoint.h


// 3DPoint.h: interface for the C3DPoint class.
//
//////////////////////////////////////////////////////////////////////

#ifndef __3DPoint_h__
#define __3DPoint_h__

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include 

#include "defs.h"
#include "Check.h"
#include "stdInclude.h"

#include "3DMath/3DMath.h"
#include "3DMath/MathDefs.h"

class MATH3D_API C3DPoint
{
protected:

	math_real				m_dPt[4];//Point coordinats

public:

	C3DPoint(math_real x = 0, math_real y = 0, math_real z = 0, math_real w = 1);
	C3DPoint(const C3DPoint &other);
	C3DPoint(const math_real *other);
 
	void		Set(math_real x = 0, math_real y = 0, math_real z = 0, math_real w = 1) 
	{ 
		m_dPt[0] = x; m_dPt[1] = y; m_dPt[2] = z; m_dPt[3] = w; 
	} 

	void		Clear();//sets to (0,0,0,0);
	void		SetOrigin();//sets to (0,0,0,1);

	std::string	Dump(bool showMessage = true) const;
	std::string	DumpCoord(int i) const; //dumps specific coordinate 0 <= i <= 3

				math_real&		operator ()(const int i);
				const math_real&	operator ()(const int i) const;

				operator math_real* () {return m_dPt; }
				operator const math_real* () const {return m_dPt; }

	C3DPoint&	operator =  (const C3DPoint& rPt); 
	C3DPoint&	operator =  (const math_real *pPoint);
	bool		operator == (const C3DPoint& rPt) const;

	C3DPoint&	operator += (const C3DPoint& a);
	C3DPoint&	operator -= (const C3DPoint& a);
	C3DPoint&	operator *= (math_real k);
	C3DPoint&	operator /= (math_real k);

	C3DPoint&	Normalize();
	bool		IsNormalized() const;
	bool		IsVector() const;
	bool		IsIncident(const C3DPoint& rPt) const;
	bool		IsNull() const;

	//default class operation - poor performance - copy of the result
	C3DPoint	operator + (const C3DPoint& a) const;
	C3DPoint	operator - (const C3DPoint& a) const;
	C3DPoint	operator * (math_real k) const;
	C3DPoint	operator / (math_real k) const;
	math_real	operator * (const C3DPoint& a) const;
};
 
inline C3DPoint::C3DPoint(math_real x, math_real y, math_real z, math_real w)
{
	m_dPt[0] = x; m_dPt[1] = y; m_dPt[2] = z; m_dPt[3] = w;
}

inline C3DPoint::C3DPoint(const C3DPoint &other)
{
	memcpy(m_dPt,other.m_dPt,sizeof(math_real)*4);
}

//sets to (0,0,0,0)
inline void C3DPoint::Clear()
{
	memset(this, 0, sizeof(C3DPoint) );
}

//sets to (0,0,0,1);
inline void C3DPoint::SetOrigin()
{
	m_dPt[0] = m_dPt[1] = m_dPt[2] = 0;
	m_dPt[3] = 1;
}

inline 	C3DPoint::C3DPoint(const math_real *other)
{ 
	memcpy(m_dPt,other,sizeof(math_real)*4);
}

inline math_real& C3DPoint::operator ()(const int i) 
{
	CHECK(0 <= i);
	CHECK(i <= 3);
	return m_dPt[i];
}

inline 	const math_real&	C3DPoint::operator ()(const int i) const
{
	CHECK(0 <= i);
	CHECK(i <= 3);
	return m_dPt[i];
}
	
inline 	C3DPoint&	C3DPoint::operator += (const C3DPoint& a)
{
	m_dPt[0] += a.m_dPt[0];
	m_dPt[1] += a.m_dPt[1];
	m_dPt[2] += a.m_dPt[2];
	m_dPt[3] += a.m_dPt[3];
	return *this;
} 

inline 	C3DPoint&	C3DPoint::operator -= (const C3DPoint& a)
{
	m_dPt[0] -= a.m_dPt[0];
	m_dPt[1] -= a.m_dPt[1];
	m_dPt[2] -= a.m_dPt[2];
	m_dPt[3] -= a.m_dPt[3];
	return *this;
}

inline 	C3DPoint&	C3DPoint::operator *= (const math_real k)
{
	m_dPt[0] *= k;
	m_dPt[1] *= k;
	m_dPt[2] *= k;
	m_dPt[3] *= k;
	return *this;
}

inline 	C3DPoint&	C3DPoint::operator /= (const math_real k)
{
	CHECK(!IsZero(k));
	return (*this) *= (1/k);
}


inline C3DPoint C3DPoint::operator + (const C3DPoint& a) const
{
	C3DPoint res; 
	res.m_dPt[0] = m_dPt[0] + a.m_dPt[0];
	res.m_dPt[1] = m_dPt[1] + a.m_dPt[1];
	res.m_dPt[2] = m_dPt[2] + a.m_dPt[2];
	res.m_dPt[3] = m_dPt[3] + a.m_dPt[3];
	return res;
}

inline C3DPoint C3DPoint::operator - (const C3DPoint& a) const
{
	C3DPoint res; 
	res.m_dPt[0] = m_dPt[0] - a.m_dPt[0];
	res.m_dPt[1] = m_dPt[1] - a.m_dPt[1];
	res.m_dPt[2] = m_dPt[2] - a.m_dPt[2];
	res.m_dPt[3] = m_dPt[3] - a.m_dPt[3];
	return res;
}

inline C3DPoint C3DPoint::operator * (math_real k)  const
{
	return C3DPoint(k*m_dPt[0], k*m_dPt[1], k*m_dPt[2], k*m_dPt[3]);
}

inline C3DPoint C3DPoint::operator / (math_real k) const 
{
	CHECK(!IsZero(k));

	return C3DPoint( *this*(((math_real)1.0)/k) );
}

inline math_real	C3DPoint::operator * (const C3DPoint& a) const
{
	return (m_dPt[0]*a.m_dPt[0] + m_dPt[1]*a.m_dPt[1] + m_dPt[2]*a.m_dPt[2] + m_dPt[3]*a.m_dPt[3]);
}

inline C3DPoint&	C3DPoint::Normalize() 
{
	CHECK( !IsVector() );
	math_real k = (math_real)1.0/m_dPt[3];
	m_dPt[0] *= k;
	m_dPt[1] *= k;
	m_dPt[2] *= k;
	m_dPt[3] = (math_real)1.0;
	return *this;
}

inline bool C3DPoint::IsNormalized() const
{
	return IsEq(m_dPt[3], (math_real)1.0);
}

inline bool C3DPoint::IsVector() const
{
	return IsZero(m_dPt[3]);
}

inline C3DPoint& C3DPoint::operator =	(const C3DPoint& rPt)
{
	memcpy(m_dPt, rPt.m_dPt , sizeof(math_real)*4); 
	/* 
	m_dPt[0] = rPt.m_dPt[0]; 
	m_dPt[1] = rPt.m_dPt[1]; 
	m_dPt[2] = rPt.m_dPt[2]; 
	m_dPt[3] = rPt.m_dPt[3]; 
	*/ 
	return *this;
}
 
inline C3DPoint& C3DPoint::operator =	(const math_real *pPoint)
{
	memcpy(m_dPt, pPoint, sizeof(math_real)*4);
	return *this;
}

inline bool C3DPoint::operator == (const C3DPoint& rPt) const
{
	if ( IsEq(m_dPt[0], rPt(0)) && IsEq(m_dPt[1], rPt(1)) && 
	     IsEq(m_dPt[2], rPt(2)) && IsEq(m_dPt[3], rPt(3)) )
	{
		return true;
	}
	return false;
}

inline 	bool C3DPoint::IsIncident(const C3DPoint& rPt) const
{
	return C3DPoint(*this).Normalize() == C3DPoint(rPt).Normalize();
}

inline 	bool C3DPoint::IsNull() const
{
	return IsZero(m_dPt[0]) && IsZero(m_dPt[1]) && IsZero(m_dPt[2]) && IsZero(m_dPt[3]);
} 

#endif // __3DPoint_h__