Ejemplo n.º 1
0
        private void Open_direction(LINE l0, PO pk)
        {
            //开启尾面的未搜索方向
            Node <SURFACE> stail, stailp, sn;

            sn     = l0.sl.Head;
            stail  = null;
            stailp = null;
            while (sn.Next != null)
            {
                stailp = sn;
                stail  = sn.Next;
                sn     = sn.Next;
            }
            PO pt;

            pt = stailp.Data.GetPd(l0);
            util u1 = new util();

            if (u1.Direct(stail.Data, pt) > 0)
            {
                stail.Data.negtive = true;
            }
            else
            {
                stail.Data.positive = true;
            }
        }
Ejemplo n.º 2
0
        private void Set_direction(SURFACE s, PO p0)
        {
            /*
             * 根据p0与s的相互关系,决定s的某个方向上是否有效
             * 设定为无效,则对应的标志为
             */
            util  u1 = new util();
            float f;

            f = u1.Direct(s, p0);
            if (f > 0)
            {
                s.positive = false;
            }
            else if (f < 0)
            {
                s.negtive = false;
            }
        }
Ejemplo n.º 3
0
        public bool noSearched(SURFACE s, PO p0)
        {
            /*
             * 判断某个面的某个方向是否被搜索过,
             * 搜索过返回true,未搜索过返回false
             */
            util  u1 = new util();
            float f;

            f = u1.Direct(s, p0);
            if (f > 0 && s.positive)
            {
                return(true);
            }
            else if (f < 0 && s.negtive)
            {
                return(true);
            }
            return(false);
        }
Ejemplo n.º 4
0
        private void Insert(LINE lk)
        {
            /*
             * lk:某个正在被操作的边,本函数的目的是将某个生成面加到与该
             * 边以工作面相连的边的面链合适的位置
             */
            util    u1 = new util();
            SURFACE Last_s, First_s;//保存l0面链尾上的面对象;

            Last_s  = lk.sl.Last.Data;
            First_s = lk.sl.Head.Data;
            PO pi, pj, pd, pfd;//当前所处理的面的三个顶点

            pi  = lk.p1;
            pj  = lk.p2;
            pd  = Last_s.GetPd(lk);          //获取面slast上除边l0外的剩余的点
            pfd = lk.sl.Head.Data.GetPd(lk); //获取面链上首面除边l0外的剩余的点
            LINE lk1, lk2;                   //取l0面链尾面除lk外的其他两条边

            lk1 = Last_s.GetLine(pi, pd);
            lk2 = Last_s.GetLine(pj, pd);
            LINE    l1, l2, l3; //新生成的三条边
            SURFACE s, s1, s2;  //新生成的三个面

            if (!u1.noSearched(First_s, pg) && u1.noSearched(First_s, pd))
            {
                pg = pfd;
            }
            if (pg.selected)
            {
                int State;
                State = Stateofsurface(Last_s, pg);
                if (State == 1 || State == 0)
                {
                    info.Insert("pg与Last_s的一个定点或零个顶点共边");
                    #region pg与Last_s的一个定点或零个顶点共边
                    l1 = Get_LINE_From_One_Po(pi, pg);
                    l2 = Get_LINE_From_One_Po(pd, pg);
                    l3 = Get_LINE_From_One_Po(pj, pg);
                    //生成的三条边l1,l2,l3,加入工作链中
                    Set_direction(Last_s, pg);
                    s    = New_SURFACE(pi, pj, pg);
                    s.l1 = l1;
                    s.l2 = l3;
                    s.l3 = lk;
                    PAINT.GetSL(s);
                    Set_direction(s, pd);
                    s1    = New_SURFACE(pi, pd, pg);
                    s1.l1 = l1;
                    s1.l2 = lk1;
                    s1.l3 = l2;
                    PAINT.GetSL(s1);
                    Set_direction(s1, pj);
                    s2    = New_SURFACE(pg, pj, pd);
                    s2.l1 = l2;
                    s2.l2 = l3;
                    s2.l3 = lk2;
                    PAINT.GetSL(s2);
                    Set_direction(s2, pi);
                    //将生成的面加到边的面链中
                    AddSurface(s, lk, Last_s);
                    AddSurface(s, l1, Last_s);//将面加到l1的面链中去
                    AddSurface(s, l3, Last_s);
                    AddSurface(s1, l1, Last_s);
                    AddSurface(s1, lk1, Last_s);
                    AddSurface(s1, l2, Last_s);
                    AddSurface(s2, l3, Last_s);
                    AddSurface(s2, lk2, Last_s);
                    AddSurface(s2, l2, Last_s);
                    #endregion
                    sn_current = sn_current.Next;
                }
                else
                {
                    info.Insert("pg与Last_s的两个顶点或三个顶点共边");
                    LINE l_shadow = Get_LINE_From_One_Po(lk, pg);
                    if (l_shadow != null && !First_s.Belongme(pg))
                    {
                        if (u1.Direct(l_shadow.sl.Head.Data, pg) * u1.Direct(l_shadow.sl.Head.Data, pd) < 0)
                        {
                            pg = l_shadow.sl.Head.Data.GetPd(lk);
                        }
                        if (u1.Direct(l_shadow.sl.Last.Data, pg) * u1.Direct(l_shadow.sl.Last.Data, pd) < 0)
                        {
                            pg = l_shadow.sl.Last.Data.GetPd(lk);
                        }
                        #region pg与Last_s的两个顶点或三个顶点共边
                        l1 = New_LINE(pi, pg);
                        l2 = New_LINE(pd, pg);
                        l3 = New_LINE(pj, pg);
                        Set_direction(Last_s, pg);
                        s    = New_SURFACE(lk, pg);
                        s.l1 = l1;
                        s.l2 = l3;
                        s.l3 = lk;
                        Set_direction(s, pd);
                        s1    = New_SURFACE(lk1, pg);
                        s1.l1 = l1;
                        s1.l2 = lk1;
                        s1.l3 = l2;
                        Set_direction(s1, pj);
                        s2    = New_SURFACE(lk2, pg);
                        s2.l1 = l2;
                        s2.l2 = l3;
                        s2.l3 = lk2;
                        Set_direction(s2, pi);
                        //将生成的面加到边的面链中
                        AddSurface(s, lk, Last_s);
                        AddSurface(s, l1, Last_s);//将面加到l1的面链中去
                        AddSurface(s, l3, Last_s);
                        AddSurface(s1, l1, Last_s);
                        AddSurface(s1, lk1, Last_s);
                        AddSurface(s1, l2, Last_s);
                        AddSurface(s2, l3, Last_s);
                        AddSurface(s2, lk2, Last_s);
                        AddSurface(s2, l2, Last_s);
                        #endregion
                        Shadow_Delete(lk, pd, l_shadow, pg);
                    }
                    else
                    {
                        #region pg与Last_s的两个顶点或三个顶点共边
                        l1 = New_LINE(pi, pg);
                        l2 = New_LINE(pd, pg);
                        l3 = New_LINE(pj, pg);
                        Set_direction(Last_s, pg);
                        s    = New_SURFACE(lk, pg);
                        s.l1 = l1;
                        s.l2 = l3;
                        s.l3 = lk;
                        Set_direction(s, pd);
                        s1    = New_SURFACE(lk1, pg);
                        s1.l1 = l1;
                        s1.l2 = lk1;
                        s1.l3 = l2;
                        Set_direction(s1, pj);
                        s2    = New_SURFACE(lk2, pg);
                        s2.l1 = l2;
                        s2.l2 = l3;
                        s2.l3 = lk2;
                        Set_direction(s2, pi);
                        //将生成的面加到边的面链中
                        AddSurface(s, lk, Last_s);
                        AddSurface(s, l1, Last_s);//将面加到l1的面链中去
                        AddSurface(s, l3, Last_s);
                        AddSurface(s1, l1, Last_s);
                        AddSurface(s1, lk1, Last_s);
                        AddSurface(s1, l2, Last_s);
                        AddSurface(s2, l3, Last_s);
                        AddSurface(s2, lk2, Last_s);
                        AddSurface(s2, l2, Last_s);
                        #endregion
                        sn_current = sn_current.Next;
                    }
                }
            }
            else
            {
                #region pg是一个普通点
                l1 = new LINE(pg, pi);
                l2 = new LINE(pg, pd);
                l3 = new LINE(pg, pj);
                PAINT.GetLL(l1);
                PAINT.GetLL(l2);
                PAINT.GetLL(l3);
                //生成的三条边l1,l2,l3,加入工作链中
                pg.ll.Insert(l1);
                pg.ll.Insert(l2);
                pg.ll.Insert(l3);
                pi.ll.Insert(l1);
                pd.ll.Insert(l2);
                pj.ll.Insert(l3);
                Set_direction(Last_s, pg);
                s    = New_SURFACE(pi, pj, pg);
                s.l1 = l1;
                s.l2 = l3;
                s.l3 = lk;
                PAINT.GetSL(s);
                Set_direction(s, pd);
                s1    = New_SURFACE(pi, pd, pg);
                s1.l1 = l1;
                s1.l2 = lk1;
                s1.l3 = l2;
                PAINT.GetSL(s1);
                Set_direction(s1, pj);
                s2    = New_SURFACE(pg, pj, pd);
                s2.l1 = l2;
                s2.l2 = l3;
                s2.l3 = lk2;
                PAINT.GetSL(s2);
                Set_direction(s2, pi);
                //将生成的面加到边的面链中
                AddSurface(s, lk, Last_s);
                AddSurface(s, l1, Last_s);//将面加到l1的面链中去
                AddSurface(s, l3, Last_s);
                AddSurface(s1, l1, Last_s);
                AddSurface(s1, lk1, Last_s);
                AddSurface(s1, l2, Last_s);
                AddSurface(s2, l3, Last_s);
                AddSurface(s2, lk2, Last_s);
                AddSurface(s2, l2, Last_s);
                pg.selected = true;
                work_pl.Insert(pg);
                #endregion
                sn_current = sn_current.Next;
            }
        }