KJB
|
Class to manipulate a line segment The class is parametrized in terms the position of the centre, its length and orientation. This is thus compatible with the output of the Berkeley edge detector. We store also the start point, the end point and the line parameters describing this line segment (for more details on how the line parameters work, please see the class line). This is redundant information, but it is convenient to have all these parameters precomputed and at hand. More...
#include <gr_line_segment.h>
Public Member Functions | |
Line_segment () | |
Constructor without initializations. More... | |
Line_segment (double icentre_x, double icentre_y, double iorientation, double ilength) | |
Constructs a new Line_segment from centre, orientation, length. More... | |
Line_segment (const Vector &start, const Vector &end) | |
Constructs a new Line_segment from a starting and ending point. More... | |
Line_segment (std::istream &in) | |
Constructs this line segment by reading from an input stream. More... | |
Line_segment (const Line_segment &ls) | |
Copy constructor. More... | |
Line_segment & | operator= (const Line_segment &ls) |
Assignment operator. More... | |
bool | operator== (const Line_segment &ls) const |
bool | operator< (const Line_segment &ls) const |
void | init_from_slope_and_intercept (double x_start, double x_end, double islope, double iintercept) |
Initialize from x_start, x_end, slope, y_axis intercept. More... | |
void | init_vertical_segment (double y_start, double y_end, double x) |
Initialize a vertical Line_segment from y_start, y_end, x coord. More... | |
void | init_from_end_points (double x_1, double y_1, double x_2, double y_2) |
Initialize a new Line_segment from position of its end points. More... | |
void | init_from_centre_and_orientation (double icentre_x, double icentre_y, double iorientation, double ilength) |
double | get_centre_x () const |
Returns the x-coordinate of the mid-point. More... | |
double | get_centre_y () const |
Returns the y-coordinate of the mid-point. More... | |
bool | point_outside_segment (const Vector &point) const |
Check whether point is inside the ending points of this segment Note point is collinear with this line segment. More... | |
const kjb::Vector & | get_centre () const |
Returns the mid-point. More... | |
double | get_start_x () const |
Returns the x-coordinate of the leftmost point of the segment. More... | |
double | get_start_y () const |
Returns the y-coordinate of the leftmost point of the segment. More... | |
const kjb::Vector & | get_start () const |
Returns the leftmost point of the segment. More... | |
double | get_end_x () const |
Returns the x-coordinate of the rightmost point of the segment. More... | |
double | get_end_y () const |
Returns the y-coordinate of the rightmost point of the segment. More... | |
const kjb::Vector & | get_end () const |
Returns the rightmost point of the segment. More... | |
double | get_slope () const |
Returns the slope of the line segment. More... | |
double | get_y_intercept () const |
Returns the y-intercept of the line segment. More... | |
double | get_x_intercept () const |
Returns the x-intercept of the line segment. More... | |
const Vector & | get_line_params () const |
const Line & | get_line () const |
double | get_orientation () const |
Returns the orientation. More... | |
double | get_length () const |
Returns the length. More... | |
void | read (std::istream &in) |
Reads this Line segment from an input stream. More... | |
void | write (std::ostream &out) const |
Writes this Line segment to an output stream. More... | |
void | draw (kjb::Image &img, double ir, double ig, double ib, double width=1.0) const |
Draws this line segment. More... | |
void | randomly_color (kjb::Image &img, double width=1.0) const |
Randomly colors this line segment on an image. More... | |
bool | get_intersection (const Line_segment &line, kjb::Vector &point) const |
Finds the intersection point of the this line_segment and the input Line_segment line. Return false if these two lines are parallel and therefore do not intersect. More... | |
double | get_distance_from_point (const kjb::Vector &point) const |
Returns distance between this line segment and the input point. More... | |
double | get_angle_between_line (const Line_segment &line) const |
Returns the angle between this line segment and the input line. More... | |
double | find_t (const kjb::Vector &point) const |
double | get_distance_from_point (const kjb::Vector &point, double *perp_dist) const |
Returns distance between this line segment and the input point. More... | |
double | get_dx () const |
Returns the dx of this segment. More... | |
double | get_dy () const |
Returns the dy of this segment. More... | |
bool | is_horizontal () const |
Function object of testing whehter a line is horizontal. More... | |
bool | is_vertical () const |
Function object of testing whehter a line is horizontal. More... | |
void | get_direction (kjb::Vector &idirection) const |
Returns a vector representing the normalized direction of this line_segment. More... | |
bool | is_line_segment_consistent () |
bool | is_collinear (const Line_segment &ls, double collinear_threshold) const |
Public Member Functions inherited from kjb::Readable | |
virtual | ~Readable () |
Deletes this Readable. More... | |
virtual void | read (const char *fname) |
Reads this Readable from a file. More... | |
Public Member Functions inherited from kjb::Writeable | |
virtual | ~Writeable () |
Deletes this Writeable. More... | |
virtual void | write (const char *fname) const |
Writes this Writeable to a file. More... | |
Static Public Member Functions | |
static std::pair< Vector, Vector > | project_line_segment_onto_line (const Line_segment &segment, const Line &iline) |
Project a line segment onto a line. More... | |
static bool | project_line_segment_onto_line_segment (const Line_segment &segment_project, const Line_segment &segment_target, std::pair< Vector, Vector > &projected_points, double &length_inside, double &length_outside) |
Project a line segment onto a line segment. More... | |
static bool | less_than (const Vector &point1, const Vector &point2) |
Returns true if point1.x < point2.x || (point1.x == point2.x && point1.y < point2.y. More... | |
static bool | collision_detection (double start_1, double end_1, double start_2, double end_2, int &direction, double &delta) |
static bool | collision_detection_with_direction (double start_1, double end_1, double start_2, double end_2, int &direction, double &delta, int idirection) |
static double | get_overlap (double start_1, double end_1, double start_2, double end_2) |
Static Public Member Functions inherited from kjb::Readable | |
static const char * | read_field_value (std::istream &in, const char *field_name, char *field_buf, size_t buf_len, char separator=':') |
Reads a line off in into a buffer and returns a pointer to the field value in the buffer. More... | |
static const char * | read_field_value (std::istream &in, const char *field_name, char separator=':') |
Reads a line off in into an internal buffer and returns a pointer to the field value in the buffer. More... | |
Protected Member Functions | |
void | compute_extrema () |
Computes the extrema of this line segments from centre, orientation, and length. This information is redundant, but it can be very useful to have them pre-computed. More... | |
void | compute_line_parameters () |
Protected Attributes | |
kjb::Vector | centre |
X coordinate of the centre of this line segment. More... | |
double | orientation |
Orientation of this line segment, defined as the angle between the x axis and the segment, positive angle meaning counter clockwise. Ranges between 0 and 180 degrees. Stored in radian. More... | |
double | length |
length of the line segment More... | |
kjb::Vector | start_point |
kjb::Vector | end_point |
Line | line |
Static Protected Attributes | |
static Matrix | _line_segment_rotation |
Friends | |
std::ostream & | operator<< (std::ostream &, const Line_segment &) |
Class to manipulate a line segment The class is parametrized in terms the position of the centre, its length and orientation. This is thus compatible with the output of the Berkeley edge detector. We store also the start point, the end point and the line parameters describing this line segment (for more details on how the line parameters work, please see the class line). This is redundant information, but it is convenient to have all these parameters precomputed and at hand.
|
inline |
Constructor without initializations.
kjb::Line_segment::Line_segment | ( | double | icentre_x, |
double | icentre_y, | ||
double | iorientation, | ||
double | ilength | ||
) |
Constructs a new Line_segment from centre, orientation, length.
icentre_x | the x coordinate of the centre |
icentre_y | the y coordinate of the centre |
iorientation | the orientation of the segment, defined as the angle between the x axis and the segment, positive meaning counter clockwise rotation. The value will be converted to the range [0-180] degrees |
ilength | the length of the segment |
Constructs a new Line_segment from a starting and ending point.
kjb::Line_segment::Line_segment | ( | std::istream & | in | ) |
Constructs this line segment by reading from an input stream.
kjb::Line_segment::Line_segment | ( | const Line_segment & | ls | ) |
Copy constructor.
ls | the line segment to copy into this one |
|
static |
|
static |
|
protected |
Computes the extrema of this line segments from centre, orientation, and length. This information is redundant, but it can be very useful to have them pre-computed.
Computes the extrema from the line segment parameters. It initializes the extrema so that the segment is aligned with the x axis , centred int the origin and has the correct length. It then rotates it so that it has the correct orientation, and finally translates it to the reight position
|
protected |
void kjb::Line_segment::draw | ( | kjb::Image & | img, |
double | ir, | ||
double | ig, | ||
double | ib, | ||
double | width = 1.0 |
||
) | const |
Draws this line segment.
Draws the line segment on an image
img | the image |
ir | the red channel |
ig | the green channel |
ib | the blue channel |
width | the width of the segment to be drawn (in pixel) |
double kjb::Line_segment::find_t | ( | const kjb::Vector & | point | ) | const |
If we interpret the end points p1 and p2 of this line segment as the two points defining the parametric equation of a line, given an input point p, this function returns the parameter t such that: p = p2 + t (p2 -p1) Notice that this works even if p is not on the line, its projection on it will be considered.
If we interpret the end points p1 and p2 of this line segment as the two points defining the parametric equation of a line, given an input point p, this function returns the parameter t such that: p = p2 + t (p2 -p1) Notice that this works even if p is not on the line, its projection on it will be considered.
point | The point to compute t for |
double kjb::Line_segment::get_angle_between_line | ( | const Line_segment & | line_segment | ) | const |
Returns the angle between this line segment and the input line.
Calculate the angle between this line segment and the input line_segment.
|
inline |
Returns the mid-point.
|
inline |
Returns the x-coordinate of the mid-point.
|
inline |
Returns the y-coordinate of the mid-point.
void kjb::Line_segment::get_direction | ( | kjb::Vector & | idirection | ) | const |
Returns a vector representing the normalized direction of this line_segment.
Returns a vector representing the normalized direction of this line_segment
idirection | This will contain the line segment direction |
double kjb::Line_segment::get_distance_from_point | ( | const kjb::Vector & | point | ) | const |
Returns distance between this line segment and the input point.
Returns the distance between this line segment and the input point. There are two case: 1) The perpendicular projection of the point onto the line the segment lies on falls onto the line segment. In this case we return this perpendicular distance 2) Otherwise, we return the smallest distance between one of the segment end points and the input point
point | the input point |
double kjb::Line_segment::get_distance_from_point | ( | const kjb::Vector & | point, |
double * | perp_dist | ||
) | const |
Returns distance between this line segment and the input point.
Returns the distance between this line segment and the input point. There are two case: 1) The perpendicular projection of the point onto the line the segment lies on falls onto the line segment. In this case we return this perpendicular distance 2) Otherwise, we return the smallest distance between one of the segment end points and the input point
point | the input point |
|
inline |
Returns the dx of this segment.
|
inline |
Returns the dy of this segment.
|
inline |
Returns the rightmost point of the segment.
|
inline |
Returns the x-coordinate of the rightmost point of the segment.
|
inline |
Returns the y-coordinate of the rightmost point of the segment.
bool kjb::Line_segment::get_intersection | ( | const Line_segment & | _line, |
kjb::Vector & | point_p | ||
) | const |
Finds the intersection point of the this line_segment and the input Line_segment line. Return false if these two lines are parallel and therefore do not intersect.
line | input Line_segment |
point | the intersection point |
Finds the intersection between the line this line_segment lies ont and the line the input line_segment lies on. Return false if these two lines are parallel and therefore do not intersect
_line | The input line_segment |
point_p | Will contain the intersection point |
|
inline |
Returns the length.
|
inline |
|
inline |
|
inline |
Returns the orientation.
|
static |
|
inline |
Returns the slope of the line segment.
If the segment is vertical, the slope tends to infinity.
|
inline |
Returns the leftmost point of the segment.
|
inline |
Returns the x-coordinate of the leftmost point of the segment.
|
inline |
Returns the y-coordinate of the leftmost point of the segment.
|
inline |
Returns the x-intercept of the line segment.
If the segment is horizontal there is not such interception.
|
inline |
Returns the y-intercept of the line segment.
If the segment is vertical there is not such interception.
void kjb::Line_segment::init_from_centre_and_orientation | ( | double | icentre_x, |
double | icentre_y, | ||
double | iorientation, | ||
double | ilength | ||
) |
icentre_x | the x coordinate of the centre |
icentre_y | the y coordinate of the centre |
iorientation | the orientation of the segment, defined as the angle between the x axis and the segment, positive meaning counter clockwise rotation. The value will be converted to the range [0-180] degrees |
ilength | the length of the segment |
void kjb::Line_segment::init_from_end_points | ( | double | x_1, |
double | y_1, | ||
double | x_2, | ||
double | y_2 | ||
) |
Initialize a new Line_segment from position of its end points.
x_1 | the x coordinate of the first end point |
y_1 | the y coordinate of the first end point |
x_2 | the x coordinate of the second end point |
y_2 | the y coordinate of the second end point |
void kjb::Line_segment::init_from_slope_and_intercept | ( | double | x_start, |
double | x_end, | ||
double | islope, | ||
double | iintercept | ||
) |
Initialize from x_start, x_end, slope, y_axis intercept.
Notice that a vertical segment cannot be initialized with this function.
x_start | the x coordinate of the first endpoint |
x_end | the x coordinate of the second endpoint |
im | slope of the line segment |
ib | y intercept |
void kjb::Line_segment::init_vertical_segment | ( | double | y_start, |
double | y_end, | ||
double | x | ||
) |
Initialize a vertical Line_segment from y_start, y_end, x coord.
This function inits this line segment as a vertical segment defined by the x location and a start and end point along the y direction.
y_start | the y coordinate of the bottom of this segment |
y_end | the y coordinate of the first endpoint |
x | the x coordinate of the second endpoint |
bool kjb::Line_segment::is_collinear | ( | const Line_segment & | ls, |
double | collinear_threshold | ||
) | const |
|
inline |
Function object of testing whehter a line is horizontal.
bool kjb::Line_segment::is_line_segment_consistent | ( | ) |
For debug purposes, checks this line segment is consistent
For debugging purposes. It checks that the line segment parameters are consistent
|
inline |
Function object of testing whehter a line is horizontal.
Returns true if point1.x < point2.x || (point1.x == point2.x && point1.y < point2.y.
|
inline |
Line_segment & kjb::Line_segment::operator= | ( | const Line_segment & | ls | ) |
Assignment operator.
ls | the line segment to assign to this one |
bool kjb::Line_segment::operator== | ( | const Line_segment & | ls | ) | const |
ls | the line segment to compare to this one |
bool kjb::Line_segment::point_outside_segment | ( | const Vector & | point | ) | const |
Check whether point is inside the ending points of this segment Note point is collinear with this line segment.
|
static |
Project a line segment onto a line.
(not fully tested)
|
static |
Project a line segment onto a line segment.
segment_project | The line segment that is being projected |
segment_target | The line segment that is being projected to |
projected_points | The projected two ending points of the line segment. |
segment_project | The line segment that is being projected |
segment_target | The line segment that is being projected to |
projected_points | The projected two ending points of the line segment |
void kjb::Line_segment::randomly_color | ( | kjb::Image & | img, |
double | width = 1.0 |
||
) | const |
Randomly colors this line segment on an image.
Draws the line segment using a random color
img | the image |
width | the width of the segment to be drawn (in pixel) |
|
virtual |
Reads this Line segment from an input stream.
Reads this Line_segment from an input stream.
Implements kjb::Readable.
Reimplemented in kjb::Model_edge.
|
virtual |
Writes this Line segment to an output stream.
Writes this Line_segment to an output stream.
Implements kjb::Writeable.
Reimplemented in kjb::Model_edge.
|
friend |
|
staticprotected |
|
protected |
X coordinate of the centre of this line segment.
|
protected |
|
protected |
length of the line segment
|
protected |
Line parameters. The following parameters are redundant, but it can be helpful to have them pre-computed.
|
protected |
Orientation of this line segment, defined as the angle between the x axis and the segment, positive angle meaning counter clockwise. Ranges between 0 and 180 degrees. Stored in radian.
|
protected |
Start and end point of the line segment. The following fields are redundant, but it can be helpful to have them pre-computed.