Ejemplo n.º 1
0
        public SURFACE Get_Surface(SURFACE s0)
        {
            /*
             * 返回在当前线的面链中与当前面s0相邻的面,而且该面在面s0的合适位置
             */
            util           u1 = new util();
            Node <SURFACE> sn = sl.Head;
            PO             pt;//用于记录需要检测的面上的一个点

            //如果s0是sl的第一个面,则返回sl的最后一个面
            if (sn.Data == s0 && sl.Head.Next != null)
            {
                pt = sl.Last.Data.GetPd(this);
                if (u1.noSearched(sn.Data, pt))
                {
                    return(sl.Last.Data);
                }
            }
            //如果s0是最后一个面,返回第一个面
            if (sl.Last.Data == s0 && sl.Head != sl.Last)
            {
                pt = sl.Head.Data.GetPd(this);
                if (u1.noSearched(sl.Last.Data, pt))
                {
                    return(sl.Head.Data);
                }
            }
            //如果s0既不是第一个面也不是最后一个面
            while (sn != null)
            {
                //考查s0的后一个面
                if (sn.Data == s0 && sn.Next != null)
                {
                    pt = sn.Next.Data.GetPd(this);
                    if (u1.noSearched(sn.Data, pt))
                    {
                        return(sn.Next.Data);
                    }
                }
                //考查s0的前一个面
                if (sn.Next != null && sn.Next.Data == s0)
                {
                    pt = sn.Data.GetPd(this);
                    if (u1.noSearched(sn.Next.Data, pt))
                    {
                        return(sn.Data);
                    }
                }
                sn = sn.Next;
            }
            //如果sl中不存在s0面
            return(null);
        }
Ejemplo n.º 2
0
        private void SearchD(LINE l0)
        {
            /*
             * 针对某个面,在模型的点链中搜索某个满足条件的点
             */
            pg = null;
            Node <PO> pt = null;

            soliangle1 = 0;
            util u1 = new util();

            u1.InFile(u1.infopath, "--start SearchD--");
            pt = pl.Head;
            while (pt != null)
            {
                soliangle2 = u1.d2_Cal_Op_Angle(l0, pt.Data);
                if (soliangle1 < soliangle2 && u1.noSearched(l0, pt.Data))
                {
                    soliangle1 = soliangle2;
                    pg         = pt.Data;
                }
                pt = pt.Next;
            }
            u1.InFile(u1.infopath, "--end SearchD--");
        }
Ejemplo n.º 3
0
        private void SearchD(SURFACE s0)
        {
            /*
             * 针对某个面,在模型的点链中搜索某个满足条件的点
             */
            pi = s0.p1;
            pj = s0.p2;
            pk = s0.p3;
            pg = null;
            Node <PO> pt = null;

            soliangle1 = 0;
            util u1 = new util();

            info.Insert("--start SearchD--");
            pt = pl.Head;
            while (pt != null)
            {
                soliangle2 = u1.d3_Cal_Solid_Angle(pt.Data, pi, pj, pk);
                if (soliangle1 < soliangle2 && u1.noSearched(s0, pt.Data))
                {
                    soliangle1 = soliangle2;
                    pg         = pt.Data;
                }
                pt = pt.Next;
            }
            info.Insert("--end SearchD--");
        }
Ejemplo n.º 4
0
        void SearchD()
        {
            util u1 = new util();

            soliangle1 = 0;
            int   i, j;
            float d;

            d  = 3;
            pg = null;
            LINE      l0 = nt_current.Data;
            Node <PO> pn;
            Node <PO> cn;

            do
            {
                Two_po_netnumberlist(l0, d);
                pn = net_choosed.Head;
                while (pn != null)
                {
                    if (pn.Data.x >= 0 && pn.Data.x < Mx && pn.Data.y >= 0 && pn.Data.y < Ny)
                    {
                        i  = (int)pn.Data.x;
                        j  = (int)pn.Data.y;
                        cn = DataNet[i, j].Head;
                        while (cn != null)
                        {
                            soliangle2 = u1.d2_Cal_Op_Angle(l0, cn.Data);
                            if (soliangle1 < soliangle2 && u1.noSearched(l0, cn.Data))
                            {
                                //u1.InFile(u1.infopath,"change it");
                                soliangle1 = soliangle2;
                                pg         = cn.Data;
                            }
                            cn = cn.Next;
                        }
                    }
                    pn = pn.Next;
                }
                d += Xi;
            } while (d < 5 && pg == null);
        }
Ejemplo n.º 5
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;
            }
        }
Ejemplo n.º 6
0
        private void Insert1()
        {
            util u1 = new util();
            LINE l0 = nt_current.Data;

            pg.ToPrint(info);
            /*获取线链的头边和尾边的外端点*/
            PO PLa, PFa;

            if (pkey.IsEqualToMe(l0.p1))
            {
                PLa = l0.p2;
            }
            else
            {
                PLa = l0.p1;
            }
            if (pkey.IsEqualToMe(pre_l.Head.Data.p1))
            {
                PFa = pre_l.Head.Data.p2;
            }
            else
            {
                PFa = pre_l.Head.Data.p1;
            }
            if (pg.selected)
            {
                info.Insert("po selected");
            }
            else
            {
                info.Insert("po not selected");
            }
            LINE lt;//获取相应边

            info.Insert("t4");
            #region PLa-PFa已存在
            //如果PLa-PFa已存在,且尾边位于首边未搜索侧或首边两侧都搜索过
            lt = Is_OutSide(PLa, PFa);
            if (lt != null)
            {
                info.Insert("ok");
            }
            if (lt != null && (u1.noSearched(pre_l.Head.Data, PLa) || !pre_l.Head.Data.positive && !pre_l.Head.Data.negtive) && pkey.key != 3)
            {
                info.Insert("t1");
                pkey.non_merged = false;
                Set_direction(pre_l.Head.Data, PLa);
                Set_direction(pre_l.Last.Data, PFa);
                Set_direction(lt, pkey);
                nt_current = nt_current.Next;
                // u1.InFile(u1.tri_num, (numbertri++).ToString() + '\t' + pkey.number + '\t' + PLa.number + '\t' + PFa.number);
                return;
            }
            #endregion
            //后面的没有PLa-PFa已存在的情况
            #region pg位于其已搜索侧
            if (!u1.noSearched(pre_l.Head.Data, pg) && u1.noSearched(pre_l.Head.Data, PLa) || pg == PFa)
            {
                //pg是当前边首边的外端点
                info.Insert("t3");
                pkey.non_merged = false;
                Set_direction(pre_l.Head.Data, PLa);
                Set_direction(l0, PFa);
                AddLine(PFa, PLa, pkey);
                nt_current = nt_current.Next;
                return;
                //u1.InFile(u1.tri_num, (numbertri++).ToString() + '\t' + pkey.number + '\t' + PLa.number + '\t' + PFa.number);
            }
            #endregion
            if (pg.selected)
            {
                //如果pg已经被选过
                #region delete shadowpo
                //当前被处理的点的影子点位于pg的边链上
                LINE shadow_l = Is_OutSide(pg, pkey);
                if (shadow_l != null)
                {
                    info.Insert("shadow_pg_side");
                    PO shadow_po = shadow_l.getanotherpo(pg);
                    PO shadow_po1, shadow_po2, shadow_pokey;
                    shadow_po1 = shadow_po.ll.Head.Data.getanotherpo(shadow_po);
                    shadow_po2 = shadow_po.ll.Last.Data.getanotherpo(shadow_po);
                    float shadow_ang1, shadow_ang2;
                    shadow_pokey = shadow_po1;
                    shadow_ang1  = u1.d2_Cal_Op_Angle(PLa, shadow_po1, pkey);
                    shadow_ang2  = u1.d2_Cal_Op_Angle(PLa, shadow_po2, pkey);
                    if (shadow_ang2 < shadow_ang1)
                    {
                        shadow_pokey = shadow_po2;
                    }
                    lt = Is_OutSide(shadow_pokey, PLa);
                    if (lt == null)
                    {
                        lt = AddLine(shadow_pokey, PLa, shadow_po);
                    }
                    PAINT.GetLL(lt);
                    shadowPO(shadow_po, shadow_pokey, pkey, PLa);
                    nt_current = pkey.ll.Last;
                    return;
                }
                #endregion
                #region last's outside
                //如果pg是last的边链的外端点
                lt = Is_OutSide(PLa, pg);
                if (lt != null)
                {
                    info.Insert("last's  outside\n");
                    Set_direction(pre_l.Last.Data, pg);
                    AddLine(pkey, pg, PLa);
                    //以上两句代码的顺序不能反,否则会出错
                    Set_direction(lt, pkey);
                    nt_current = nt_current.Next;
                    return;
                }
                #endregion last'soutside
                #region shadow_deal
                #region create shadowpo
                //如果pg是非特殊位置
                info.Insert("arbitrary POint\n");
                PO pt = new PO(pg.x, pg.y, pg.z);
                if (pg.shadow_pl != null)
                {
                    pg.shadow_pl.Insert(pt);
                }
                else
                {
                    info.Insert("add new shadow po\n");
                    pg.shadow_pl = new LinkList <PO>();
                    pg.shadow_pl.Insert(pg);
                    pg.shadow_pl.Insert(pt);
                }
                pt.shadow_pl = pg.shadow_pl;
                pg           = pt;
                //u1.InFile(u1.infopath, "here1");
                AddLine(pkey, pg, PLa);
                // u1.InFile(u1.infopath, "here2");
                AddLine(PLa, pg, pkey);
                //u1.InFile(u1.infopath, "here3");
                Set_direction(l0, pg);
                // u1.InFile(u1.infopath, "here4");
                //u1.InFile(u1.tri_num, (numbertri++).ToString() + '\t' + pkey.number + '\t' + PLa.number + '\t' + pg.number);
                work_pl.Insert(pg);
                //u1.InFile(u1.infopath,"here5");
                pg.selected = true;
                nt_current  = nt_current.Next;
                #endregion
                #endregion
            }
            else
            {
                #region ordinary_po
                info.Insert("ordinary point" + pg.number);
                //pg作为普通点处理
                pg.number   = number++;
                pg.selected = true;
                //u1.InFile(u1.node_key, pg.number.ToString() + '\t' + pg.x + '\t' + pg.y + '\t' + pg.key);
                AddLine(pkey, pg, PLa);
                AddLine(PLa, pg, pkey);
                Set_direction(l0, pg);
                //u1.InFile(u1.tri_num, (numbertri++).ToString() + '\t' + pkey.number + '\t' + PLa.number + '\t' + pg.number);
                if (pg.key != 3)
                {
                    work_pl.Insert(pg);
                }
                //work_pl.Dispaly();
                nt_current = nt_current.Next;
                #endregion
            }
        }