private void AddLineJoin(PointFP lastPoint, PointFP currPoint, PointFP nextPoint) { if (lastPoint == null || currPoint == null || nextPoint == null || nextPoint.Equals(currPoint) || lastPoint.Equals(currPoint)) { return; } PointFP p1 = null, p2 = null; LineFP head, tail, lastHead, lastTail; CalcHeadTail(currPoint, nextPoint, head = new LineFP(), tail = new LineFP()); CalcHeadTail(lastPoint, currPoint, lastHead = new LineFP(), lastTail = new LineFP()); var needLineJoin = false; var pi1 = new PointFP(); var pi2 = new PointFP(); var cross1 = LineFP.Intersects(new LineFP(head.Pt1, tail.Pt1), new LineFP(lastHead.Pt1, lastTail.Pt1), pi1); var cross2 = LineFP.Intersects(new LineFP(head.Pt2, tail.Pt2), new LineFP(lastHead.Pt2, lastTail.Pt2), pi2); if (cross1 && !cross2 && pi1.X != SingleFP.NOT_A_NUMBER) { p1 = lastTail.Pt2; p2 = head.Pt2; needLineJoin = true; } else if (!cross1 && cross2 && pi2.X != SingleFP.NOT_A_NUMBER) { p1 = lastTail.Pt1; p2 = head.Pt1; needLineJoin = true; } if (needLineJoin) { _outline.AddMoveTo(cross1 ? pi1 : pi2); _outline.AddLineTo(cross1 ? p2 : p1); if (_lineJoin == PenFP.LINEJOIN_MITER) { _outline.AddLineTo(cross1 ? pi2 : pi1); } _outline.AddLineTo(cross1 ? p1 : p2); _outline.AddClose(); if (_lineJoin == PenFP.LINEJOIN_ROUND) { AddLineCap(cross2 ? pi2 : pi1, currPoint, PenFP.LINECAP_ROUND); } } }