예제 #1
0
        //------------------------------------------------------------------------------

        private OutPtTri InsertPt(Point pt, OutPt afterOutPt)
        {
            OutPtTri result = (OutPtTri)CreateOutPt();

            result.Pt            = pt;
            result.Prev          = afterOutPt;
            result.Next          = afterOutPt.Next;
            result.outrec        = (afterOutPt as OutPtTri).outrec;
            result.rightOutrec   = null;
            afterOutPt.Next.Prev = result;
            afterOutPt.Next      = result;
            return(result);
        }
예제 #2
0
        //------------------------------------------------------------------------------

        void Update(OutPt op, OutRec outrec)
        {
            OutPt op2 = op;

            do
            {
                OutPtTri opt = (OutPtTri)op2;
                if (opt.rightOutrec != null)
                {
                    UpdateHelper(opt.rightOutrec, null);
                }
                opt.outrec = outrec;
                op2        = op2.Next;
            } while (op2 != op);
        }
예제 #3
0
        //------------------------------------------------------------------------------

        protected override void AddLocalMaxPoly(Active e1, Active e2, Point Pt)
        {
            OutRec outrec = e1.OutRec;
            //very occasionally IsStartSide(e1) is wrong so ...
            bool is_outer = IsStartSide(e1) || (e1.OutRec == e2.OutRec);

            if (is_outer)
            {
                OutRecTri ort = (OutRecTri)(e1.OutRec);
                if (ort.leftOutpt != null)
                {
                    UpdateHelper(outrec, null);
                }
                UpdateHelper(e2.OutRec, null);
            }

            base.AddLocalMaxPoly(e1, e2, Pt);

            if (outrec.Pts == null)
            {
                outrec = outrec.Owner;
            }

            if (is_outer)
            {
                OutPtTri ort  = (OutPtTri)outrec.Pts;
                OutPtTri ort2 = (OutPtTri)outrec.Pts.Next;
                if (ort.rightOutrec != null)
                {
                    UpdateHelper(ort.rightOutrec, null);
                }
                else if (ort2.rightOutrec != null)
                {
                    UpdateHelper(ort2.rightOutrec, null);
                }
            }
            else
            {
                Active e = GetRightAdjacentHotEdge(e2);
                if (e != null)
                {
                    UpdateHelper(e.OutRec, LastOp);
                }
                Update(outrec.Pts, outrec);
            }
            Triangulate(outrec);
        }
예제 #4
0
        //------------------------------------------------------------------------------

        private void DisposeOutPt(OutPt op)
        {
            if (op.Prev != null)
            {
                op.Prev.Next = op.Next;
            }
            if (op.Next != null)
            {
                op.Next.Prev = op.Prev;
            }
            OutPtTri opt = (OutPtTri)op;

            if (opt.rightOutrec != null)
            {
                opt.rightOutrec.leftOutpt = null;
            }
        }
예제 #5
0
        //------------------------------------------------------------------------------

        protected override OutPt AddOutPt(Active e, Point pt)
        {
            OutPt    result = base.AddOutPt(e, pt);
            OutPtTri opt    = (OutPtTri)result;

            opt.outrec = e.OutRec;
            LastOp     = result;
            Triangulate(e.OutRec);
            //Triangulate() above may assign Result.OutRecRt so ...
            if (IsStartSide(e) && opt.rightOutrec == null)
            {
                Active e2 = GetRightAdjacentHotEdge(e);
                if (e2 != null)
                {
                    UpdateHelper(e2.OutRec, result);
                }
            }
            return(result);
        }
예제 #6
0
        //------------------------------------------------------------------------------

        private void UpdateHelper(OutRec rightOutrec, OutPt leftOutpt)
        {
            OutPtTri  leftOpt  = (OutPtTri)leftOutpt;
            OutRecTri rightOrt = (OutRecTri)rightOutrec;

            if (leftOpt != null && leftOpt.rightOutrec != null)
            {
                leftOpt.rightOutrec.leftOutpt = null;
            }
            if (rightOrt.leftOutpt != null)
            {
                rightOrt.leftOutpt.rightOutrec = null;
            }
            rightOrt.leftOutpt = leftOpt;
            if (leftOpt != null)
            {
                leftOpt.rightOutrec = rightOrt;
            }
        }