#include <iostream> #include "digitalstraightsegment.h" DigitalStraightSegment::DigitalStraightSegment (Pt2i p1, Pt2i p2, int type, int xmin, int ymin, int xmax, int ymax) : DigitalStraightLine (p1, p2, type) { if (a < (b < 0 ? -b : b)) { min = xmin; max = xmax; } else { min = ymin; max = ymax; } } DigitalStraightSegment::DigitalStraightSegment (Pt2i p1, Pt2i p2, Pt2i p3, int xmin, int ymin, int xmax, int ymax) : DigitalStraightLine (p1, p2, p3) { if (a < (b < 0 ? -b : b)) { min = xmin; max = xmax; } else { min = ymin; max = ymax; } } Pt2i DigitalStraightSegment::getABoundingPoint (bool upper) const { int sa = a, sb = b, u1 = 1, v1 = 0, u2 = 0, v2 = 1; while (sb != 0) { int r = sa % sb; int q = sa / sb; int u3 = u1 - q * u2; int v3 = v1 - q * v2; u1 = u2; v1 = v2; u2 = u3; v2 = v3; sa = sb; sb = r; } if (sa < 0) // should be 1 or -1 if a and b are primal { u1 = - u1; // necessary if sa = -1 v1 = - v1; } Pt2i extr (upper ? Pt2i (u1 * (c + nu - 1), v1 * (c + nu - 1)) : Pt2i (u1 * c, v1 * c)); int dec = 0; int bb = (b < 0 ? -b : b); if (a < bb) { if (extr.x () > max) dec = 1 + (extr.x () - max) / bb; else if (extr.x () < min) dec = -1 - (min - extr.x ()) / bb; if (b < 0) dec = -dec; } else { if (extr.y () > max) dec = -1 - (extr.y () - max) / a; else if (extr.y () < min) dec = 1 + (min - extr.y ()) / a; } extr.set (extr.x () - dec * b, extr.y () + dec * a); return extr; } void DigitalStraightSegment::adjustWorkArea (int &xmin, int &ymin, int &width, int &height) const { if (b > a || -b > a) { if (xmin < min) xmin = min; // Caution, segment max limit is excluded int x2 = (xmin + width < max + 1 ? xmin + width : max + 1); width = (xmin >= x2 ? 0 : x2 - xmin); } else { if (ymin < min) ymin = min; // Cochon, segment max limit is excluded int y2 = (ymin + height < max + 1 ? ymin + height : max + 1); height = (ymin >= y2 ? 0 : y2 - ymin); } }