Example #1
0
        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);
        }
Example #2
0
        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));
        }