Ejemplo n.º 1
0
        public void SearchPoint(int num)
        {
            //Delaunay算法的主函数,遍历边链的每一条边,并分别进行处理
            util      u1 = new util();
            Node <PO> pt = work_pl.Head;

            u1.InFile(u1.infopath, "--start SearchPoint--");
            for (int i = 0; i < num; i++)
            {
                loc = i;
                if (pt == null)
                {
                    break;
                }
                u1.InFile(u1.infopath, i);
                pkey = pt.Data;
                pt.Data.ToString();//输出当前需要处理的点
                pre_l = pt.Data.ll;
                SearchLine();
                //PEBIGrid(pt.Data);
                pt = pt.Next;
                //pkey.ll.Dispaly();
                //u1.InFile(u1.infopath, i);
                //work_pl.Dispaly();
            }
            PAINT.SetPL(work_pl);
            u1.InFile(u1.infopath, "--SearchPoint end--");
        }
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
        public void ToPrint()
        {
            util u1 = new util();

            u1.InFile(u1.infopath, "---LINE---");
            p1.ToPrint();
            p2.ToPrint();
            u1.InFile(u1.infopath, "---end---");
        }
Ejemplo n.º 4
0
        public override string ToString()
        {
            util   u1  = new util();
            string str = "ok";

            u1.InFile(u1.infopath, "---LINE---");
            p1.ToPrint();
            p2.ToPrint();
            u1.InFile(u1.infopath, "---end---");
            return(":" + '(' + p1.x + ',' + p1.y + ',' + p1.z + ')' + '(' + p2.x + ',' + p2.y + ',' + p2.z + ')');
        }
Ejemplo n.º 5
0
        public override string ToString()
        {
            util u1 = new util();

            u1.InFile(u1.infopath, "---surface---");
            p1.ToPrint();
            p2.ToPrint();
            p3.ToPrint();
            u1.InFile(u1.infopath, "---end---");
            return("ok");
        }
Ejemplo n.º 6
0
        public override string  ToString()
        {
            util u1 = new util();

            u1.InFile(u1.infopath, this);
            return(":" + '(' + x + ',' + y + ',' + z + ')');
        }
Ejemplo n.º 7
0
        private float[,] Array_Multi(float[,] a, float[,] b)
        {
            //计算矩阵乘法a*b;
            util u1 = new util();
            int  ro1, ro2, co1, co2;

            ro1 = 3;
            co1 = 3;
            ro2 = 3;
            co2 = b.Length;
            u1.InFile(u1.infopath, co2);
            float[,] re = new float[co1, ro2];
            float temp;

            for (int i = 0; i < co1; i++)
            {
                for (int j = 0; j < co2; j++)
                {
                    temp = 0;
                    for (int k = 0; k < co1; k++)
                    {
                        temp = temp + a[i, k] * b[k, j];
                    }
                    re[i, j] = temp;
                }
            }
            return(re);
        }
Ejemplo n.º 8
0
        private float[,] Inverse(float[,] a)
        {
            //求矩阵a的逆矩阵
            util u1 = new util();

            float[,] b = new float[3, 3];
            float deter;

            deter = a[0, 0] * a[1, 1] * a[2, 2] + a[0, 1] * a[1, 2] * a[2, 0] + a[1, 0] * a[2, 1] * a[0, 2] -
                    a[0, 2] * a[1, 1] * a[2, 0] - a[0, 0] * a[2, 1] * a[1, 2] - a[0, 1] * a[1, 0] * a[2, 2];
            if (deter != 0)
            {
                b[0, 0] = (a[1, 1] * a[2, 2] - a[1, 2] * a[2, 1]) / deter;
                b[0, 1] = -(a[1, 0] * a[2, 2] - a[1, 2] * a[2, 0]) / deter;
                b[0, 2] = (a[1, 0] * a[2, 1] - a[1, 1] * a[2, 0]) / deter;
                b[1, 0] = -(a[0, 1] * a[2, 2] - a[0, 2] * a[2, 1]) / deter;
                b[1, 1] = (a[0, 0] * a[2, 2] - a[0, 2] * a[2, 0]) / deter;
                b[1, 2] = -(a[0, 0] * a[2, 1] - a[0, 1] * a[2, 0]) / deter;
                b[2, 0] = (a[0, 1] * a[1, 2] - a[1, 1] * a[0, 2]) / deter;
                b[2, 1] = -(a[0, 0] * a[1, 2] - a[1, 0] * a[0, 2]) / deter;
                b[2, 2] = (a[0, 0] * a[1, 1] - a[1, 0] * a[0, 1]) / deter;
                return(b);
            }
            else
            {
                u1.InFile(u1.infopath, "det equals zero!!!");
                return(null);
            }
        }
Ejemplo n.º 9
0
        //处理两个直井之间的冲突
        private void CD_well_well(well2d w1, well2d w2)
        {
            util u1 = new util();
            PO   mid, p1, p2;

            mid   = new PO();
            mid.x = (w1.center.x * w1.ro + w2.center.x * w2.ro) / (w1.ro + w2.ro);
            mid.y = (w1.center.y * w1.ro + w2.center.y * w2.ro) / (w1.ro + w2.ro);
            p1    = u1.po_vertical(mid, w1.center, w2.center, 5);
            p2    = u1.po_vertical(mid, w2.center, w1.center, 5);
            u1.InFile(u1.tri_num, "-------------------IN well");
            Cal_new_edge_po_insert(w1, p1, p2);
            u1.InFile(u1.tri_num, "-------------------end well1");
            Cal_new_edge_po_insert(w2, p1, p2);
            u1.InFile(u1.tri_num, "-------------------end well");
        }
Ejemplo n.º 10
0
        public float Cal_surface_angle(PO p0, PO p1, PO p2, PO p4)
        {
            /*
             * p0p1构成旋转轴,p2辅助p0p1轴构成一个
             * 按右手规则的直角坐标系si
             * 计算p4点对应的夹角
             */
            util u1 = new util();
            PO   p3, p5;        //p2,p4对应的两个垂足
            PO   pi1, pj1, pz1; //si坐标系
            PO   pi, pj, pz;    //s坐标系

            pi = new PO(0, 0, 1);
            pj = new PO(0, 1, 0);
            pz = new PO(0, 0, 1);
            p3 = d3_Cal_Vec_Po_Line(p0, p1, p2);
            p5 = d3_Cal_Vec_Po_Line(p0, p1, p4);
            u1.InFile(u1.infopath, "ga1");
            pj1 = Po_vec_f(p1, GetUnitVector(p3, p2), 1);
            p4  = Po_vec_f(p1, GetUnitVector(p5, p4), 1);//计算p2,p4相对于旋转轴的位置
            pz1 = GetUnitVector(p1, p0);
            u1.InFile(u1.infopath, "ga2");
            pi1 = cal_vecdot(pz1, pj1);
            u1.InFile(u1.infopath, "ga3");
            PO[] px1 = new PO[3];
            PO[] px2 = new PO[3];
            PO[] px3 = new PO[1];
            px1[0] = pi1;
            px1[1] = pj1;
            px1[2] = pz1;
            px2[0] = pi;
            px2[1] = pj;
            px2[2] = pz;
            px3[0] = p4;
            float[,] v, u;
            float[,] x1, x2;
            v  = Vec_to_Array(px1);
            u  = Vec_to_Array(px2);
            x2 = Vec_to_Array(px3);
            u1.InFile(u1.infopath, "ga5");
            x1 = Array_Multi(Array_Multi(Inverse(v), u), x2);
            return(CalAgl(new PO(x1[0, 0], x1[0, 1])));
        }
Ejemplo n.º 11
0
        public void SearchLine()
        {
            //Delaunay算法的主函数,遍历边链的每一条边,并分别进行处理
            util u1 = new util();
            //pre_l.Dispaly();
            Node <LINE> lt = pre_l.Last;

            u1.InFile(u1.infopath, "--start SearchLine--");
            int num = 20;

            for (int i = 0; i < num; i++)
            {
                if (lt == null)
                {
                    break;
                }
                lt.Data.ToString();
                if (lt.Data.non_merged)
                {
                    SearchD(lt.Data);
                    if (pg != null)
                    {
                        Insert(lt.Data);
                    }
                    else
                    {
                        u1.InFile(u1.infopath, "no point finded");
                        break;
                    }
                }
                else
                {
                    u1.InFile(u1.infopath, "-----has been merged-----");
                }
                lt = lt.Next;
            }
            u1.InFile(u1.infopath, "--SearchLine end--");
        }
Ejemplo n.º 12
0
        public void START_Inmodel(OGL ogl)
        {
            util u1 = new util();

            //清空模型中产生的所有数据,并恢复到START运行前的状态;
            In_model();
            PAINT = ogl;
            change_OGL();
            ge_p_l.Clear();     //清空模型的生成点链;
            initial_pl.Clear(); //清空初始点链
            //保证结构参数不变
            Create_boundary_model();
            Generate_allmodel_edge_po();
            DealModuleConflict();
            plane.Get_model_l(model_l); //把模块链给plane
            plane.GenerateNetPo();      //plane根据自己的边界和模块产生点
            Generate_allmodel_po();     //产生所有模块的点
            u1.InFile(u1.wherepath, ge_p_l.num);
        }
Ejemplo n.º 13
0
        public void ToPrint()
        {
            util u1 = new util();

            u1.InFile(u1.infopath, this);
        }
Ejemplo n.º 14
0
        private void Insert(LINE l0)
        {
            util u1 = new util();

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

            if (pkey == l0.p1)
            {
                PLa = l0.p2;
            }
            else
            {
                PLa = l0.p1;
            }
            if (pkey == pre_l.Head.Data.p1)
            {
                PFa = pre_l.Head.Data.p2;
            }
            else
            {
                PFa = pre_l.Head.Data.p1;
            }
            //PFa.ToString();
            // pg.ToString();
            if (u1.IsXl(pg, PLa, PFa, pkey))
            {
                //pg是当前边首边的外端点
                AddLine(PFa, PLa, pkey);
                Set_direction(pre_l.Head.Data, PLa);
                Set_direction(l0, pkey);
            }
            else
            {
                if (pg.selected)
                {
                    //如果pg已经被选过
                    #region pg==PFa;
                    LINE lt;//获取相应边
                    if (pg == PFa)
                    {
                        lt = Is_OutSide(PLa, PFa);
                        lt = Is_OutSide(PLa, pg);
                        if (lt != null)
                        {
                            //如果PFa-PLa已存在
                            u1.InFile(u1.infopath, "PFa-PLa existed");
                            Set_direction(pre_l.Head.Data, PLa);
                            Set_direction(pre_l.Last.Data, PFa);
                            Set_direction(lt, pkey);
                            return;
                        }
                        else
                        {
                            // u1.InFile(u1.infopath, "PFa==pg");
                            AddLine(PFa, PLa, pkey);
                            Set_direction(pre_l.Head.Data, PLa);
                            Set_direction(l0, pkey);
                            return;
                        }
                    }
                    #endregion pg=PFa
                    #region last'soutside
                    //如果pg是last的边链的外端点
                    lt = Is_OutSide(PLa, pg);
                    if (lt != null)
                    {
                        //u1.InFile(u1.infopath, "last's  outside");
                        AddLine(pkey, pg, PLa);
                        Set_direction(lt, pkey);
                        Set_direction(pre_l.Last.Data, pg);
                        if (PLa.p_parent != null)
                        //如果当前点是影子点,调整边链
                        {
                            //u1.InFile(u1.infopath, "in shadow");
                            shadowpo(PLa, pkey, PLa.p_parent, pg);
                        }
                        return;
                    }
                    #endregion last'soutside
                    #region first'soutside
                    //如果pg是first的边链的外端点
                    lt = Is_OutSide(PFa, pg);
                    if (lt != null)
                    {
                        LINE lt2 = AddLine(pkey, pg, PLa);
                        AddLine(PLa, pg, pkey);
                        Set_direction(lt, pkey);
                        Set_direction(pre_l.Head.Data, pg);
                        Set_direction(lt2, PFa);
                        Set_direction(pre_l.Last.Data, pg);
                        return;
                    }
                    #endregion first'soutside
                    #region arbitrary location
                    //如果pg是非特殊位置
                    PO pt = new PO(pg.x, pg.y, pg.z);
                    pt.p_parent = pg;
                    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");
                    work_pl.Insert(pg);
                    //u1.InFile(u1.infopath,"here5");
                    pg.selected = true;
                    #endregion
                }
                else
                {
                    //pg作为普通点处理
                    AddLine(pkey, pg, PLa);
                    AddLine(PLa, pg, pkey);
                    Set_direction(l0, pg);
                    work_pl.Insert(pg);
                    //work_pl.Dispaly();
                    pg.selected = true;
                }
            }
        }
Ejemplo n.º 15
0
        public void In_model()
        {
            model_l.Clear();
            plane.edge_pl.Clear();
            util   u1 = new util();
            string sn = "";
            string str;

            float[]      fn    = new float[9];
            int          j     = 0;
            int          first = 0;
            well2d       w0;
            StreamReader sr = new StreamReader(u1.model_info, true);

            while ((str = sr.ReadLine()) != null)
            {
                j = 0;
                foreach (char ch in str)
                {
                    if ((int)ch >= 48 && (int)ch <= 57 || ch.Equals('.') || ch.Equals('-') || ch.Equals('E'))
                    {
                        sn = sn + ch;
                    }
                    else
                    {
                        if (!sn.Equals(""))
                        {
                            fn[j++] = float.Parse(sn);
                        }
                        sn = "";
                    }
                }

                //1,2,3,4,5,6
                PO[] pc = new PO[2];
                pc[0]   = new PO();
                pc[0].x = fn[1];
                pc[0].y = fn[2];
                pc[0].z = 0;
                pc[1]   = new PO();
                pc[1].x = fn[3];
                pc[1].y = fn[4];
                pc[1].z = 0;
                switch ((int)fn[0])
                {
                case 1:
                    u1.InFile(u1.wherepath, ("well:" + pc[0].x + ',' + pc[0].y + ',' + pc[0].z));
                    w0 = Create_Vertical_Well(pc[0]);
                    if (first++ == 0)
                    {
                        center = w0.center;
                        w0.Set_initial_pl(initial_pl);
                    }
                    break;

                case 2:
                    Create_fault(new LINE(pc[0], pc[1]));
                    u1.InFile(u1.wherepath, ("fault:" + pc[0].x + ',' + pc[0].y + ',' + pc[0].z + ',' + pc[1].x + ',' + pc[1].y + ',' + pc[1].z));
                    break;

                case 4:
                    Create_h_well2d(new LINE(pc[0], pc[1]));
                    u1.InFile(u1.wherepath, ("h_well:" + pc[0].x + ',' + pc[0].y + ',' + pc[0].z + ',' + pc[1].x + ',' + pc[1].y + ',' + pc[1].z));
                    break;

                case 0:
                    plane.edge_pl.Insert(pc[0]);
                    break;
                }
            }
        }