Go to the documentation of this file.
17 #ifndef IGNITION_MATH_LINE2_HH_
18 #define IGNITION_MATH_LINE2_HH_
22 #include <ignition/math/config.hh>
29 inline namespace IGNITION_MATH_VERSION_NAMESPACE {
42 this->Set(_ptA, _ptB);
50 public:
Line2(
double _x1,
double _y1,
double _x2,
double _y2)
52 this->Set(_x1, _y1, _x2, _y2);
70 public:
void Set(
double _x1,
double _y1,
double _x2,
double _y2)
72 this->pts[0].Set(_x1, _y1);
73 this->pts[1].Set(_x2, _y2);
84 return (this->pts[0].X() - this->pts[1].X()) *
85 (_line[0].Y() -_line[1].Y()) -
86 (this->pts[0].Y() - this->pts[1].Y()) *
87 (_line[0].X() - _line[1].X());
97 return (_pt.
Y() - this->pts[0].Y()) *
98 (this->pts[1].X() - this->pts[0].X()) -
99 (_pt.
X() - this->pts[0].X()) *
100 (this->pts[1].Y() - this->pts[0].Y());
110 double _epsilon = 1e-6)
const
124 double _epsilon = 1e-6)
const
138 double _epsilon = 1e-6)
const
140 return this->Parallel(_line, _epsilon) &&
141 this->Intersect(_line, _epsilon);
150 double _epsilon = 1e-6)
const
152 return this->Collinear(_pt, _epsilon) && this->Within(_pt, _epsilon);
163 double _epsilon = 1e-6)
const
165 return _pt.
X() <=
std::max(this->pts[0].X(),
166 this->pts[1].X()) + _epsilon &&
168 this->pts[1].X()) - _epsilon &&
170 this->pts[1].Y()) + _epsilon &&
172 this->pts[1].Y()) - _epsilon;
181 double _epsilon = 1e-6)
const
184 return this->Intersect(_line, ignore, _epsilon);
196 double _epsilon = 1e-6)
const
198 double d = this->CrossProduct(_line);
205 if (this->Within(_line[0], _epsilon))
211 else if (this->Within(_line[1], _epsilon))
221 _pt.
X((_line[0].X() - _line[1].X()) *
222 (this->pts[0].X() * this->pts[1].Y() -
223 this->pts[0].Y() * this->pts[1].X()) -
224 (this->pts[0].X() - this->pts[1].X()) *
225 (_line[0].X() * _line[1].Y() - _line[0].Y() * _line[1].X()));
227 _pt.
Y((_line[0].Y() - _line[1].Y()) *
228 (this->pts[0].X() * this->pts[1].Y() -
229 this->pts[0].Y() * this->pts[1].X()) -
230 (this->pts[0].Y() - this->pts[1].Y()) *
231 (_line[0].X() * _line[1].Y() - _line[0].Y() * _line[1].X()));
235 if (_pt.
X() <
std::min(this->pts[0].X(), this->pts[1].X()) ||
236 _pt.
X() >
std::max(this->pts[0].X(), this->pts[1].X()) ||
237 _pt.
X() <
std::min(_line[0].X(), _line[1].X()) ||
238 _pt.
X() >
std::max(_line[0].X(), _line[1].X()))
243 if (_pt.
Y() <
std::min(this->pts[0].Y(), this->pts[1].Y()) ||
244 _pt.
Y() >
std::max(this->pts[0].Y(), this->pts[1].Y()) ||
245 _pt.
Y() <
std::min(_line[0].Y(), _line[1].Y()) ||
246 _pt.
Y() >
std::max(_line[0].Y(), _line[1].Y()))
258 return sqrt((this->pts[0].X() - this->pts[1].X()) *
259 (this->pts[0].X() - this->pts[1].X()) +
260 (this->pts[0].Y() - this->pts[1].Y()) *
261 (this->pts[0].Y() - this->pts[1].Y()));
268 if (
math::equal(this->pts[1].X(), this->pts[0].X()))
271 return (this->pts[1].Y() - this->pts[0].Y()) /
272 static_cast<double>(this->pts[1].X() - this->pts[0].X());
280 return this->pts[0] == _line[0] && this->pts[1] == _line[1];
288 return !(*
this == _line);
306 _out << _line[0] <<
" " << _line[1];
friend std::ostream & operator<<(std::ostream &_out, const Line2< T > &_line)
Stream extraction operator.
Definition: Line2.hh:303
Line2< double > Line2d
Definition: Line2.hh:315
Two dimensional (x, y) vector.
Definition: Vector2.hh:37
Definition: AdditivelySeparableScalarField3.hh:27
bool equal(const T &_a, const T &_b, const T &_epsilon=T(1e-6))
check if two values are equal, within a tolerance
Definition: Helpers.hh:556
math::Vector2< T > operator[](size_t _index) const
Get the start or end point.
Definition: Line2.hh:294
double CrossProduct(const Vector2< T > &_pt) const
Return the cross product of this line and the given point. Given 'a' and 'b' as the start and end poi...
Definition: Line2.hh:95
bool Collinear(const math::Vector2< T > &_pt, double _epsilon=1e-6) const
Check if the given point is collinear with this line.
Definition: Line2.hh:109
Line2< int > Line2i
Definition: Line2.hh:314
bool Collinear(const math::Line2< T > &_line, double _epsilon=1e-6) const
Check if the given line is collinear with this line. This is the AND of Parallel and Intersect.
Definition: Line2.hh:137
T X() const
Return the x value.
Definition: Vector2.hh:499
bool Within(const math::Vector2< T > &_pt, double _epsilon=1e-6) const
Check if the given point is between the start and end points of the line segment. This does not imply...
Definition: Line2.hh:162
A two dimensional line segment. The line is defined by a start and end point.
Definition: Line2.hh:35
void Set(const math::Vector2< T > &_ptA, const math::Vector2< T > &_ptB)
Set the start and end point of the line segment.
Definition: Line2.hh:58
bool Intersect(const Line2< T > &_line, math::Vector2< T > &_pt, double _epsilon=1e-6) const
Check if this line intersects the given line segment. The point of intersection is returned in the _r...
Definition: Line2.hh:195
bool OnSegment(const math::Vector2< T > &_pt, double _epsilon=1e-6) const
Return whether the given point is on this line segment.
Definition: Line2.hh:149
void Set(double _x1, double _y1, double _x2, double _y2)
Set the start and end point of the line segment.
Definition: Line2.hh:70
T clamp(T _v, T _min, T _max)
Simple clamping function.
Definition: Helpers.hh:406
Line2< float > Line2f
Definition: Line2.hh:316
Line2(double _x1, double _y1, double _x2, double _y2)
Constructor.
Definition: Line2.hh:50
T Y() const
Return the y value.
Definition: Vector2.hh:506
Line2(const math::Vector2< T > &_ptA, const math::Vector2< T > &_ptB)
Constructor.
Definition: Line2.hh:40
bool operator!=(const Line2< T > &_line) const
Inequality operator.
Definition: Line2.hh:286
double Slope() const
Get the slope of the line.
Definition: Line2.hh:266
static const size_t IGN_ZERO_SIZE_T
size_t type with a value of 0
Definition: Helpers.hh:227
bool Intersect(const Line2< T > &_line, double _epsilon=1e-6) const
Check if this line intersects the given line segment.
Definition: Line2.hh:180
static const size_t IGN_ONE_SIZE_T
size_t type with a value of 1
Definition: Helpers.hh:230
static const double NAN_D
Returns the representation of a quiet not a number (NAN)
Definition: Helpers.hh:269
bool operator==(const Line2< T > &_line) const
Equality operator.
Definition: Line2.hh:278
T Length() const
Get the length of the line.
Definition: Line2.hh:256
bool Parallel(const math::Line2< T > &_line, double _epsilon=1e-6) const
Check if the given line is parallel with this line.
Definition: Line2.hh:123
double CrossProduct(const Line2< T > &_line) const
Return the cross product of this line and the given line. Give 'a' as this line and 'b' as given line...
Definition: Line2.hh:82