45#ifndef LASS_GUARDIAN_OF_INCLUSION_PRIM_POINT_2D_INL
46#define LASS_GUARDIAN_OF_INCLUSION_PRIM_POINT_2D_INL
55template<
typename T>
inline
60 LASS_ASSERT(isZero());
65template<
typename T>
inline
66Point2D<T>::Point2D(TParam x, TParam y):
76Point2D<T>::Point2D(
const Point2D<U>& other):
77 x(static_cast<TValue>(other.x)),
78 y(static_cast<TValue>(other.y))
86Point2D<T>::Point2D(
const Vector2D<U>& position):
87 x(static_cast<TValue>(position.x)),
88 y(static_cast<TValue>(position.y))
96Point2D<T>::Point2D(
const U& x,
const U& y):
97 x(static_cast<TValue>(x)),
98 y(static_cast<TValue>(y))
104template <
typename T>
inline
105const typename Point2D<T>::TVector
106Point2D<T>::position()
const
108 return TVector(x, y);
113template<
typename T>
inline
114typename Point2D<T>::TConstReference
115Point2D<T>::operator[](
size_t index)
const
117 LASS_ASSERT(index < dimension);
118 return *(&x + index);
123template<
typename T>
inline
124typename Point2D<T>::TReference
125Point2D<T>::operator[](
size_t index)
127 LASS_ASSERT(index < dimension);
128 return *(&x + index);
135template<
typename T>
inline
136typename Point2D<T>::TConstReference
137Point2D<T>::at(
signed index)
const
139 return *(&x + num::mod(index, dimension));
146template<
typename T>
inline
147typename Point2D<T>::TReference
148Point2D<T>::at(
signed index)
150 return *(&x + num::mod(index, dimension));
157Point2D<T>::operator+=(
const Vector2D<T>& offset)
168Point2D<T>::operator-=(
const Vector2D<T>& offset)
178bool Point2D<T>::isZero()
const
180 return x == TNumTraits::zero && y == TNumTraits::zero;
187template<
typename T>
inline
188bool Point2D<T>::isNaN()
const
190 return num::isNaN(x) || num::isNaN(y);
200bool operator==(
const Point2D<T>& a,
const Point2D<T>& b)
202 return a.x == b.x && a.y == b.y;
209template<
typename T>
inline
210bool operator!=(
const Point2D<T>& a,
const Point2D<T>& b)
219template<
typename T>
inline
220Point2D<T> operator+(
const Point2D<T>& a,
const Vector2D<T>& b)
222 Point2D<T> result(a);
231template<
typename T>
inline
232Point2D<T> operator+(
const Vector2D<T>& a,
const Point2D<T>& b)
234 Point2D<T> result(b);
243template<
typename T>
inline
244Point2D<T> operator-(
const Point2D<T>& a,
const Vector2D<T>& b)
246 Point2D<T> result(a);
255template<
typename T>
inline
256Vector2D<T> operator-(
const Point2D<T>& a,
const Point2D<T>& b)
258 return Vector2D<T>(a.x - b.x, a.y - b.y);
265template<
typename T>
inline
266typename Point2D<T>::TValue distance(
const Point2D<T>& a,
const Point2D<T>& b)
268 const Vector2D<T> difference = a - b;
269 return difference.norm();
274template<
typename T>
inline
275typename Point2D<T>::TValue squaredDistance(
const Point2D<T>& a,
const Point2D<T>& b)
277 const Vector2D<T> difference = a - b;
278 return difference.squaredNorm();
286Point2D<T> pointwiseMin(
const Point2D<T>& a,
const Point2D<T>& b)
288 return Point2D<T>(std::min(a.x, b.x), std::min(a.y, b.y));
297Point2D<T> pointwiseMax(
const Point2D<T>& a,
const Point2D<T>& b)
299 return Point2D<T>(std::max(a.x, b.x), std::max(a.y, b.y));
308inline Point2D<T>
lerp(
const Point2D<T>& a,
const Point2D<T>& b,
typename Point2D<T>::TParam t)
310 return Point2D<T>(
lerp(a.position(), b.position(), t));
318std::ostream& operator<<(std::ostream& stream,
const Point2D<T>& b)
320 LASS_ENFORCE_STREAM(stream) << b.position();
329io::XmlOStream& operator<<(io::XmlOStream& stream,
const Point2D<T>& b)
331 LASS_ENFORCE_STREAM(stream)
332 <<
"<Point2D>" << b.x <<
" " << b.y <<
"</Point2D>\n";
343 LASS_ENFORCE_STREAM(stream) <<
"lasthandle = line(";
344 stream << b.x <<
"," << b.y <<
",";
345 stream <<
"'Color'," << stream.color() <<
");\n";
346 stream <<
"set(lasthandle,'Marker','o');\n";
347 stream <<
"set(lasthandle,'markersize',2);\n";
355std::istream& operator>>(std::istream& stream, Point2D<T>& b)
358 LASS_ENFORCE_STREAM(stream) >> temp;
359 b = Point2D<T>(temp);
371template<
typename T>
inline
372T doubleTriangleArea(
const Point2D<T>& a,
const Point2D<T>& b,
const Point2D<T>& c )
374 return perpDot(a-c,b-c);
388template<
typename T>
inline
389T preciseDoubleTriangleArea(
const Point2D<T>& a,
const Point2D<T>& b,
const Point2D<T>& c )
391 return perpDot(a-c,b-c);
401template<
typename T>
inline
402bool ccw(
const Point2D<T>& a,
const Point2D<T>& b,
const Point2D<T>& c )
404 return doubleTriangleArea(a,b,c) > T();
410template<
typename T>
inline
411bool cw(
const Point2D<T>& a,
const Point2D<T>& b,
const Point2D<T>& c )
413 return doubleTriangleArea(a,b,c) < T();
421template<
typename T>
inline
422bool weakCcw(
const Point2D<T>& a,
const Point2D<T>& b,
const Point2D<T>& c )
424 return doubleTriangleArea(a,b,c) >= T();
431template<
typename T>
inline
432bool weakCw(
const Point2D<T>& a,
const Point2D<T>& b,
const Point2D<T>& c )
434 return doubleTriangleArea(a,b,c) <= T();
444bool inCircle(
const Point2D<T>& a,
const Point2D<T>& b,
const Point2D<T>& c,
const Point2D<T>& d )
446 const T az = a.position().squaredNorm();
447 const T bz = b.position().squaredNorm();
448 const T cz = c.position().squaredNorm();
449 const T dz = d.position().squaredNorm();
451 T det = (az * doubleTriangleArea(b, c, d) - bz * doubleTriangleArea(a, c, d)
452 + cz * doubleTriangleArea(a, b, d) - dz * doubleTriangleArea(a, b, c));
Output stream for writing a selection of geometric primitives to matlab M files.
T lerp(const T &a, const T &b, const T &f)
linear interpolation between a and b
set of geometrical primitives
Library for Assembled Shared Sources.