addLimitedMitreJoin method
void
addLimitedMitreJoin(
- LineSegment offset0,
- LineSegment offset1,
- double distance,
- 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);
}
}