addLimitedMitreJoin method

void addLimitedMitreJoin(
  1. LineSegment offset0,
  2. LineSegment offset1,
  3. double distance,
  4. double mitreLimit,
)

Adds a limited mitre join connecting the two reflex offset segments. A limited mitre is a mitre which is beveled at the distance determined by the mitre ratio limit.

@param offset0 the first offset segment @param offset1 the second offset segment @param distance the offset distance @param mitreLimit the mitre limit ratio

Implementation

void addLimitedMitreJoin(LineSegment offset0, LineSegment offset1,
    double distance, double mitreLimit) {
  Coordinate basePt = seg0.p1;

  double ang0 = Angle.angle2C(basePt, seg0.p0);

  // oriented angle between segments
  double angDiff = Angle.angleBetweenOriented(seg0.p0, basePt, seg1.p1);
  // half of the interior angle
  double angDiffHalf = angDiff / 2;

  // angle for bisector of the interior angle between the segments
  double midAng = Angle.normalize(ang0 + angDiffHalf);
  // rotating this by PI gives the bisector of the reflex angle
  double mitreMidAng = Angle.normalize(midAng + math.pi);

  // the miterLimit determines the distance to the mitre bevel
  double mitreDist = mitreLimit * distance;
  // the bevel delta is the difference between the buffer distance
  // and half of the length of the bevel segment
  double bevelDelta = mitreDist * math.sin(angDiffHalf).abs();
  double bevelHalfLen = distance - bevelDelta;

  // compute the midpoint of the bevel segment
  double bevelMidX = basePt.x + mitreDist * math.cos(mitreMidAng);
  double bevelMidY = basePt.y + mitreDist * math.sin(mitreMidAng);
  Coordinate bevelMidPt = new Coordinate(bevelMidX, bevelMidY);

  // compute the mitre midline segment from the corner point to the bevel segment midpoint
  LineSegment mitreMidLine =
      new LineSegment.fromCoordinates(basePt, bevelMidPt);

  // finally the bevel segment endpoints are computed as offsets from
  // the mitre midline
  Coordinate bevelEndLeft = mitreMidLine.pointAlongOffset(1.0, bevelHalfLen);
  Coordinate bevelEndRight =
      mitreMidLine.pointAlongOffset(1.0, -bevelHalfLen);

  if (side == Position.LEFT) {
    segList.addPt(bevelEndLeft);
    segList.addPt(bevelEndRight);
  } else {
    segList.addPt(bevelEndRight);
    segList.addPt(bevelEndLeft);
  }
}