namespace cloonel { ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line::Line (const Line& parOther) : m_points(parOther.m_points) { } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line::Line (Scalar parValue) : m_points(Point(parValue)) { } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line::Line (const Point& parStart, const Point& parEnd) : m_points(parStart, parEnd) { } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line::Line (Scalar parX1, Scalar parY1, Scalar parX2, Scalar parY2) : m_points(Point(parX1, parY1), Point(parX2, parY2)) { } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line& Line::operator+= (const Point& parRhs) { m_points.x() += parRhs; m_points.y() += parRhs; return *this; } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line& Line::operator-= (const Point& parRhs) { m_points.x() -= parRhs; m_points.y() -= parRhs; return *this; } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template template Line& Line::operator*= (const Vector& parRhs) { typedef typename std::common_type::type CommonType; typedef Vector CommVecType; m_points.x() = vector_cast(vector_cast(m_points.x()) * vector_cast(parRhs)); m_points.y() = vector_cast(vector_cast(m_points.y()) * vector_cast(parRhs)); return *this; } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line operator+ (const Vector& parLhs, Line parRhs) { parRhs += parLhs; return parRhs; } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line operator- (const Vector& parLhs, Line parRhs) { parRhs -= parLhs; return parRhs; } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line operator+ (Line parLhs, const Vector& parRhs) { parLhs += parRhs; return parLhs; } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line operator- (Line parLhs, const Vector& parRhs) { parLhs -= parRhs; return parLhs; } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line operator* (const Vector& parLhs, Line parRhs) { parRhs *= parLhs; return parRhs; } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template Line operator* (Line parLhs, const Vector& parRhs) { parLhs *= parRhs; return parLhs; } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template bool operator> (const Vector& parLhs, const Line& parRhs) { const Vector line(parRhs.End() - parRhs.Start()); const Vector linePerp(line.y(), -line.x()); const Vector pt(parLhs - parRhs.Start()); const T dotproduct = dot(linePerp, pt); return (dotproduct > T(0)); } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template bool operator< (const Vector& parLhs, const Line& parRhs) { const Vector line(parRhs.End() - parRhs.Start()); const Vector linePerp(line.y(), -line.x()); const Vector pt(parLhs - parRhs.Start()); const T dotproduct = dot(linePerp, pt); return (dotproduct < T(0)); } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template bool operator>= (const Vector& parLhs, const Line& parRhs) { const Vector line(parRhs.End() - parRhs.Start()); const Vector linePerp(line.y(), -line.x()); const Vector pt(parLhs - parRhs.Start()); const T dotproduct = dot(linePerp, pt); return (dotproduct >= T(0)); } ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template bool operator<= (const Vector& parLhs, const Line& parRhs) { const Vector line(parRhs.End() - parRhs.Start()); const Vector linePerp(line.y(), -line.x()); const Vector pt(parLhs - parRhs.Start()); const T dotproduct = dot(linePerp, pt); return (dotproduct <= T(0)); } #if !defined(NDEBUG) ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template std::ostream& operator<< ( std::ostream& parStream, const Line& parLine ) { for (uint32_t z = 0; z < S - 1; ++z) { parStream << parLine[z] << "-"; } parStream << parLine[S - 1]; return parStream; } #endif } //namespace cloonel