Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef T_GEOMETRY_INCLUDED
Toshihiro Shimizu 890ddd
#define T_GEOMETRY_INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tutil.h"
Shinya Kitaoka 3bfa54
#include <cmath></cmath>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TGEOMETRY_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
/* 
Toshihiro Shimizu 890ddd
* This is an example of how to use the TPointT, the TRectT and the TAffine classes.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
/*!  The template class TPointT defines the x- and y-coordinates of a point.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
class TPointT
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	T x, y;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointT() : x(0), y(0){};
Toshihiro Shimizu 890ddd
	TPointT(T _x, T _y) : x(_x), y(_y){};
Toshihiro Shimizu 890ddd
	TPointT(const TPointT &point) : x(point.x), y(point.y){};
Toshihiro Shimizu 890ddd
	inline TPointT &operator=(const TPointT &a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		x = a.x;
Toshihiro Shimizu 890ddd
		y = a.y;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline TPointT &operator+=(const TPointT &a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		x += a.x;
Toshihiro Shimizu 890ddd
		y += a.y;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
	inline TPointT &operator-=(const TPointT &a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		x -= a.x;
Toshihiro Shimizu 890ddd
		y -= a.y;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
	inline TPointT operator+(const TPointT &a) const { return TPointT(x + a.x, y + a.y); };
Toshihiro Shimizu 890ddd
	inline TPointT operator-(const TPointT &a) const { return TPointT(x - a.x, y - a.y); };
Toshihiro Shimizu 890ddd
	inline TPointT operator-() const { return TPointT(-x, -y); };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator!=(const TPointT &p) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return x != p.x || y != p.y;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*! \relates TPointT  
Toshihiro Shimizu 890ddd
* Rotate a point 90 degrees (counterclockwise).
Toshihiro Shimizu 890ddd
\param p a point. 
Toshihiro Shimizu 890ddd
\return the rotated point
Toshihiro Shimizu 890ddd
\sa rotate270
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
inline TPointT<t> rotate90(const TPointT<t> &p) // counterclockwise</t></t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPointT<t>(-p.y, p.x);</t>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
/*! \relates TPointT  
Toshihiro Shimizu 890ddd
* Rotate a point 270 degrees (clockwise).
Toshihiro Shimizu 890ddd
\param p a point. 
Toshihiro Shimizu 890ddd
\return the rotated point
Toshihiro Shimizu 890ddd
\sa rotate90
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
inline TPointT<t> rotate270(const TPointT<t> &p) // clockwise</t></t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPointT<t>(p.y, -p.x);</t>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointT   
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
template <class t=""> // prodotto scalare</class>
Toshihiro Shimizu 890ddd
inline T operator*(const TPointT<t> &a, const TPointT<t> &b)</t></t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return a.x * b.x + a.y * b.y;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Shinya Kitaoka 3bfa54
inline std::ostream &operator<<(std::ostream &out, const TPointT<t> &p)</t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << "(" << p.x << ", " << p.y << ")";
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TPointT<int> TPoint, TPointI;</int>
Toshihiro Shimizu 890ddd
typedef TPointT<double> TPointD;</double>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
template class DVAPI TPointT<int>;</int>
Toshihiro Shimizu 890ddd
template class DVAPI TPointT<double>;</double>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
inline bool operator==(const TPointT<t> &p0, const TPointT<t> &p1)</t></t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return p0.x == p1.x && p0.y == p1.y;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!\relates TPointT
Toshihiro Shimizu 890ddd
inline TPoint operator*(int a, const TPoint &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPoint(a * p.x, a * p.y);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!\relates TPointT
Toshihiro Shimizu 890ddd
inline TPoint operator*(const TPoint &p, int a)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPoint(a * p.x, a * p.y);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!\relates TPointT
Toshihiro Shimizu 890ddd
inline TPointD operator*(double a, const TPointD &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPointD(a * p.x, a * p.y);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!\relates TPointT
Toshihiro Shimizu 890ddd
inline TPointD operator*(const TPointD &p, double a)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPointD(a * p.x, a * p.y);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointT   
Toshihiro Shimizu 890ddd
This helper function returns the square of the absolute value of the specified point (a TPointI)
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline int norm2(const TPointI &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return p.x * p.x + p.y * p.y;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointT   
Toshihiro Shimizu 890ddd
This helper function returns the square of the absolute value of the specified point (a TPointD)
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline double norm2(const TPointD &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return p.x * p.x + p.y * p.y;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointT  
Toshihiro Shimizu 890ddd
This helper function returns the absolute value of the specified point 
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline double norm(const TPointD &p)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	return std::sqrt(norm2(p));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointT  
Toshihiro Shimizu 890ddd
This helper function returns the normalized version of the specified point 
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline TPointD normalize(const TPointD &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double n = norm(p);
Toshihiro Shimizu 890ddd
	assert(n != 0.0);
Toshihiro Shimizu 890ddd
	return (1.0 / n) * p;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointT 
Toshihiro Shimizu 890ddd
This helper function converts a TPoint (TPointT<int>) into a TPointD</int>
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline TPointD convert(const TPoint &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPointD(p.x, p.y);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointT 
Toshihiro Shimizu 890ddd
This helper function converts a TPointD (TPointT<double>) into a TPoint</double>
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline TPoint convert(const TPointD &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPoint(tround(p.x), tround(p.y));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointT  
Toshihiro Shimizu 890ddd
This helper function returns the square of the distance between two points  
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline double tdistance2(const TPointD &p1, const TPointD &p2)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return norm2(p2 - p1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline bool operator==(const TPointD &p0, const TPointD &p1)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return tdistance2(p0, p1) < TConsts::epsilon * TConsts::epsilon;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointT  
Toshihiro Shimizu 890ddd
This helper function returns the distance between two points  
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline double tdistance(const TPointD &p1, const TPointD &p2)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return norm(p2 - p1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
the cross product
Toshihiro Shimizu 890ddd
\relates TPointT
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline double cross(const TPointD &a, const TPointD &b)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return a.x * b.y - a.y * b.x;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
the cross product
Toshihiro Shimizu 890ddd
\relates TPoint
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline int cross(const TPoint &a, const TPoint &b)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return a.x * b.y - a.y * b.x;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
returns the angle of the point p in polar coordinates
Toshihiro Shimizu 890ddd
n.b atan(-y) = -pi/2, atan(x) = 0, atan(y) = pi/2, atan(-x) = pi
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline double atan(const TPointD &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return atan2(p.y, p.x);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
class DVAPI T3DPointT
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	T x, y, z;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	T3DPointT()
Toshihiro Shimizu 890ddd
		: x(0), y(0), z(0) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	T3DPointT(T _x, T _y, T _z)
Toshihiro Shimizu 890ddd
		: x(_x), y(_y), z(_z) {}
Toshihiro Shimizu 890ddd
	T3DPointT(const TPointT<t> &_p, T _z)</t>
Toshihiro Shimizu 890ddd
		: x(_p.x), y(_p.y), z(_z) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	T3DPointT(const T3DPointT &_p)
Toshihiro Shimizu 890ddd
		: x(_p.x), y(_p.y), z(_p.z) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline T3DPointT &operator=(const T3DPointT &a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		x = a.x;
Toshihiro Shimizu 890ddd
		y = a.y;
Toshihiro Shimizu 890ddd
		z = a.z;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline T3DPointT &operator+=(const T3DPointT &a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		x += a.x;
Toshihiro Shimizu 890ddd
		y += a.y;
Toshihiro Shimizu 890ddd
		z += a.z;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline T3DPointT &operator-=(const T3DPointT &a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		x -= a.x;
Toshihiro Shimizu 890ddd
		y -= a.y;
Toshihiro Shimizu 890ddd
		z -= a.z;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline T3DPointT operator+(const T3DPointT &a) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return T3DPointT(x + a.x, y + a.y, z + a.z);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline T3DPointT operator-(const T3DPointT &a) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return T3DPointT(x - a.x, y - a.y, z - a.z);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline T3DPointT operator-() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return T3DPointT(-x, -y, -z);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator==(const T3DPointT &p) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return x == p.x && y == p.y && z == p.z;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator!=(const T3DPointT &p) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return x != p.x || y != p.y || z != p.z;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Shinya Kitaoka 3bfa54
inline std::ostream &operator<<(std::ostream &out, const T3DPointT<t> &p)</t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << "(" << p.x << ", " << p.y << ", " << p.z << ")";
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef T3DPointT<int> T3DPoint, T3DPointI;</int>
Toshihiro Shimizu 890ddd
typedef T3DPointT<double> T3DPointD;</double>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
template class DVAPI T3DPointT<int>;</int>
Toshihiro Shimizu 890ddd
template class DVAPI T3DPointT<double>;</double>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!\relates T3DPointT
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
inline T3DPointT<t> operator*(T a, const T3DPointT<t> &p)</t></t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return T3DPointT<t>(a * p.x, a * p.y, a * p.z);</t>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!\relates TPointT
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
inline T3DPointT<t> operator*(const T3DPointT<t> &p, T a)</t></t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return T3DPointT<t>(a * p.x, a * p.y, a * p.z);</t>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointT   
Toshihiro Shimizu 890ddd
This helper function returns the square of the absolute value of the specified point (a TPointI)
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
inline T norm2(const T3DPointT<t> &p)</t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return p.x * p.x + p.y * p.y + p.z * p.z;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
inline T norm(const T3DPointT<t> &p)</t>
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	return std::sqrt(norm2(p));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline T3DPointD normalize(const T3DPointD &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double n = norm(p);
Toshihiro Shimizu 890ddd
	assert(n != 0.0);
Toshihiro Shimizu 890ddd
	return (1.0 / n) * p;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline T3DPointD convert(const T3DPoint &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return T3DPointD(p.x, p.y, p.z);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline T3DPoint convert(const T3DPointD &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return T3DPoint(tround(p.x), tround(p.y), tround(p.z));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
inline T tdistance(const T3DPointT<t> &p1, const T3DPointT<t> &p2)</t></t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return norm<t>(p2 - p1);</t>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
inline T tdistance2(const T3DPointT<t> &p1, const T3DPointT<t> &p2)</t></t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return norm2<t>(p2 - p1);</t>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
inline T3DPointT<t> cross(const T3DPointT<t> &a, const T3DPointT<t> &b)</t></t></t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return T3DPointT<t>(a.y * b.z - b.y * a.z,</t>
Toshihiro Shimizu 890ddd
						a.z * b.x - b.z * a.x,
Toshihiro Shimizu 890ddd
						a.x * b.y - b.x * a.y);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
TThickPoint describe a thick point.
Toshihiro Shimizu 890ddd
\relates TThickQuadratic, TThickCubic
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
class DVAPI TThickPoint : public TPointD
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	double thick;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThickPoint()
Toshihiro Shimizu 890ddd
		: TPointD(), thick(0) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThickPoint(double _x, double _y, double _thick = 0)
Toshihiro Shimizu 890ddd
		: TPointD(_x, _y), thick(_thick) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThickPoint(const TPointD &_p, double _thick = 0)
Toshihiro Shimizu 890ddd
		: TPointD(_p.x, _p.y), thick(_thick) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThickPoint(const T3DPointD &_p)
Toshihiro Shimizu 890ddd
		: TPointD(_p.x, _p.y), thick(_p.z) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThickPoint(const TThickPoint &_p)
Toshihiro Shimizu 890ddd
		: TPointD(_p.x, _p.y), thick(_p.thick) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline TThickPoint &operator=(const TThickPoint &a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		x = a.x;
Toshihiro Shimizu 890ddd
		y = a.y;
Toshihiro Shimizu 890ddd
		thick = a.thick;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline TThickPoint &operator+=(const TThickPoint &a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		x += a.x;
Toshihiro Shimizu 890ddd
		y += a.y;
Toshihiro Shimizu 890ddd
		thick += a.thick;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline TThickPoint &operator-=(const TThickPoint &a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		x -= a.x;
Toshihiro Shimizu 890ddd
		y -= a.y;
Toshihiro Shimizu 890ddd
		thick -= a.thick;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline TThickPoint operator+(const TThickPoint &a) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return TThickPoint(x + a.x, y + a.y, thick + a.thick);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline TThickPoint operator-(const TThickPoint &a) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return TThickPoint(x - a.x, y - a.y, thick - a.thick);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline TThickPoint operator-() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return TThickPoint(-x, -y, -thick);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator==(const TThickPoint &p) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return x == p.x && y == p.y && thick == p.thick;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator!=(const TThickPoint &p) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return x != p.x || y != p.y || thick != p.thick;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline double operator*(const TThickPoint &a, const TThickPoint &b)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return a.x * b.x + a.y * b.y + a.thick * b.thick;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline TThickPoint operator*(double a, const TThickPoint &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TThickPoint(a * p.x, a * p.y, a * p.thick);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline TThickPoint operator*(const TThickPoint &p, double a)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TThickPoint(a * p.x, a * p.y, a * p.thick);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TPointD 
Toshihiro Shimizu 890ddd
This helper function converts a TThickPoint into a TPointD
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline TPointD convert(const TThickPoint &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPointD(p.x, p.y);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TThickPoint  
Toshihiro Shimizu 890ddd
This helper function returns the square of the distance between two thick points  
Toshihiro Shimizu 890ddd
(only x and y are used)
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline double tdistance2(const TThickPoint &p1, const TThickPoint &p2)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return norm2(convert(p2 - p1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TThickPoint  
Toshihiro Shimizu 890ddd
This helper function returns the distance between two thick  points  
Toshihiro Shimizu 890ddd
(only x and y are used)
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline double tdistance(const TThickPoint &p1, const TThickPoint &p2)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return norm(convert(p2 - p1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
inline std::ostream &operator<<(std::ostream &out, const TThickPoint &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << "(" << p.x << ", " << p.y << ", " << p.thick << ")";
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
//!	This is a template class representing a generic vector in a plane, i.e. a point.
Toshihiro Shimizu 890ddd
/*!	
Toshihiro Shimizu 890ddd
		It is a data structure with two objects in it representing coordinate of the point and 
Toshihiro Shimizu 890ddd
		the basic operations on it.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
class DVAPI TDimensionT
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	T lx, ly;
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Constructs a vector of two elements, i.e. a point in a plane.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TDimensionT() : lx(), ly() {}
Toshihiro Shimizu 890ddd
	TDimensionT(T _lx, T _ly) : lx(_lx), ly(_ly) {}
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Copy constructor.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TDimensionT(const TDimensionT &d) : lx(d.lx), ly(d.ly) {}
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Vector addition.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TDimensionT &operator+=(TDimensionT a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		lx += a.lx;
Toshihiro Shimizu 890ddd
		ly += a.ly;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Difference of two vectors.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TDimensionT &operator-=(TDimensionT a)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		lx -= a.lx;
Toshihiro Shimizu 890ddd
		ly -= a.ly;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Addition of two vectors.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TDimensionT operator+(TDimensionT a) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TDimensionT ris(*this);
Toshihiro Shimizu 890ddd
		return ris += a;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Vector difference.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TDimensionT operator-(TDimensionT a) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TDimensionT ris(*this);
Toshihiro Shimizu 890ddd
		return ris -= a;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Compare vectors and returns \e true if are equals element by element.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	bool operator==(const TDimensionT &d) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return lx == d.lx && ly == d.ly;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Compare vectors and returns \e true if are not equals element by element.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	bool operator!=(const TDimensionT &d) const { return !operator==(d); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TDimensionT<int> TDimension, TDimensionI;</int>
Toshihiro Shimizu 890ddd
typedef TDimensionT<double> TDimensionD;</double>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Shinya Kitaoka 3bfa54
inline std::ostream &operator<<(std::ostream &out, const TDimensionT<t> &p)</t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << "(" << p.lx << ", " << p.ly << ")";
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
template class DVAPI TDimensionT<int>;</int>
Toshihiro Shimizu 890ddd
template class DVAPI TDimensionT<double>;</double>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! Specifies the corners of a rectangle.
Toshihiro Shimizu 890ddd
/*!\arg \a x0 specifies the x-coordinate of the bottom-left corner of a rectangle.
Toshihiro Shimizu 890ddd
\arg \a y0 specifies the y-coordinate of the bottom-left corner of a rectangle.
Toshihiro Shimizu 890ddd
\arg \a x1 specifies the x-coordinate of the upper-right corner of a rectangle.
Toshihiro Shimizu 890ddd
\arg \a y1 specifies the y-coordinate of the upper-right corner of a rectangle.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
class DVAPI TRectT
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	/*! if x0>x1 || y0>y1 then rect is empty
Toshihiro Shimizu 890ddd
    if x0==y1 && y0==y1 and rect is a  TRectD then rect is empty */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	T x0, y0;
Toshihiro Shimizu 890ddd
	T x1, y1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! makes an empty rect */
Toshihiro Shimizu 890ddd
	TRectT();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRectT(T _x0, T _y0, T _x1, T _y1)
Toshihiro Shimizu 890ddd
		: x0(_x0), y0(_y0), x1(_x1), y1(_y1){};
Toshihiro Shimizu 890ddd
	TRectT(const TRectT &rect)
Toshihiro Shimizu 890ddd
		: x0(rect.x0), y0(rect.y0), x1(rect.x1), y1(rect.y1){};
Toshihiro Shimizu 890ddd
	TRectT(const TPointT<t> &p0, const TPointT<t> &p1) // non importa l'ordine</t></t>
Shinya Kitaoka 12c444
		: x0(std::min((T)p0.x, (T)p1.x)),
Shinya Kitaoka 12c444
		  y0(std::min((T)p0.y, (T)p1.y)),
Shinya Kitaoka 12c444
		  x1(std::max((T)p0.x, (T)p1.x)),
Shinya Kitaoka 12c444
		  y1(std::max((T)p0.y, (T)p1.y)){};
Toshihiro Shimizu 890ddd
	TRectT(const TPointT<t> &bottomLeft, const TDimensionT<t> &d);</t></t>
Toshihiro Shimizu 890ddd
	TRectT(const TDimensionT<t> &d);</t>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void empty();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! TRectD is empty if and only if (x0>x1 || y0>y1) || (x0==y1 && y0==y1); 
Toshihiro Shimizu 890ddd
    TRectI  is empty if x0>x1 || y0>y1 */
Toshihiro Shimizu 890ddd
	bool isEmpty() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	T getLx() const;
Toshihiro Shimizu 890ddd
	T getLy() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDimensionT<t> getSize() const</t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return TDimensionT<t>(getLx(), getLy());</t>
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointT<t> getP00() const { return TPointT<t>(x0, y0); };</t></t>
Toshihiro Shimizu 890ddd
	TPointT<t> getP10() const { return TPointT<t>(x1, y0); };</t></t>
Toshihiro Shimizu 890ddd
	TPointT<t> getP01() const { return TPointT<t>(x0, y1); };</t></t>
Toshihiro Shimizu 890ddd
	TPointT<t> getP11() const { return TPointT<t>(x1, y1); };</t></t>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the union of two source rectangles.
Toshihiro Shimizu 890ddd
	/*!The union is the smallest rectangle that contains both source rectangles. 
Toshihiro Shimizu 890ddd
    */
Toshihiro Shimizu 890ddd
	TRectT<t> operator+(const TRectT<t> &rect) const</t></t>
Toshihiro Shimizu 890ddd
	{ // unione
Toshihiro Shimizu 890ddd
		if (isEmpty())
Toshihiro Shimizu 890ddd
			return rect;
Toshihiro Shimizu 890ddd
		else if (rect.isEmpty())
Toshihiro Shimizu 890ddd
			return *this;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			return TRectT<t>(</t>
Shinya Kitaoka 12c444
				std::min((T)x0, (T)rect.x0), std::min((T)y0, (T)rect.y0),
Shinya Kitaoka 12c444
				std::max((T)x1, (T)rect.x1), std::max((T)y1, (T)rect.y1));
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
	TRectT<t> &operator+=(const TRectT<t> &rect)</t></t>
Toshihiro Shimizu 890ddd
	{ // unione
Toshihiro Shimizu 890ddd
		return *this = *this + rect;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
	TRectT<t> &operator*=(const TRectT<t> &rect)</t></t>
Toshihiro Shimizu 890ddd
	{ // intersezione
Toshihiro Shimizu 890ddd
		return *this = *this * rect;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!Returns the intersection of two existing rectangles. 
Toshihiro Shimizu 890ddd
    
Toshihiro Shimizu 890ddd
      The intersection is the largest rectangle contained in both existing rectangles.
Toshihiro Shimizu 890ddd
    */
Toshihiro Shimizu 890ddd
	TRectT<t> operator*(const TRectT<t> &rect) const</t></t>
Toshihiro Shimizu 890ddd
	{ // intersezione
Toshihiro Shimizu 890ddd
		if (isEmpty() || rect.isEmpty())
Toshihiro Shimizu 890ddd
			return TRectT<t>();</t>
Toshihiro Shimizu 890ddd
		else if (rect.x1 < x0 || x1 < rect.x0 || rect.y1 < y0 || y1 < rect.y0)
Toshihiro Shimizu 890ddd
			return TRectT<t>();</t>
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			return TRectT<t>(</t>
Shinya Kitaoka 12c444
				std::max((T)x0, (T)rect.x0), std::max((T)y0, (T)rect.y0),
Shinya Kitaoka 12c444
				std::min((T)x1, (T)rect.x1), std::min((T)y1, (T)rect.y1));
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRectT<t> &operator+=(const TPointT<t> &p)</t></t>
Toshihiro Shimizu 890ddd
	{ // spostamento
Toshihiro Shimizu 890ddd
		x0 += p.x;
Toshihiro Shimizu 890ddd
		y0 += p.y;
Toshihiro Shimizu 890ddd
		x1 += p.x;
Toshihiro Shimizu 890ddd
		y1 += p.y;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
	TRectT<t> &operator-=(const TPointT<t> &p)</t></t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		x0 -= p.x;
Toshihiro Shimizu 890ddd
		y0 -= p.y;
Toshihiro Shimizu 890ddd
		x1 -= p.x;
Toshihiro Shimizu 890ddd
		y1 -= p.y;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
	TRectT<t> operator+(const TPointT<t> &p) const</t></t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRectT<t> ris(*this);</t>
Toshihiro Shimizu 890ddd
		return ris += p;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
	TRectT<t> operator-(const TPointT<t> &p) const</t></t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRectT<t> ris(*this);</t>
Toshihiro Shimizu 890ddd
		return ris -= p;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator==(const TRectT<t> &r) const</t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return x0 == r.x0 && y0 == r.y0 && x1 == r.x1 && y1 == r.y1;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator!=(const TRectT<t> &r) const</t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return x0 != r.x0 || y0 != r.y0 || x1 != r.x1 || y1 != r.y1;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool contains(const TPointT<t> &p) const</t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return x0 <= p.x && p.x <= x1 && y0 <= p.y && p.y <= y1;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool contains(const TRectT<t> &b) const</t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return x0 <= b.x0 && x1 >= b.x1 && y0 <= b.y0 && y1 >= b.y1;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool overlaps(const TRectT<t> &b) const</t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return x0 <= b.x1 && x1 >= b.x0 &&
Toshihiro Shimizu 890ddd
			   y0 <= b.y1 && y1 >= b.y0;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRectT<t> enlarge(T dx, T dy) const</t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (isEmpty())
Toshihiro Shimizu 890ddd
			return *this;
Toshihiro Shimizu 890ddd
		return TRectT<t>(x0 - dx, y0 - dy, x1 + dx, y1 + dy);</t>
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRectT<t> enlarge(T d) const { return enlarge(d, d); };</t>
Toshihiro Shimizu 890ddd
	TRectT<t> enlarge(TDimensionT<t> d) const</t></t>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return enlarge(d.lx, d.ly);
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TRectT<int> TRect, TRectI;</int>
Toshihiro Shimizu 890ddd
typedef TRectT<double> TRectD;</double>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
template class DVAPI TRectT<int>;</int>
Toshihiro Shimizu 890ddd
template class DVAPI TRectT<double>;</double>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// check this, not final version
Toshihiro Shimizu 890ddd
/*! 
Toshihiro Shimizu 890ddd
\relates TRectT
Toshihiro Shimizu 890ddd
Convert a TRectD into a TRect
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline TRect convert(const TRectD &r)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TRect(
Toshihiro Shimizu 890ddd
		(int)(r.x0 + 0.5), (int)(r.y0 + 0.5),
Toshihiro Shimizu 890ddd
		(int)(r.x1 + 0.5), (int)(r.y1 + 0.5));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
/*! 
Toshihiro Shimizu 890ddd
\relates TRectT  
Toshihiro Shimizu 890ddd
Convert a TRect into a TRectD
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline TRectD convert(const TRect &r)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TRectD(r.x0, r.y0, r.x1, r.y1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// template?
Toshihiro Shimizu 890ddd
/*! 
Toshihiro Shimizu 890ddd
\relates TRectT 
Toshihiro Shimizu 890ddd
\relates TPointT  
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline TRectD boundingBox(const TPointD &p0, const TPointD &p1)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 12c444
	return TRectD(
Shinya Kitaoka 12c444
		std::min(p0.x, p1.x), std::min(p0.y, p1.y),
Shinya Kitaoka 12c444
		std::max(p0.x, p1.x), std::max(p0.y, p1.y));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TRectT 
Toshihiro Shimizu 890ddd
\relates TPointT  
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline TRectD boundingBox(
Toshihiro Shimizu 890ddd
	const TPointD &p0,
Toshihiro Shimizu 890ddd
	const TPointD &p1,
Toshihiro Shimizu 890ddd
	const TPointD &p2)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 12c444
	return TRectD(
Shinya Kitaoka 12c444
		std::min({p0.x, p1.x, p2.x}), std::min({p0.y, p1.y, p2.y}),
Shinya Kitaoka 12c444
		std::max({p0.x, p1.x, p2.x}), std::max({p0.y, p1.y, p2.y}));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
\relates TRectT 
Toshihiro Shimizu 890ddd
\relates TPointT  
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
inline TRectD boundingBox(
Toshihiro Shimizu 890ddd
	const TPointD &p0,
Toshihiro Shimizu 890ddd
	const TPointD &p1,
Toshihiro Shimizu 890ddd
	const TPointD &p2,
Toshihiro Shimizu 890ddd
	const TPointD &p3)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TRectD(
Shinya Kitaoka 12c444
		std::min({p0.x, p1.x, p2.x, p3.x}),
Shinya Kitaoka 12c444
		std::min({p0.y, p1.y, p2.y, p3.y}),
Shinya Kitaoka 12c444
		std::max({p0.x, p1.x, p2.x, p3.x}),
Shinya Kitaoka 12c444
		std::max({p0.y, p1.y, p2.y, p3.y}));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TRectT<int>::TRectT() : x0(0), y0(0), x1(-1), y1(-1) {}</int>
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TRectT<int>::TRectT(const TPointT<int> &bottomLeft, const TDimensionT<int> &d)</int></int></int>
Toshihiro Shimizu 890ddd
	: x0(bottomLeft.x), y0(bottomLeft.y), x1(bottomLeft.x + d.lx - 1), y1(bottomLeft.y + d.ly - 1){};
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TRectT<int>::TRectT(const TDimensionT<int> &d)</int></int>
Toshihiro Shimizu 890ddd
	: x0(0), y0(0), x1(d.lx - 1), y1(d.ly - 1){};
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline bool TRectT<int>::isEmpty() const { return x0 > x1 || y0 > y1; }</int>
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline void TRectT<int>::empty()</int>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	x0 = y0 = 0;
Toshihiro Shimizu 890ddd
	x1 = y1 = -1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline int TRectT<int>::getLx() const { return x1 >= x0 ? x1 - x0 + 1 : 0; }</int>
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline int TRectT<int>::getLy() const { return y1 >= y0 ? y1 - y0 + 1 : 0; }</int>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TRectT<double>::TRectT() : x0(0), y0(0), x1(0), y1(0) {}</double>
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TRectT<double>::TRectT(const TPointT<double> &bottomLeft, const TDimensionT<double> &d)</double></double></double>
Toshihiro Shimizu 890ddd
	: x0(bottomLeft.x), y0(bottomLeft.y), x1(bottomLeft.x + d.lx), y1(bottomLeft.y + d.ly){};
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TRectT<double>::TRectT(const TDimensionT<double> &d)</double></double>
Toshihiro Shimizu 890ddd
	: x0(0.0), y0(0.0), x1(d.lx), y1(d.ly){};
Toshihiro Shimizu 890ddd
template <>
Michał Janiszewski b1cc3c
inline bool TRectT<double>::isEmpty() const { return (x0 == x1 && y0 == y1) || x0 > x1 || y0 > y1; }</double>
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline void TRectT<double>::empty() { x0 = y0 = x1 = y1 = 0; }</double>
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline double TRectT<double>::getLx() const { return x1 >= x0 ? x1 - x0 : 0; }</double>
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline double TRectT<double>::getLy() const { return y1 >= y0 ? y1 - y0 : 0; }</double>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline TRectD &operator*=(TRectD &rect, double factor)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	rect.x0 *= factor;
Toshihiro Shimizu 890ddd
	rect.y0 *= factor;
Toshihiro Shimizu 890ddd
	rect.x1 *= factor;
Toshihiro Shimizu 890ddd
	rect.y1 *= factor;
Toshihiro Shimizu 890ddd
	return rect;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline TRectD operator*(const TRectD &rect, double factor)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRectD result(rect);
Toshihiro Shimizu 890ddd
	return result *= factor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline TRectD &operator/=(TRectD &rect, double factor)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(factor != 0.0);
Toshihiro Shimizu 890ddd
	return rect *= (1.0 / factor);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline TRectD operator/(const TRectD &rect, double factor)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(factor != 0.0);
Toshihiro Shimizu 890ddd
	TRectD result(rect);
Toshihiro Shimizu 890ddd
	return result *= 1.0 / factor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Shinya Kitaoka 3bfa54
inline std::ostream &operator<<(std::ostream &out, const TRectT<t> &r)</t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << "(" << r.x0 << "," << r.y0
Toshihiro Shimizu 890ddd
			   << ";" << r.x1 << "," << r.y1 << ")";
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace TConsts
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
extern DVVAR const TPointD napd;
Toshihiro Shimizu 890ddd
extern DVVAR const TPoint nap;
Toshihiro Shimizu 890ddd
extern DVVAR const T3DPointD nap3d;
Toshihiro Shimizu 890ddd
extern DVVAR const TThickPoint natp;
Toshihiro Shimizu 890ddd
extern DVVAR const TRectD infiniteRectD;
Toshihiro Shimizu 890ddd
extern DVVAR const TRectI infiniteRectI;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
//!This is the base class for the affine transformations.
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
		This class performs basic manipulations of affine transformations.
Toshihiro Shimizu 890ddd
		An affine transformation is a linear transformation followed by a translation.
Toshihiro Shimizu 890ddd
		

Toshihiro Shimizu 890ddd
		\f$ 	x \mapsto \bf{A} x + b	\f$
Toshihiro Shimizu 890ddd
		

Toshihiro Shimizu 890ddd
		

Toshihiro Shimizu 890ddd
		\f$ \bf{A} \f$ is a \f$ 2X2 \f$ matrix.
Toshihiro Shimizu 890ddd
		In a matrix notation:
Toshihiro Shimizu 890ddd
		

\f$ \left(\begin{array}{c} \vec{y} \\ 1 \end{array}\right) =

Toshihiro Shimizu 890ddd
		\left( \begin{array}{cc} \bf{A} & \vec{b} \\ \vec{0} & 1  \end{array}\right)
Toshihiro Shimizu 890ddd
		\left(\begin{array}{c}\vec{x} \\ 1 \end{array} \right) \f$ 

Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
class DVAPI TAffine
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	double a11, a12, a13;
Toshihiro Shimizu 890ddd
	double a21, a22, a23;
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		By default the object is initialized with a null matrix and a null translation vector. 
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TAffine() : a11(1.0), a12(0.0), a13(0.0),
Toshihiro Shimizu 890ddd
				a21(0.0), a22(1.0), a23(0.0){};
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Initializes the internal matrix and vector of translation with the user values.		
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TAffine(
Toshihiro Shimizu 890ddd
		double p11, double p12, double p13,
Toshihiro Shimizu 890ddd
		double p21, double p22, double p23) : a11(p11), a12(p12), a13(p13),
Toshihiro Shimizu 890ddd
											  a21(p21), a22(p22), a23(p23){};
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Copy constructor.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TAffine(const TAffine &a) : a11(a.a11), a12(a.a12), a13(a.a13),
Toshihiro Shimizu 890ddd
								a21(a.a21), a22(a.a22), a23(a.a23){};
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Assignment operator.
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	TAffine &operator=(const TAffine &a);
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    a11 = a.a11; a12 = a.a12; a13 = a.a13;
Toshihiro Shimizu 890ddd
    a21 = a.a21; a22 = a.a22; a23 = a.a23;
Toshihiro Shimizu 890ddd
    return *this;
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Matrix multiplication.
Toshihiro Shimizu 890ddd
		

\f$\left(\begin{array}{cc}\bf{A}&\vec{a}\\\vec{0}&1\end{array}\right)

Toshihiro Shimizu 890ddd
		\left(\begin{array}{cc}\bf{B}&\vec{b}\\\vec{0}&1\end{array}\right)\f$

Toshihiro Shimizu 890ddd
			
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	TAffine operator*(const TAffine &b) const;
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    return TAffine (
Toshihiro Shimizu 890ddd
      a11 * b.a11 + a12 * b.a21,
Toshihiro Shimizu 890ddd
      a11 * b.a12 + a12 * b.a22,
Toshihiro Shimizu 890ddd
      a11 * b.a13 + a12 * b.a23 + a13,
Toshihiro Shimizu 890ddd
      
Toshihiro Shimizu 890ddd
      a21 * b.a11 + a22 * b.a21,
Toshihiro Shimizu 890ddd
      a21 * b.a12 + a22 * b.a22,
Toshihiro Shimizu 890ddd
      a21 * b.a13 + a22 * b.a23 + a23);
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TAffine operator*=(const TAffine &b);
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    return *this = *this * b;
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Retruns the inverse tansformation as:
Toshihiro Shimizu 890ddd
		

\f$\left(\begin{array}{ccc}\bf{A}^{-1}&-\bf{A}^{-1}&\vec{b}\\\vec{0}&\vec{0}&1\end{array}\right)\f$

Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TAffine inv() const;
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    if(a12 == 0.0 && a21 == 0.0)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      assert(a11 != 0.0);
Toshihiro Shimizu 890ddd
      assert(a22 != 0.0);
Toshihiro Shimizu 890ddd
      double inv_a11 = 1.0/a11;
Toshihiro Shimizu 890ddd
      double inv_a22 = 1.0/a22;
Toshihiro Shimizu 890ddd
      return TAffine(inv_a11,0, -a13 * inv_a11, 
Toshihiro Shimizu 890ddd
        0,inv_a22, -a23 * inv_a22);
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
    else if(a11 == 0.0 && a22 == 0.0)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      assert(a12 != 0.0);
Toshihiro Shimizu 890ddd
      assert(a21 != 0.0);
Toshihiro Shimizu 890ddd
      double inv_a21 = 1.0/a21;
Toshihiro Shimizu 890ddd
      double inv_a12 = 1.0/a12;
Toshihiro Shimizu 890ddd
      return TAffine(0, inv_a21, -a23 * inv_a21, 
Toshihiro Shimizu 890ddd
        inv_a12, 0, -a13 * inv_a12);
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
    else
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      double d = 1./det();  
Toshihiro Shimizu 890ddd
      return TAffine(a22*d,-a12*d, (a12*a23-a22*a13)*d, 
Toshihiro Shimizu 890ddd
        -a21*d, a11*d, (a21*a13-a11*a23)*d);
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double det() const;
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp{
Toshihiro Shimizu 890ddd
    return a11*a22-a12*a21;
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Returns \e true if all elements are equals.	
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	bool operator==(const TAffine &a) const;
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    return a11==a.a11 && a12==a.a12 && a13==a.a13 &&
Toshihiro Shimizu 890ddd
      a21==a.a21 && a22==a.a22 && a23==a.a23;
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Returns \e true if at least one element is different.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator!=(const TAffine &a) const;
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    return a11!=a.a11 || a12!=a.a12 || a13!=a.a13 ||
Toshihiro Shimizu 890ddd
      a21!=a.a21 || a22!=a.a22 || a23!=a.a23;
Toshihiro Shimizu 890ddd
  }; 
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Returns \e true if the transformation is an identity, 
Toshihiro Shimizu 890ddd
		i.e in the error limit \e err leaves the vectors unchanged.	
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isIdentity(double err = 1.e-8) const;
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    return ((a11-1.0)*(a11-1.0)+(a22-1.0)*(a22-1.0)+
Toshihiro Shimizu 890ddd
      a12*a12+a13*a13+a21*a21+a23*a23) < err;
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Returns \e true if in the error limits \e err \f$\bf{A}\f$ is the identity matrix.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isTranslation(double err = 1.e-8) const;
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    return ((a11-1.0)*(a11-1.0)+(a22-1.0)*(a22-1.0)+
Toshihiro Shimizu 890ddd
      a12*a12+a21*a21) < err;
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Returns \e true if in the error limits the matrix \f$\bf{A}\f$ is of the form:
Toshihiro Shimizu 890ddd
		

\f$\left(\begin{array}{cc}a&b\\-b&a\end{array}\right)\f$

.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isIsotropic(double err = 1.e-8) const;
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	  return areAlmostEqual(a11, a22, err) && areAlmostEqual(a12, -a21, err);
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Retruns the transfomed point.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TPointD operator*(const TPointD &p) const;
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    return TPointD(p.x*a11+p.y*a12+a13, p.x*a21+p.y*a22+a23);
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! 
Toshihiro Shimizu 890ddd
		Retruns the transformed box of the bounding box.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TRectD operator*(const TRectD &rect) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Returns a translated matrix that change the vector (u,v) in (x,y).
Toshihiro Shimizu 890ddd
	\n	It returns a matrix of the form:
Toshihiro Shimizu 890ddd
		

\f$\left(\begin{array}{ccc}\bf{A}&\vec{x}-\bf{A} \vec{u}\\

Toshihiro Shimizu 890ddd
		\vec{0}&1\end{array}\right)\f$

Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TAffine place(double u, double v, double x, double y) const;
Shinya Kitaoka 12c444
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		See above.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TAffine place(const TPointD &pIn, const TPointD &pOut) const;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//template <>
Toshihiro Shimizu 890ddd
inline bool areAlmostEqual(const TPointD &a, const TPointD &b, double err = TConsts::epsilon)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return tdistance2(a, b) < err * err;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//template <>
Toshihiro Shimizu 890ddd
inline bool areAlmostEqual(const TRectD &a, const TRectD &b, double err = TConsts::epsilon)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return areAlmostEqual(a.getP00(), b.getP00(), err) &&
Toshihiro Shimizu 890ddd
		   areAlmostEqual(a.getP11(), b.getP11(), err);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const TAffine AffI = TAffine();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TTranslation : public TAffine
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TTranslation(){};
Toshihiro Shimizu 890ddd
	TTranslation(double x, double y) : TAffine(1, 0, x, 0, 1, y){};
Toshihiro Shimizu 890ddd
	TTranslation(const TPointD &p) : TAffine(1, 0, p.x, 0, 1, p.y){};
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TRotation : public TAffine
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TRotation(){};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! makes a rotation matrix of  "degrees" degrees counterclockwise
Toshihiro Shimizu 890ddd
  on the origin */
Toshihiro Shimizu 890ddd
	TRotation(double degrees);
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    double rad, sn, cs;
Toshihiro Shimizu 890ddd
    int idegrees = (int)degrees;
Toshihiro Shimizu 890ddd
    if ((double)idegrees == degrees && idegrees % 90 == 0)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      switch ((idegrees / 90) & 3)
Toshihiro Shimizu 890ddd
      {
Toshihiro Shimizu 890ddd
      case 0:  sn =  0; cs =  1; break;
Toshihiro Shimizu 890ddd
      case 1:  sn =  1; cs =  0; break;
Toshihiro Shimizu 890ddd
      case 2:  sn =  0; cs = -1; break;
Toshihiro Shimizu 890ddd
      case 3:  sn = -1; cs =  0; break;
Toshihiro Shimizu 890ddd
      default: sn =  0; cs =  0; break;
Toshihiro Shimizu 890ddd
      }
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
    else
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      rad = degrees * (TConsts::pi_180);
Toshihiro Shimizu 890ddd
      sn = sin (rad);
Toshihiro Shimizu 890ddd
      cs = cos (rad);
Toshihiro Shimizu 890ddd
      if (sn == 1 || sn == -1)
Toshihiro Shimizu 890ddd
        cs = 0;
Toshihiro Shimizu 890ddd
      if (cs == 1 || cs == -1)
Toshihiro Shimizu 890ddd
        sn = 0;
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
    a11=cs;a12= -sn;a21= -a12;a22=a11;
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! makes a rotation matrix of  "degrees" degrees counterclockwise
Toshihiro Shimizu 890ddd
  on the given center */
Toshihiro Shimizu 890ddd
	TRotation(const TPointD ¢er, double degrees);
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    TAffine a = TTranslation(center) * TRotation(degrees) * TTranslation(-center);
Toshihiro Shimizu 890ddd
    a11 = a.a11; a12 = a.a12; a13 = a.a13;
Toshihiro Shimizu 890ddd
    a21 = a.a21; a22 = a.a22; a23 = a.a23;
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TScale : public TAffine
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TScale(){};
Toshihiro Shimizu 890ddd
	TScale(double sx, double sy) : TAffine(sx, 0, 0, 0, sy, 0){};
Toshihiro Shimizu 890ddd
	TScale(double s) : TAffine(s, 0, 0, 0, s, 0) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TScale(const TPointD ¢er, double sx, double sy);
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    TAffine a = TTranslation(center) * TScale(sx,sy) * TTranslation(-center);
Toshihiro Shimizu 890ddd
    a11 = a.a11; a12 = a.a12; a13 = a.a13;
Toshihiro Shimizu 890ddd
    a21 = a.a21; a22 = a.a22; a23 = a.a23;
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TScale(const TPointD ¢er, double s);
Toshihiro Shimizu 890ddd
	/*Sposto in tgeometry.cpp
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    TAffine a = TTranslation(center) * TScale(s) * TTranslation(-center);
Toshihiro Shimizu 890ddd
    a11 = a.a11; a12 = a.a12; a13 = a.a13;
Toshihiro Shimizu 890ddd
    a21 = a.a21; a22 = a.a22; a23 = a.a23;
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TShear : public TAffine
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TShear(){};
Toshihiro Shimizu 890ddd
	TShear(double sx, double sy) : TAffine(1, sx, 0, sy, 1, 0){};
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline bool areEquals(const TAffine &a,
Toshihiro Shimizu 890ddd
					  const TAffine &b,
Toshihiro Shimizu 890ddd
					  double err = 1e-8)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return fabs(a.a11 - b.a11) < err &&
Toshihiro Shimizu 890ddd
		   fabs(a.a12 - b.a12) < err &&
Toshihiro Shimizu 890ddd
		   fabs(a.a13 - b.a13) < err &&
Toshihiro Shimizu 890ddd
		   fabs(a.a21 - b.a21) < err &&
Toshihiro Shimizu 890ddd
		   fabs(a.a22 - b.a22) < err &&
Toshihiro Shimizu 890ddd
		   fabs(a.a23 - b.a23) < err;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline TAffine inv(const TAffine &a)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return a.inv();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
inline std::ostream &operator<<(std::ostream &out, const TAffine &a)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << "(" << a.a11 << ", " << a.a12 << ", " << a.a13
Toshihiro Shimizu 890ddd
			   << ";" << a.a21 << ", " << a.a22 << ", " << a.a23 << ")";
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif //  __T_GEOMETRY_INCLUDED__