void CheckTraversal(float2 a, Edge *exit, bool lhs, Edge *s) { var b = exit->Org->Point; var c = exit->Dest->Point; if (!Math.ProjectSeg(a, c, b, out var bac)) { return; } var mirror = b + (c - 2 * bac + a); var lba = math.lengthsq(a - b); var lbc = math.lengthsq(c - b); var clearance = math.sqrt(math.min(lba, lbc)); var s1 = s->Org->Point; var s2 = s->Dest->Point; if (Math.IntersectSegCircle(s1, s2, b, clearance) < 2 && Math.IntersectSegCircle(s1, s2, mirror, clearance) < 2) { return; } if (Math.ProjectSeg(s1, s2, b, out var bi)) { var bib = b - bi; var lbib = math.length(bib); clearance = math.min(clearance, lbib); var r1 = bi + bib / lbib * clearance; var acp = Math.PerpCw(c - a); var s12 = s2 - s1; var s12p = Math.PerpCw(s12); var r2 = Math.Angle(acp, s12p) < 0 ? Math.IntersectLineLine(r1, r1 + s12, c, c + acp) : Math.IntersectLineLine(r1, r1 + s12, c, c + s12p); if (TryGetDisturbance(lhs ? exit->Sym : exit, r1, r2, c, out var e, out _, out var vert, lhs)) { var v = vert->Point; var vi = Math.ProjectLine(s1, s2, v); var lvs = math.length(vi - v); var lve = math.length(e - v); if (lvs < lve && lvs < clearance) { V.TryAdd((IntPtr)vert); return; } } } Propagate(s, lhs ? exit : exit->Sym); }
static Edge *CheckEdgeForContraint(Edge *edge, double clearance, double2 corner) { var s1 = edge->Org->Point; var s2 = edge->Dest->Point; if (Math.IntersectSegCircle(s1, s2, corner, clearance) != 2) { return(null); } if (edge->Constrained) { return(edge); } return(CheckTriForConstraint(edge->Sym, clearance, corner)); }