Exemplo n.º 1
0
            public Triangle(HalfEdge _twin, int _newVert, Delaunay _d)
            {
                D = _d;
                var v0 = _twin.OriginIdx;
                var v1 = _newVert;
                var v2 = _twin.NextEdge.OriginIdx;

                Edge0 = new HalfEdge(this, v0, D);
                Edge1 = new HalfEdge(this, v1, D);
                Edge2 = new HalfEdge(this, v2, D);

                Edge0.NextEdge = Edge1;
                Edge1.NextEdge = Edge2;
                Edge2.NextEdge = Edge0;

                Edge2.Twin = _twin;
                _twin.Twin = Edge2;

                var pts = D.Points;

                Geom.Circumcircle(pts[v0], pts[v1], pts[v2], out CCX, out CCY, out CCRSq);

                PrevTri    = _d.LastTri;
                _d.LastTri = this;

                _d.m_TriCount++;
            }
Exemplo n.º 2
0
            public Triangle(int _v0, int _v1, int _v2, Delaunay _d)
            {
                D = _d;

                Edge0 = new HalfEdge(this, _v0, D);
                Edge1 = new HalfEdge(this, _v1, D);
                Edge2 = new HalfEdge(this, _v2, D);

                Edge0.NextEdge = Edge1;
                Edge1.NextEdge = Edge2;
                Edge2.NextEdge = Edge0;

                var pts = D.Points;

                Geom.Circumcircle(pts[_v0], pts[_v1], pts[_v2], out CCX, out CCY, out CCRSq);
                PrevTri    = _d.LastTri;
                _d.LastTri = this;
                _d.m_TriCount++;
            }
Exemplo n.º 3
0
        private bool SolveDegenerate(Triangle.HalfEdge _edge)
        {
            var pts = _edge.D.Points;
            var ab0 = pts[_edge.OriginIdx];
            var ab1 = pts[_edge.NextEdge.OriginIdx];
            var a2  = pts[_edge.NextEdge.NextEdge.OriginIdx];
            var b2  = pts[_edge.Twin.NextEdge.NextEdge.OriginIdx];

            var nab0 = RndLinXfrm(ab0);
            var nab1 = RndLinXfrm(ab1);
            var na2  = RndLinXfrm(a2);
            var nb2  = RndLinXfrm(b2);

            float tACCX, tACCY, tACCRSq, tBCCX, tBCCY, tBCCRSq;

            Geom.Circumcircle(nab0, nab1, na2, out tACCX, out tACCY, out tACCRSq);

            Geom.Circumcircle(nab1, nab0, nb2, out tBCCX, out tBCCY, out tBCCRSq);

            var a2toCCB = na2.SqrMagFast(tBCCX, tBCCY);
            var b2toCCA = nb2.SqrMagFast(tACCX, tACCY);

            return(a2toCCB >= tBCCRSq && b2toCCA >= tACCRSq);
        }
Exemplo n.º 4
0
        public void Legalize(params Triangle.HalfEdge[] _edges)
        {
            for (var eIdx = 0; eIdx < _edges.Length; ++eIdx)
            {
                m_EdgeStack.Push(_edges[eIdx]);
            }

            while (m_EdgeStack.Count != 0)
            {
                var curEdgeA0 = m_EdgeStack.Pop();
                var curTwinB0 = curEdgeA0.Twin;
                var pts       = curEdgeA0.D.Points;
                var triA      = curEdgeA0.Triangle;
                var triB      = curTwinB0.Triangle;
                //Get edges quickly
                var newEB2 = curEdgeA0.NextEdge;
                var newEA1 = newEB2.NextEdge;
                var newEA2 = curTwinB0.NextEdge;
                var newEB1 = newEA2.NextEdge;

                var a2Idx = newEA1.OriginIdx;
                var b2Idx = newEB1.OriginIdx;

                var a2 = pts[a2Idx];
                var b2 = pts[b2Idx];
                //Check if legal local Delaunay
                {
                    var a2toCCB = a2.SqrMagFast(triB.CCX, triB.CCY);
                    var b2toCCA = b2.SqrMagFast(triA.CCX, triA.CCY);
                    if (a2toCCB >= triB.CCRSq && b2toCCA >= triA.CCRSq)
                    {
                        continue;
                    }

                    if (AreCocircular(curEdgeA0))
                    {
                        if (SolveDegenerate(curEdgeA0))
                        {
                            continue;
                        }
                    }
                }
                //Flip edge
                {
                    curEdgeA0.OriginIdx = b2Idx;
                    curTwinB0.OriginIdx = a2Idx;


                    curEdgeA0.NextEdge = newEA1;
                    newEA1.NextEdge    = newEA2;
                    newEA2.NextEdge    = curEdgeA0;


                    curTwinB0.NextEdge = newEB1;
                    newEB1.NextEdge    = newEB2;
                    newEB2.NextEdge    = curTwinB0;

                    newEA2.Triangle = triA;
                    newEB2.Triangle = triB;

                    triA.Edge0 = curEdgeA0;
                    triA.Edge1 = newEA1;
                    triA.Edge2 = newEA2;
                    triB.Edge0 = curTwinB0;
                    triB.Edge1 = newEB1;
                    triB.Edge2 = newEB2;

                    m_RefOuterEdges[0] = newEA1;
                    m_RefOuterEdges[1] = newEA2;
                    m_RefOuterEdges[2] = newEB1;
                    m_RefOuterEdges[3] = newEB2;


                    Geom.Circumcircle(pts[curEdgeA0.OriginIdx], pts[newEA1.OriginIdx], pts[newEA2.OriginIdx],
                                      out triA.CCX, out triA.CCY, out triA.CCRSq);

                    Geom.Circumcircle(pts[curTwinB0.OriginIdx], pts[newEB1.OriginIdx], pts[newEB2.OriginIdx],
                                      out triB.CCX, out triB.CCY, out triB.CCRSq);
                }

                foreach (var oEdge in m_RefOuterEdges)
                {
                    if (oEdge.Twin != null)
                    {
                        m_EdgeStack.Push(oEdge);
                    }
                }
            }
        }