Skip to content
Snippets Groups Projects
digitalstraightsegment.cpp 2.23 KiB
Newer Older
even's avatar
even committed
#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);
  }
}