A 2D segment made of two points. More...
#include <Segment2D.h>
Public Member Functions | |
| double | distanceTo (const Point2D &p) const |
| bool | includes (const Point2D &p, double precision=1e-10) const |
| bool | intersects (const Segment2D &seg, Point2D &p) const |
| double | length () const |
| Point2D | p1 () const |
| Point2D | p2 () const |
| Point2D | pointAtFrom1 (double distance) |
| Point2D | pointAtFrom2 (double distance) |
| Segment2D | rotated (const Point2D ¢er, const Angle &a) const |
| Segment2D () | |
| Segment2D (const Point2D &p1, const Point2D &p2) | |
| Segment2D (double x1, double y1, double x2, double y2) | |
| Segment2D (const Segment2D &o) | |
| void | set (const Point2D &p1, const Point2D &p2) |
| void | set (double x1, double y1, double x2, double y2) |
Protected Attributes | |
| Rect | _limits |
| Point2D | _p1 |
| Point2D | _p2 |
A 2D segment made of two points.
Full description of class still missing
| QGpCoreTools::Segment2D::Segment2D | ( | ) | [inline] |
Referenced by rotated().
{}
| QGpCoreTools::Segment2D::Segment2D | ( | const Point2D & | p1, |
| const Point2D & | p2 | ||
| ) | [inline] |
| QGpCoreTools::Segment2D::Segment2D | ( | double | x1, |
| double | y1, | ||
| double | x2, | ||
| double | y2 | ||
| ) | [inline] |
{set(x1, y1, x2, y2);}
| QGpCoreTools::Segment2D::Segment2D | ( | const Segment2D & | o | ) |
| double QGpCoreTools::Segment2D::distanceTo | ( | const Point2D & | p | ) | const |
References _limits, _p1, _p2, QGpCoreTools::Point2D::distanceTo(), QGpCoreTools::Rect::includes(), QGpCoreTools::Point2D::setX(), QGpCoreTools::Point2D::setY(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().
{
TRACE;
double dx1=_p2.x()-_p1.x();
double dy1=_p2.y()-_p1.y();
double dx2=dy1;
double dy2=-dx1;
double fac=dx2*dy1-dx1*dy2;
Point2D pi;
pi.setX(dx1*dx2*(p.y()-_p1.y())+dx2*dy1*_p1.x()-dx1*dy2*p.x());
pi.setX(pi.x()/fac);
if(fabs(dx1)>fabs(dx2))
pi.setY(_p1.y()+dy1/dx1*(pi.x()-_p1.x()));
else
pi.setY(p.y()+dy2/dx2*(pi.x()-p.x()));
if(_limits.includes(pi)) {
return p.distanceTo(pi);
}
else {
double d1=p.distanceTo(_p1);
double d2=p.distanceTo(_p2);
if(d1<d2) return d1; else return d2;
}
}
| bool QGpCoreTools::Segment2D::includes | ( | const Point2D & | p, |
| double | precision = 1e-10 |
||
| ) | const |
Returns true if p is located on the segment (1e-10 precision)
References _limits, _p1, _p2, QGpCoreTools::Rect::includes(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().
{
TRACE;
if(!_limits.includes(p)) return false;
double dx=_p2.x()-_p1.x();
double dy=_p2.y()-_p1.y();
if(fabs(dx)>fabs(dy)) {
if(fabs(p.y()-(_p1.y()+dy/dx*(p.x()-_p1.x())))<precision) {
return true;
} else {
return false;
}
} else {
if(fabs(p.x()-(_p1.x()+dx/dy*(p.y()-_p1.y())))<precision) {
return true;
} else {
return false;
}
}
}
| bool QGpCoreTools::Segment2D::intersects | ( | const Segment2D & | seg, |
| Point2D & | p | ||
| ) | const |
Returns true if this segment intersects segment seg. The intersection point is returned in p.
References _limits, _p1, _p2, QGpCoreTools::Rect::includes(), QGpCoreTools::Point2D::setX(), QGpCoreTools::Point2D::setY(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().
Referenced by QGpCoreTools::IrregularGrid2DData::crossSection().
{
TRACE;
double dx1=_p2.x()-_p1.x();
double dy1=_p2.y()-_p1.y();
double dx2=seg._p2.x()-seg._p1.x();
double dy2=seg._p2.y()-seg._p1.y();
double fac=dx2*dy1-dx1*dy2;
if(fabs(fac)<1e-20) return false; // parallel segments
// Horizontal or vertical lines are handled separately to avoid precision errors
if(dx1==0.0) {
p.setX(_p1.x());
p.setY(seg._p1.y()+dy2/dx2*(p.x()-seg._p1.x()));
} else if(dx2==0.0) {
p.setX(seg._p1.x());
p.setY(_p1.y()+dy1/dx1*(p.x()-_p1.x()));
} else if(dy1==0.0) {
p.setY(_p1.y());
p.setX(seg._p1.x()+dx2/dy2*(p.y()-seg._p1.y()));
} else if(dy2==0.0) {
p.setY(seg._p1.y());
p.setX(_p1.x()+dx1/dy1*(p.y()-_p1.y()));
} else {
double tmp=dx1*dx2*(seg._p1.y()-_p1.y())+dx2*dy1*_p1.x()-dx1*dy2*seg._p1.x();
p.setX(tmp/fac);
if(fabs(dx1)>fabs(dx2)) {
p.setY(_p1.y()+dy1/dx1*(p.x()-_p1.x()));
} else {
p.setY(seg._p1.y()+dy2/dx2*(p.x()-seg._p1.x()));
}
}
if(_limits.includes(p) && seg._limits.includes(p)) return true;
else return false;
}
| double QGpCoreTools::Segment2D::length | ( | ) | const [inline] |
Referenced by pointAtFrom1(), and pointAtFrom2().
{return _p1.distanceTo(_p2);}
| Point2D QGpCoreTools::Segment2D::p1 | ( | ) | const [inline] |
Referenced by QGpCoreTools::IrregularGrid2DData::crossSection(), rotated(), and set().
{return _p1;}
| Point2D QGpCoreTools::Segment2D::p2 | ( | ) | const [inline] |
Referenced by QGpCoreTools::IrregularGrid2DData::crossSection(), rotated(), and set().
{return _p2;}
| Point2D QGpCoreTools::Segment2D::pointAtFrom1 | ( | double | distance | ) |
| Point2D QGpCoreTools::Segment2D::pointAtFrom2 | ( | double | distance | ) |
| Segment2D QGpCoreTools::Segment2D::rotated | ( | const Point2D & | center, |
| const Angle & | a | ||
| ) | const |
| void QGpCoreTools::Segment2D::set | ( | const Point2D & | p1, |
| const Point2D & | p2 | ||
| ) |
References _limits, _p1, _p2, p1(), p2(), QGpCoreTools::Rect::setLimits(), TRACE, QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().
Referenced by QGpCoreTools::IrregularGrid2DData::crossSection(), and SciFigs::CircleViewer::Limits::Limits().
| void QGpCoreTools::Segment2D::set | ( | double | x1, |
| double | y1, | ||
| double | x2, | ||
| double | y2 | ||
| ) |
Rect QGpCoreTools::Segment2D::_limits [protected] |
Referenced by distanceTo(), includes(), intersects(), Segment2D(), and set().
Point2D QGpCoreTools::Segment2D::_p1 [protected] |
Referenced by distanceTo(), includes(), intersects(), pointAtFrom1(), pointAtFrom2(), rotated(), Segment2D(), and set().
Point2D QGpCoreTools::Segment2D::_p2 [protected] |
Referenced by distanceTo(), includes(), intersects(), pointAtFrom1(), pointAtFrom2(), rotated(), Segment2D(), and set().