Example #1
0
        public float Direct(SURFACE s0, PO p0)
        {
            util u1 = new util();
            PO   p1, p2, p3, vec1, vec2, vec, vecx;

            p1   = s0.p1;
            p2   = s0.p2;
            p3   = s0.p3;
            vec1 = new PO();
            vec2 = new PO();
            vec  = new PO();
            vecx = new PO();
            cal_vec(p1, p2, vec1);
            cal_vec(p1, p3, vec2);
            //u1.InFile("e:/info.txt","---start Direct---");
            //vec1.ToPrint();
            //vec2.ToPrint();
            cal_vecdot(vec1, vec2, vec);//计算向量积
            //vec.ToPrint();
            cal_vec(p1, p0, vecx);
            //vecx.ToPrint();
            //u1.InFile("e:/info.txt", "---end Direct---");
            if (System.Math.Abs(Dot(vec, vecx)) > 0.0001)
            {
                return(Dot(vec, vecx));
            }
            else
            {
                return(0);
            }
        }
Example #2
0
        private void AddSurface(SURFACE s, LINE lk, SURFACE cur_s)
        {
            /*
             * 根据s与lk的面链的头尾的面的关系来确定s应该放在面链的头还是尾
             * 如果该边已经封闭则返回true,否则返回false
             */
            util    u1 = new util();
            SURFACE Last_s;

            if (lk.sl.Head == null)
            {
                lk.sl.Insert(s);
            }
            else
            {
                if (Surface_belong_line(lk, s))
                {
                    return;
                }
                Last_s = lk.sl.Last.Data;//获取面链尾部的面
                if (cur_s.id == Last_s.id)
                {
                    lk.sl.Insert(s);
                }
                else
                {
                    lk.sl.Head_Insert(s);
                }
            }
        }
Example #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--");
        }
Example #4
0
        private SURFACE New_SURFACE(PO p1, PO p2, PO p3)
        {
            SURFACE s0 = new SURFACE(p1, p2, p3);

            s0.id = sid++;
            return(s0);
        }
Example #5
0
 private void Output(SURFACE s0)
 {
     info.Insert("------surface-------");
     info.Insert("po:" + '(' + s0.p1.x + ',' + s0.p1.y + ',' + s0.p1.z + ')');
     info.Insert("po:" + '(' + s0.p2.x + ',' + s0.p2.y + ',' + s0.p2.z + ')');
     info.Insert("po:" + '(' + s0.p3.x + ',' + s0.p3.y + ',' + s0.p3.z + ')');
     info.Insert("------surface end-------");
 }
Example #6
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);
        }
Example #7
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;
            }
        }
Example #8
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);
        }
Example #9
0
        private int Stateofsurface(SURFACE s0, PO po)
        {
            /*
             * 分析po与s0的关系,
             * 如果po与s0的一个点共边,返回1;两个点共边,返回2;三个点共边,返回3
             */
            int num_coin_po = 0;

            if (OutSideofpo(s0.p1, po) != null)
            {
                num_coin_po++;
            }
            if (OutSideofpo(s0.p2, po) != null)
            {
                num_coin_po++;
            }
            if (OutSideofpo(s0.p3, po) != null)
            {
                num_coin_po++;
            }
            return(num_coin_po);
        }
Example #10
0
        private bool Surface_belong_line(LINE l0, SURFACE s0)
        {
            /*
             * 判断s0是否已经存在于l0的面链上
             * 是,返回true;否,返回false;
             */
            Node <SURFACE> sn = l0.sl.Head;

            if (l0.shadow_ll != null)
            {
                Node <LINE> ln = l0.shadow_ll.Head;
                while (ln != null)
                {
                    sn = ln.Data.sl.Head;
                    while (sn != null)
                    {
                        if (sn.Data.id == s0.id)
                        {
                            return(true);
                        }
                        sn = sn.Next;
                    }
                    ln = ln.Next;
                }
            }
            else
            {
                while (sn != null)
                {
                    if (sn.Data.id == s0.id)
                    {
                        return(true);
                    }
                    sn = sn.Next;
                }
            }
            return(false);
        }
Example #11
0
 public void GetSL(SURFACE s0)
 {
     sl.Insert(s0);
     return;
 }