Exemplo n.º 1
0
        /// 找出线集围城的封闭区域,输出WRim2D
        /// <summary>
        /// 找出线集围城的封闭区域,输出WRim2D
        /// </summary>
        /// <param name="Cs">线集</param>
        /// <param name="UseLessPara">没有实际用途的参数,用于表示与另一函数的不同</param>
        /// <returns></returns>
        public static WRim2D[] Get_Rims(ref WEntity2D[] Cs)
        {
            List <int>[]       Ns = new List <int> [0];              /////每个节点相连的节点的编号
            int[][]            Ls = new int[Cs.Length][];            /////每条线的头尾节点编号
            List <WVector2D>[] Vs = new List <WVector2D> [0];        /////每个节点连接对应节点时的线的向量
            P2Ps_Connection(ref Cs, ref Ls, ref Ns, ref Vs);         /////求出点点之间的关系
            Deal_NsVs(ref Ns, ref Vs);                               /////删除空闲节点

            List <PAngle>[] As = P2Ps_Angles(ref Ns, ref Vs);        /////求出每个节点与对应节点连接的内夹角
            /////
            List <int>[] Rims = Create_AllRims(ref Ns, ref As);      /////开始层层剖分,生成所有Rims
            /////
            Convert_Rims2Ls(ref Rims, ref Ls);                       /////将Rims由点点连接转换为线线连接
            Delete_Repeat(ref Rims);                                 /////删除重复的Rim
            int[] Used = Used_Times(ref Rims, Cs.Length);            /////找出每条线使用过的次数
            /////
            WRim2D[] Rims_Out = new WRim2D[Rims.Length];             /////转换输出格式
            for (int i = 0; i < Rims.Length; i++)
            {
                Rims_Out[i] = new WRim2D(ref Cs, Rims[i]);
            }
            /////
            Find_SmallerRims(ref Rims_Out);
            Find_BiggestRim(ref Rims_Out, ref Used);                /////判断是否有最大Rim
            /////
            Rims = null;
            Ns   = null;
            Ls   = null;
            Vs   = null;
            As   = null;

            return(Rims_Out);
        }
Exemplo n.º 2
0
        private static WMesh2D_Mesh Mesh_SinglePole(WRim2D Rim, ref GLCommon GLC, ref List <WPoint2D>[] Ptts, string Name)
        {
            WMFuncs2D.Mesh_Curves(ref Rim.Curves, GLC.Mesh_Length);  /////Mesh每条线
            WMesh2D_Mesh Mesh = Mesh2D_MeshFree.Mesh_SingleRim(ref Rim.Curves, Name, ref GLC.MP);

            if (Mesh == null)
            {
                return(null);
            }
            int R = (int)(Rim.Color.R * 0.8);
            int G = (int)(Rim.Color.G * 0.8);
            int B = (int)(Rim.Color.B * 0.8);

            Mesh.Color = Color.FromArgb(255, R, G, B);
            Mesh.Trace = 2;
            PotentNs_App(ref Mesh.Nodes, ref Ptts, GLC.Potent_Lmax);
            int Quan_E = Mesh.QEs;

            for (int i = 0; i < Quan_E; i++)
            {
                Mesh.Elements.Add(new WElement2D(Mesh.Elements[i].Kind * (-1),
                                                 Mesh.Elements[i].N1,
                                                 Mesh.Elements[i].N2,
                                                 Mesh.Elements[i].N3,
                                                 Mesh.Elements[i].N4));
            }
            return(Mesh);
        }
Exemplo n.º 3
0
 private void RenderRim(Graphics g, ScreenTrans zoom, RenderParameter RParas, WRim2D Rim)
 {
     tB   = new SolidBrush(Rim.Color);
     tPen = new Pen(Rim.Color_Shape, 2);
     Ps   = new PointF[Rim.Shape.Count];
     for (int i = 0; i < Rim.Shape.Count; i++)
     {
         Ps[i] = zoom.WorldToScreen((float)(Rim.Shape[i].X), (float)(Rim.Shape[i].Y));
     }
     g.FillPolygon(tB, Ps);
     g.DrawPolygon(tPen, Ps);
 }
Exemplo n.º 4
0
        /// <summary>
        /// Mesh内部区域
        /// </summary>
        private static WMesh2D_Mesh Mesh_InnerFree(WRim2D Rim, ref GLCommon GLC, string Name)
        {
            WMFuncs2D.Mesh_Curves(ref Rim.Curves, GLC.Mesh_Length);  /////Mesh每条线
            WMesh2D_Mesh Mesh = Mesh2D_MeshFree.Mesh_SingleRim(ref Rim.Curves, Name, ref GLC.MP);

            if (Mesh == null)
            {
                return(null);
            }
            int R = (int)(Rim.Color.R * 0.8);
            int G = (int)(Rim.Color.G * 0.8);
            int B = (int)(Rim.Color.B * 0.8);

            Mesh.Color = Color.FromArgb(255, R, G, B);
            Mesh.Trace = 3;
            return(Mesh);
        }
Exemplo n.º 5
0
        /// <summary>
        /// 判断一个点是否在Rim内部
        /// </summary>
        /// <param name="Rim"></param>
        /// <param name="P"></param>
        /// <returns></returns>
        private bool Check_PointInside(WRim2D Rim, WPoint2D P)
        {
            int polySides = Rim.Shape.Count;

            int  j        = polySides - 1;
            bool oddNodes = false;

            for (int i = 0; i < polySides; i++)
            {
                if ((Rim.Shape[i].Y < P.Y && Rim.Shape[j].Y >= P.Y ||
                     Rim.Shape[j].Y < P.Y && Rim.Shape[i].Y >= P.Y) &&
                    (Rim.Shape[i].X <= P.X || Rim.Shape[j].X <= P.X))
                {
                    oddNodes ^= (Rim.Shape[i].X + (P.Y - Rim.Shape[i].Y) / (Rim.Shape[j].Y - Rim.Shape[i].Y) * (Rim.Shape[j].X - Rim.Shape[i].X) < P.X);
                }
                j = i;
            }
            return(oddNodes);
        }
Exemplo n.º 6
0
        /// 找到最大的,可以包络所有其他Rim的Rim,并判断Rimd的特性
        private static bool[] Find_BiggestRim(ref WRim2D[] Rims, ref int[] UsedTimes)
        {
            int Biggest = -1;

            for (int i = 0; i < Rims.Length; i++)
            {
                if (Rims[i].Smaller.Count == Rims.Length - 1)
                {
                    Biggest = i;
                    break;
                }
            }
            if (Biggest == -1)
            {
                return new bool[] { false, false }
            }
            ;                                                       /////如果没有找到包含所有的Rim则返回
            //==============================//
            int    Quan = Rims.Length;
            WRim2D Rimt = Rims[0];

            Rims[0]       = Rims[Biggest]; /////将最大的Rim交换至0号
            Rims[Biggest] = Rimt;
            Rims[0].Trace = 2000;          /////为最大的Rim加Trace=2000
            /////判断Rim的边缘线是不是与其他Rim公用,如有公用则将最大Rim的Trace=2100,并返回
            for (int i = 0; i < Rims[0].Nums.Count; i++)
            {
                if (UsedTimes[Rims[0].Nums[i]] > 1)
                {
                    Rims[0].Trace = 2100;
                    return(new bool[] { true, false });
                }
            }
            /////如果最大Rim的所有边都不与其他Rim公用,说明还有次大的Rim
            int Second = -1;

            for (int i = 1; i < Quan; i++)
            {
                if (Rims[i].Smaller.Count == Rims.Length - 2)
                {
                    Second = i;
                    break;
                }
            }
            if (Second == -1)
            {
                return new bool[] { true, false }
            }
            ;
            Rimt          = Rims[1];
            Rims[1]       = Rims[Second];
            Rims[Second]  = Rimt;
            Rims[1].Trace = 1000;  /////将最大的Rim交换至1号
            /////判断Rim的边缘线是不是与其他Rim公用,如有公用则将最大Rim的Trace=1100,并返回
            for (int i = 0; i < Rims[1].Nums.Count; i++)
            {
                if (UsedTimes[Rims[1].Nums[i]] > 1)
                {
                    Rims[1].Trace = 1100;
                    break;
                }
            }
            /////
            return(new bool[] { true, true });
        }