Esempio n. 1
0
  Collection<Point2DInt> cutPoints(LineSegmentInt original) {

    // Log.println("original=" + original);
    // Log.println("inflateX=" + inflateX);
    // Log.println("inflateY=" + inflateY);

    final SortedSet<Point2DInt> result =
        new TreeSet<Point2DInt>(new Point2DIntComparatorDistance(original.getP1()));

    if (original.isHorizontal() == false) {
      for (InflateData x : inflateX) {
        final LineSegmentInt vertical =
            new LineSegmentInt(x.getPos(), original.getMinY(), x.getPos(), original.getMaxY());
        final Point2DInt inter = original.getSegIntersection(vertical);
        if (inter != null) {
          result.add(inter);
        }
      }
    }
    if (original.isVertical() == false) {
      for (InflateData y : inflateY) {
        final LineSegmentInt horizontal =
            new LineSegmentInt(original.getMinX(), y.getPos(), original.getMaxX(), y.getPos());
        final Point2DInt inter = original.getSegIntersection(horizontal);
        if (inter != null) {
          result.add(inter);
        }
      }
    }
    return result;
  }
Esempio n. 2
0
  public Point2DInt[] intersect(LineSegmentInt seg) {
    if (seg.side(this) != 0) {
      return new Point2DInt[0];
    }
    // Log.println("THIS=" + this);
    // Log.println("LineSegment=" + seg);
    final Point2DInt corners[] = getCorners();
    final LineSegmentInt seg1 = new LineSegmentInt(corners[0], corners[1]);
    final LineSegmentInt seg2 = new LineSegmentInt(corners[1], corners[2]);
    final LineSegmentInt seg3 = new LineSegmentInt(corners[2], corners[3]);
    final LineSegmentInt seg4 = new LineSegmentInt(corners[3], corners[0]);
    final Point2DInt i1 = seg.getSegIntersection(seg1);
    Point2DInt i2 = seg.getSegIntersection(seg2);
    Point2DInt i3 = seg.getSegIntersection(seg3);
    Point2DInt i4 = seg.getSegIntersection(seg4);

    // Log.println("i1="+i1);
    // Log.println("i2="+i2);
    // Log.println("i3="+i3);
    // Log.println("i4="+i4);

    if (i2 != null && i2.equals(i1)) {
      i2 = null;
    }
    if (i3 != null && (i3.equals(i1) || i3.equals(i2))) {
      i3 = null;
    }
    if (i4 != null && (i4.equals(i1) || i4.equals(i2) || i4.equals(i3))) {
      i4 = null;
    }

    final int nb = countNotNull(i1, i2, i3, i4);
    assert nb >= 0 && nb <= 3 : nb;
    int i = 0;
    final Point2DInt result[] = new Point2DInt[nb];
    if (i1 != null) {
      result[i++] = i1;
    }
    if (i2 != null) {
      result[i++] = i2;
    }
    if (i3 != null) {
      result[i++] = i3;
    }
    if (i4 != null) {
      result[i++] = i4;
    }
    assert i == nb;
    assert getCornersOfOneSide(seg, 0).length
            + getCornersOfOneSide(seg, 1).length
            + getCornersOfOneSide(seg, -1).length
        == 4;
    return result;
  }
Esempio n. 3
0
 Collection<LineSegmentInt> cutSegments(LineSegmentInt original) {
   final List<LineSegmentInt> result = new ArrayList<LineSegmentInt>();
   Point2DInt cur = original.getP1();
   final Collection<Point2DInt> cutPoints = cutPoints(original);
   for (Point2DInt inter : cutPoints) {
     if (cur.equals(inter)) {
       continue;
     }
     result.add(new LineSegmentInt(cur, inter));
     cur = inter;
   }
   if (cur.equals(original.getP2()) == false) {
     result.add(new LineSegmentInt(cur, original.getP2()));
   }
   return result;
 }
Esempio n. 4
0
 public Point2DInt[] getCornersOfOneSide(LineSegmentInt seg, int sgn) {
   final Point2DInt[] corners = getCorners();
   final double sgn0 = seg.side(corners[0]);
   final double sgn1 = seg.side(corners[1]);
   final double sgn2 = seg.side(corners[2]);
   final double sgn3 = seg.side(corners[3]);
   int nb = 0;
   if (Math.signum(sgn0) == sgn) {
     nb++;
   }
   if (Math.signum(sgn1) == sgn) {
     nb++;
   }
   if (Math.signum(sgn2) == sgn) {
     nb++;
   }
   if (Math.signum(sgn3) == sgn) {
     nb++;
   }
   final Point2DInt[] result = new Point2DInt[nb];
   int i = 0;
   if (Math.signum(sgn0) == sgn) {
     result[i++] = corners[0];
   }
   if (Math.signum(sgn1) == sgn) {
     result[i++] = corners[1];
   }
   if (Math.signum(sgn2) == sgn) {
     result[i++] = corners[2];
   }
   if (Math.signum(sgn3) == sgn) {
     result[i++] = corners[3];
   }
   assert nb == i;
   return result;
 }
Esempio n. 5
0
 private LineSegmentInt inflateSegment(LineSegmentInt seg) {
   if (isOnGrid(seg.getP1()) || isOnGrid(seg.getP2())) {
     return new LineSegmentInt(inflatePoint2DInt(seg.getP1()), inflatePoint2DInt(seg.getP2()));
   }
   for (InflateData x : inflateX) {
     seg = seg.inflateXAlpha(x);
   }
   for (InflateData y : inflateY) {
     seg = seg.inflateYAlpha(y);
   }
   return seg;
 }
Esempio n. 6
0
 public List<LineSegmentInt> inflate(Collection<LineSegmentInt> segments) {
   final List<LineSegmentInt> result = new ArrayList<LineSegmentInt>();
   LineSegmentInt last = null;
   final Collection<LineSegmentInt> cutSegments = cutSegments(segments);
   for (LineSegmentInt seg : inflateSegmentCollection(cutSegments)) {
     if (last != null && last.getP2().equals(seg.getP1()) == false) {
       result.add(new LineSegmentInt(last.getP2(), seg.getP1()));
     }
     result.add(seg);
     last = seg;
   }
   return result;
 }