Пример #1
0
        /// 分割点集为线段集合
        private static void Divide_Ps(List <WPoint2D> Ps, ref int N, ref WEntity2D[] Bds, int Trace, WMesh2D_Mesh Mesh, bool Meshed, double Mesh_Length)
        {
            List <int> Nums = Get_NodeNums(Ps, Mesh, ref N);               /////得到Pts的节点编号集合,从0开始
            int        Q;

            for (int i = 0; i < Ps.Count - 1; i++)
            {
                Array.Resize <WEntity2D>(ref Bds, Bds.Length + 1);
                Q      = Bds.Length - 1;
                Bds[Q] = new WLine2D(Ps[i], Ps[i + 1]);
                ((WLine2D)(Bds[Q])).Trace = Trace;
                if (Meshed == true)
                {
                    ((WLine2D)(Bds[Q])).Nodes.Add(Ps[i]);
                    ((WLine2D)(Bds[Q])).Nodes.Add(Ps[i + 1]);
                    ((WLine2D)(Bds[Q])).Nodes_num.Add(Nums[i]);
                    ((WLine2D)(Bds[Q])).Nodes_num.Add(Nums[i + 1]);
                }
                else
                {
                    WMFuncs2D.Mesh_Curve(Bds[Q], Mesh_Length);
                    ((WLine2D)(Bds[Q])).Nodes_num.Add(Nums[i]);
                    for (int j = 1; j < ((WLine2D)(Bds[Q])).Nodes.Count - 1; j++)
                    {
                        N++;
                        Mesh.Add_N(((WLine2D)(Bds[Q])).Nodes[j], N);
                        ((WLine2D)(Bds[Q])).Nodes_num.Add(N);
                    }
                    ((WLine2D)(Bds[Q])).Nodes_num.Add(Nums[i + 1]);
                }
            }
        }
Пример #2
0
        private static void Read_Line(ref StreamReader sr, ref WGeometry2D WGC)
        {
            tLayer = sr.ReadLine();
            t_1    = sr.ReadLine().Split(',');
            tColor = Color.FromArgb(Convert.ToInt16(t_1[0]), Convert.ToInt16(t_1[1]), Convert.ToInt16(t_1[2]));
            tWidth = Convert.ToSingle(sr.ReadLine());
            t_1    = sr.ReadLine().Split(',');
            x1     = Convert.ToDouble(t_1[0]);
            y1     = Convert.ToDouble(t_1[1]);

            t_1 = sr.ReadLine().Split(',');
            x2  = Convert.ToDouble(t_1[0]);
            y2  = Convert.ToDouble(t_1[1]);
            /////
            if (Math.Abs(x1 - x2) <= WGeos2D_Paras.E_Merge &&
                Math.Abs(y1 - y2) <= WGeos2D_Paras.E_Merge)
            {
                sr.ReadLine();
                return;
            }

            WLine2D L = new WLine2D(WGC.PsList.Add(x1, y1, true), WGC.PsList.Add(x2, y2, true));

            L.Kind      = GeoKind.Line;
            L.Layer     = tLayer;
            L.Color     = tColor;
            L.LineWidth = tWidth;
            L.Sort      = ShowSort._5;
            WGC.Add_Geo(L);
            sr.ReadLine();
        }
Пример #3
0
        /// 对夹丝边界线进行排序,从左至右输出竖向线
        private static WEntity2D[] Sort_WBs(WLine2D AxisX, ref WEntity2D[] WBs, ref GLCommon GLC)
        {
            int Quan = WBs.Length;

            WPoint2D[]      Ps = new WPoint2D[0]; /////夹丝边界线与横轴的交点点集
            List <WPoint2D> Pst;
            WPoint2D        P;

            int[] Ns = new int[0];
            int   N  = 0;

            for (int i = 0; i < Quan; i++)
            {
                Pst = Geos2D_Intersection.Intersection_L2C(AxisX, WBs[i]);
                if (Pst.Count == 0)
                {
                    continue;
                }
                P = Pst[0];
                Array.Resize <WPoint2D>(ref Ps, N + 1);
                Array.Resize <int>(ref Ns, N + 1);
                Ps[N] = P;
                Ns[N] = i;
                N++;
            }

            ///////得到竖向线并排序输出
            int[]       Sort = WMFuncs2D.Ps_Sort(ref Ps, true, true);
            WEntity2D[] Out  = new WEntity2D[N];
            for (int i = 0; i < N; i++)
            {
                Out[i] = WBs[Ns[Sort[i]]];
            }

            ///////去除竖向线
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < WBs.Length; j++)
                {
                    if (Ns[i] == j)
                    {
                        for (int k = j; k < WBs.Length - 1; k++)
                        {
                            WBs[k] = WBs[k + 1];
                        }
                        Array.Resize <WEntity2D>(ref WBs, WBs.Length - 1);

                        for (int k = i + 1; k < N; k++)
                        {
                            Ns[k] = Ns[k] - 1;
                        }
                        break;
                    }
                }
            }
            return(Out);
        }
Пример #4
0
 private static bool CheckBound_Single(WLine2D L, double x)
 {
     if (x <= L.StartPoint.X && x >= L.EndPoint.X)
     {
         return(true);
     }
     if (x >= L.StartPoint.X && x <= L.EndPoint.X)
     {
         return(true);
     }
     return(false);
 }
Пример #5
0
 private static bool CheckBound_Single(double y, WLine2D L)
 {
     if (y <= L.StartPoint.Y && y >= L.EndPoint.Y)
     {
         return(true);
     }
     if (y >= L.StartPoint.Y && y <= L.EndPoint.Y)
     {
         return(true);
     }
     return(false);
 }
Пример #6
0
        /// 增加几何实例
        /// <summary>
        /// 增加几何实例
        /// </summary>
        public void Add_Geo(WEntity2D E)
        {
            int N;

            if (this.Entities.Count == 0)
            {
                N = 0;
            }
            else
            {
                N = this.Entities[this.Entities.Count - 1].ID + 1;
            }
            E.ID = N;
            if (Layers.Contains(E.Layer) == false)
            {
                Layers.Add(E.Layer);
            }
            Entities.Add(E);

            switch (E.Kind)
            {
            case GeoKind.Line:
                WLine2D L = (WLine2D)E;
                Bounds.Update(L.StartPoint.X, L.StartPoint.Y);
                Bounds.Update(L.EndPoint.X, L.EndPoint.Y);
                break;

            case GeoKind.PolyLine:
                WPolyLine2D P = (WPolyLine2D)E;
                for (int i = 0; i < P.Count; i++)
                {
                    Bounds.Update(P[i].X, P[i].Y);
                }
                break;

            case GeoKind.Spline:
                break;

            case GeoKind.Arc:
                break;

            case GeoKind.Circle:
                WCircle2D C = (WCircle2D)E;
                Bounds.Update(C.Center.X - C.R, C.Center.Y - C.R);
                Bounds.Update(C.Center.X + C.R, C.Center.Y + C.R);
                Bounds.Update(C.Center.X - C.R, C.Center.Y + C.R);
                Bounds.Update(C.Center.X + C.R, C.Center.Y - C.R);
                break;

            default:
                break;
            }
        }
Пример #7
0
 public static double ClosestDistance_P2C(WEntity2D E, WPoint2D P, bool Extent)
 {
     if (E.Kind == GeoKind.Line)
     {
         WLine2D L = (WLine2D)E;
         return(ClosestDistance_P2L(L.StartPoint, L.EndPoint, P, Extent));
     }
     else
     {
         WPolyLine2D PL = (WPolyLine2D)E;
         return(ClosestDistance_P2PL(P, PL, Extent));
     }
 }
Пример #8
0
        private void RenderLines(ScreenTrans zoom, WLine2D Line, bool SnapCheck)
        {
            if (SnapCheck == false)
            {
                tPen = new Pen(Line.Color, Line.LineWidth);
            }
            else
            {
                tPen = RParas.SnapGeo2DPen;
            }
            p0 = Ps[Line.StartPoint.Num];
            p1 = Ps[Line.EndPoint.Num];

            G.DrawLine(tPen, p0, p1);
        }
Пример #9
0
        /// 对夹丝线进行排序,从左至右输出
        private static WEntity2D[] Sort_Wires(WLine2D AxisX, ref WEntity2D[] Wires, ref GLCommon GLC)
        {
            List <WPoint2D> Ps_Wires = Geos2D_Intersection.Intersection_L2Cvs(AxisX, ref Wires);  ///////得到交点

            int Quan = Wires.Length;

            int[] PNums = new int[Quan];   /////用于记录排列顺序
            for (int i = 0; i < Quan; i++)
            {
                PNums[i] = i;
            }
            int      Nt;
            WPoint2D Pt;     /////排列点

            for (int i = 0; i <= Quan - 2; i++)
            {
                for (int j = i + 1; j <= Quan - 1; j++)
                {
                    if (Ps_Wires[i].X > Ps_Wires[j].X)
                    {
                        Nt       = PNums[i];
                        PNums[i] = PNums[j];
                        PNums[j] = Nt;

                        Pt          = Ps_Wires[i];
                        Ps_Wires[i] = Ps_Wires[j];
                        Ps_Wires[j] = Pt;
                    }
                }
            }

            WEntity2D[] ID_Wires_Sorted = new WEntity2D[Quan];   /////按顺序记录排列后的线

            int N;

            for (int i = 0; i <= Quan - 1; i++)
            {
                N = PNums[i];
                ID_Wires_Sorted[i] = Wires[N];
            }

            Ps_Wires = null;
            return(ID_Wires_Sorted);
        }
Пример #10
0
        static void Do_Mesh(ref GLCommon GLC)
        {
            ///////得到各种线的ID
            WLine2D AxisX = GLC.Get_Line_XAxis();                                                                /////中间X轴线

            WEntity2D[] Ws        = Geos2D_Selection.SelectLines(GLC.Layer_Wires, GLC.Color_Wires, ref GLC.WGC); /////夹丝线
            WEntity2D[] Ws_Sorted = Sort_Wires(AxisX, ref Ws, ref GLC);                                          /////将线的ID按照X值从小到大排列
            Ws = null;
            MeshPara_Compute(ref Ws_Sorted, ref GLC);
            /////
            WMesh2D_Mesh Mesh_Glass;

            for (int i = 0; i < GLC.Rims.Count; i++)
            {
                if (GLC.Rims[i].Trace % 10 == 1)
                {
                    Mesh_Glass = Mesh_SingleRim(ref AxisX, ref GLC.Rims[i].Curves, ref Ws_Sorted, ref GLC);
                    if (Mesh_Glass == null)
                    {
                        continue;
                    }
                    GLC.Rims[i].Meshed = true;
                    Mesh_Glass.Trace   = 1;
                    Mesh_Glass.Color   = GLC.Rims[i].Color;
                    GLC.Meshs.Add(Mesh_Glass);
                }
            }
            for (int i = 0; i < GLC.Rims.Count; i++) //////GLC.Rims.Count
            {
                if (GLC.Rims[i].Trace % 10 == 1 && GLC.Rims[i].Meshed == false)
                {
                    Mesh_Glass = Mesh_FreeRim(ref GLC.Rims[i].Curves, ref Ws_Sorted, ref GLC, i.ToString());
                    if (Mesh_Glass == null)
                    {
                        continue;
                    }
                    Mesh_Glass.Trace = 1;
                    Mesh_Glass.Color = GLC.Rims[i].Color;
                    GLC.Meshs.Add(Mesh_Glass);
                    //Mesh_Glass.Output_ToFile("G:\\");
                }
            }
        }
Пример #11
0
        /// <summary>
        /// 划分直线段
        /// </summary>
        /// <param name="L"></param>
        /// <param name="Times">实际输出的点集有Times+1个点,从0到Times</param>
        /// <returns></returns>
        private static List <WPoint2D> Dotline_Times(WLine2D L, int Times)
        {
            List <WPoint2D> Ps = new List <WPoint2D>();

            Ps.Add(L.StartPoint);
            WVector2D v = L.StartPoint.VectorTo(L.EndPoint);
            double    l = v.Length / Times;

            v = v.Normalize();
            WPoint2D P = L.StartPoint;

            for (int i = 1; i < Times; i++)
            {
                P = P + v * l;
                Ps.Add(P);
            }
            Ps.Add(L.EndPoint);
            return(Ps);
        }
Пример #12
0
        private static List <WPoint2D> Dotline_Times(WLine2D L, WPoint2D P1, WPoint2D P2, int Times)
        {
            List <WPoint2D> Ps = new List <WPoint2D>();

            Ps.Add(P1);
            WVector2D v = P1.VectorTo(P2);
            double    l = v.Length / Times;

            v = v.Normalize();
            WPoint2D P = P1;

            for (int i = 1; i < Times; i++)
            {
                P = P + v * l;
                Ps.Add(P);
            }
            Ps.Add(P2);
            return(Ps);
        }
Пример #13
0
 private static bool CheckBound_Double(WLine2D L, WPoint2D P1, WPoint2D P2)
 {
     if (P1.X > L.StartPoint.X && P1.X > L.EndPoint.X && P2.X > L.StartPoint.X && P2.X > L.EndPoint.X)
     {
         return(false);
     }
     if (P1.X < L.StartPoint.X && P1.X < L.EndPoint.X && P2.X < L.StartPoint.X && P2.X < L.EndPoint.X)
     {
         return(false);
     }
     if (P1.Y > L.StartPoint.Y && P1.Y > L.EndPoint.Y && P2.Y > L.StartPoint.Y && P2.Y > L.EndPoint.Y)
     {
         return(false);
     }
     if (P1.Y < L.StartPoint.Y && P1.Y < L.EndPoint.Y && P2.Y < L.StartPoint.Y && P2.Y < L.EndPoint.Y)
     {
         return(false);
     }
     return(true);
 }
Пример #14
0
 private static bool CheckBound_Single(WLine2D L, WPoint2D P)
 {
     if (P.X < L.StartPoint.X && P.X < L.EndPoint.X)
     {
         return(false);
     }
     if (P.X > L.StartPoint.X && P.X > L.EndPoint.X)
     {
         return(false);
     }
     if (P.Y < L.StartPoint.Y && P.Y < L.EndPoint.Y)
     {
         return(false);
     }
     if (P.Y > L.StartPoint.Y && P.Y > L.EndPoint.Y)
     {
         return(false);
     }
     return(true);
 }
Пример #15
0
        public static List <WPoint2D> Intersection_L2C(WLine2D L, WEntity2D C)
        {
            List <WPoint2D> Ps = new List <WPoint2D>();
            WPoint2D        P;

            if (C.Kind == GeoKind.Line)
            {
                P = Intersection_L2L((WLine2D)C, L);
                if (P != null)
                {
                    Ps.Add((WPoint2D)P);
                }
                return(Ps);
            }
            if (C.Kind == GeoKind.PolyLine)
            {
                return(Intersection_L2Pl((WPolyLine2D)C, L));
            }
            return(Ps);
        }
Пример #16
0
        /// <summary>
        /// 一条直线与许多线相交
        /// </summary>
        /// <param name="L"></param>
        /// <param name="Cs"></param>
        /// <returns></returns>
        public static List <WPoint2D> Intersection_L2Cvs(WLine2D L, ref WEntity2D[] Cs)
        {
            ///线对线的临时变量
            List <WPoint2D> Ps = new List <WPoint2D>();
            ///线对Poly的临时变量
            List <WPoint2D> Pst;
            WPoint2D        P;

            for (int i = 0; i < Cs.Length; i++)
            {
                if (Cs[i].Kind == GeoKind.Line)        /////直线直线相交
                {
                    P = Intersection_L2L(L, (WLine2D)Cs[i]);
                    if (P == null)
                    {
                        continue;
                    }
                    Ps.Add(new WPoint2D(((WPoint2D)P).X, ((WPoint2D)P).Y, 0)); /////((WPoint2D)P).CheckNum + i));
                }
                if (Cs[i].Kind == GeoKind.PolyLine)                            /////直线多段线相交
                {
                    Pst = Intersection_L2Pl((WPolyLine2D)Cs[i], L);
                    if (Pst.Count == 0)
                    {
                        continue;
                    }
                    for (int j = 0; j < Pst.Count; j++)
                    {
                        Ps.Add(new WPoint2D(((WPoint2D)Pst[j]).X, ((WPoint2D)Pst[j]).Y, 0)); /////((WPoint2D)Pst[j]).CheckNum + i));
                    }
                }
            }
            P   = null;
            Pst = null;
            return(Ps);
        }
Пример #17
0
 public static WPoint2D Intersection_L2L(WLine2D L1, WPoint2D P1, WPoint2D P2)
 {
     return(Intersection_L2L(L1.StartPoint, L1.EndPoint, P1, P2));
 }
Пример #18
0
        /// 找到所有的边界线及所有的区域
        private static List <int>[] Find_BdsRims(ref WEntity2D[] WBs, ref WEntity2D[] Ws, ref GLCommon GLC, ref WEntity2D[] Bds, WMesh2D_Mesh Mesh)
        {
            int             N = 0;  /////记录节点编号
            List <WPoint2D> Pts;    /////辅助点集
            int             Q, Q2;
            /////找到每条边界线与夹丝线的交点
            WCurve2D C;

            for (int i = 0; i < WBs.Length; i++)
            {
                C = (WCurve2D)(WBs[i]);
                if (C.Meshed_Check == true)
                {
                    Geos2D_Other.Merge_Points(ref C.Nodes);  /////去掉多余节点
                    Pts = C.Nodes;
                    if (WMFuncs2D.Length_P2P(C.StartPoint, Pts[0]) > WMFuncs2D.Length_P2P(C.EndPoint, Pts[0]))
                    {
                        WMFuncs2D.Points_Reverse(ref Pts, true);
                    }
                    if (WMFuncs2D.Near_Check(Pts[0], C.StartPoint) == false)
                    {
                        Pts.Insert(0, C.StartPoint);
                    }
                    if (WMFuncs2D.Near_Check(Pts[Pts.Count - 1], C.EndPoint) == false)
                    {
                        Pts.Add(C.EndPoint);
                    }
                    C.Nodes = Pts;
                    /////
                    Divide_Ps(Pts, ref N, ref Bds, -1, Mesh, true, GLC.Mesh_Length);    /////分割点集为线段集合
                }
                else
                {
                    Pts = Geos2D_Intersection.Intersection_Cv2Ls(WBs[i], ref Ws); /////找与上下边线的交点作为划分的边界
                    if (Pts.Count < 2)
                    {
                        Array.Resize <WEntity2D>(ref Bds, Bds.Length + 1);
                        Bds[Bds.Length - 1] = WBs[i];
                        ((WCurve2D)Bds[Bds.Length - 1]).Trace = -1;
                        WMFuncs2D.Mesh_Curve(Bds[Bds.Length - 1], GLC.Mesh_Length);
                        ((WCurve2D)Bds[Bds.Length - 1]).Nodes_num = Get_NodeNums(((WCurve2D)Bds[Bds.Length - 1]).Nodes, Mesh, ref N);
                        continue;
                    }
                    else
                    {
                        Geos2D_Other.Merge_Points(ref Pts);  /////去掉多余节点
                    }
                    if (WMFuncs2D.Length_P2P(C.StartPoint, Pts[0]) > WMFuncs2D.Length_P2P(C.EndPoint, Pts[0]))
                    {
                        WMFuncs2D.Points_Reverse(ref Pts, true);
                    }
                    if (WMFuncs2D.Near_Check(Pts[0], C.StartPoint) == false)
                    {
                        Pts.Insert(0, C.StartPoint);
                    }
                    if (WMFuncs2D.Near_Check(Pts[Pts.Count - 1], C.EndPoint) == false)
                    {
                        Pts.Add(C.EndPoint);
                    }
                    /////
                    Divide_Ps(Pts, ref N, ref Bds, i, Mesh, false, GLC.Mesh_Length);    /////分割点集为线段集合
                }
            }
            Mesh.Q_FreeNs = N;
            /////找到所有夹丝线的交点,形成新的直线加入
            for (int i = 0; i < Ws.Length; i++)
            {
                Pts = Geos2D_Intersection.Intersection_L2Cvs((WLine2D)Ws[i], ref WBs); /////找与上下边线的交点作为划分的边界
                if (Pts.Count == 0)
                {
                    continue;                                                          /////夹丝线与上下边界不一定会有交点
                }
                Geos2D_Other.Merge_Points(ref Pts);                                    /////去掉多余节点
                if (Pts.Count == 1)
                {
                    continue;
                }
                /////
                Array.Resize <WEntity2D>(ref Bds, Bds.Length + 1);
                Q            = Bds.Length - 1;
                Bds[Q]       = new WLine2D(Pts[0], Pts[1]);
                Bds[Q].Trace = -2;
                WMFuncs2D.Mesh_Curve(Bds[Q], GLC.Mesh_Length);                                                    /////生成该线的节点
                N = WMFuncs2D.NsID_App(ref ((WCurve2D)Bds[Q]).Nodes, ref ((WCurve2D)Bds[Q]).Nodes_num, false, N); /////Mesh该线,注意头尾不要
                Mesh.Add_Ns(ref ((WCurve2D)Bds[Q]).Nodes, ref ((WCurve2D)Bds[Q]).Nodes_num, true, false);         /////将节点编号输入至Mesh中,注意头尾不要
                ((WCurve2D)Bds[Q]).Nodes_num[0] = Get_NodeNum(((WCurve2D)Bds[Q]).Nodes[0], Mesh, ref N);
                Q2 = ((WCurve2D)Bds[Q]).Nodes_num.Count - 1;
                ((WCurve2D)Bds[Q]).Nodes_num[Q2] = Get_NodeNum(((WCurve2D)Bds[Q]).Nodes[Q2], Mesh, ref N);
            }

            return(Geo2D_CurvesRims.Get_Rims(ref Bds, 1));
        }
Пример #19
0
        /// <summary>
        /// 生成夹丝区域的节点,单元,输出,绘制等
        /// </summary>
        /// <param name="AxisX">横向轴线</param>
        /// <param name="WBs">夹丝线</param>
        /// <param name="Ws">夹丝区域的上下边界线</param>
        /// <remarks></remarks>
        private static WMesh2D_Mesh Mesh_SingleRim(ref WLine2D AxisX,
                                                   ref WEntity2D[] WBs, ref WEntity2D[] Ws,
                                                   ref GLCommon GLC)
        {
            WMesh2D_Mesh Glass_Mesh = new WMesh2D_Mesh("Wires");

            Glass_Mesh.Shapes.Add(new WShapeRim2D(Color.Black, 1f));
            /////
            int N  = 0;                                            /////节点编号
            int E4 = 0;                                            /////Shell单元编号
            int E2 = 0;                                            /////Beam单元编号

            WEntity2D[] WBs_V = Sort_WBs(AxisX, ref WBs, ref GLC); /////找到竖向边界排序输出,并在边界线数组中去除竖向边界线
            if (WBs_V.Length == 0)
            {
                return(null);
            }
            WCurve2D Bd_L = (WCurve2D)WBs_V[0];                     /////左侧边界
            WCurve2D Bd_R = (WCurve2D)WBs_V[1];                     /////右侧边界

            WCurve2D[] Bds_O = new WCurve2D[WBs.Length];            /////上下边界线
            for (int i = 0; i < WBs.Length; i++)
            {
                Bds_O[i] = (WCurve2D)WBs[i];
            }

            ///////先求出上下边界
            List <WPoint2D> Ps_WiL = new List <WPoint2D>();           /////记录所有线与上边界的交点,从左至右
            List <WPoint2D> Ps_WiU = new List <WPoint2D>();           /////记录所有线与下边界的交点,从左至右
            List <WPoint2D> Pts;                                      /////辅助点集

            for (int i = 0; i <= Ws.Length - 1; i++)
            {
                Pts = Geos2D_Intersection.Intersection_L2Cvs((WLine2D)Ws[i], ref WBs); /////找与上下边线的交点作为划分的边界
                if (Pts.Count == 0)
                {
                    continue;                        /////夹丝线与上下边界不一定会有交点
                }
                Add_Ps2_Bnds(ref Pts, ref Bds_O);

                Geos2D_Other.Merge_Points(ref Pts);  /////去掉多余节点
                if (Pts[0].Y > Pts[1].Y)
                {
                    Ps_WiU.Add(Pts[0]);
                    Ps_WiL.Add(Pts[1]);
                }
                else
                {
                    Ps_WiU.Add(Pts[1]);
                    Ps_WiL.Add(Pts[0]);
                }
            }

            ///////对上下左右边界进行网格划分//////
            Bd_L.Nodes = Geos2D_Modify.DotCurve_Times(Bd_L, GLC.Mesh_WireTimes); /////左边界划分
            Bd_R.Nodes = Geos2D_Modify.DotCurve_Times(Bd_R, GLC.Mesh_WireTimes); /////右边界划分
            WMFuncs2D.Ps_Sort(Bd_L.Nodes, false, true);                          /////从下到上排列左边界节点
            WMFuncs2D.Ps_Sort(Bd_R.Nodes, false, true);                          /////从下到上排列右边界节点

            //////Shell//////
            List <int> Ns_WiL = new List <int>();                                //////记录所有线与上边界的交点的节点编号(Shell),从左至右
            List <int> Ns_WiU = new List <int>();                                //////记录所有线与下边界的交点的节点编号(Shell),从左至右

            N = WMFuncs2D.NsID_App(ref Bd_L.Nodes, ref Bd_L.Nodes_num, N);       //////将左边界的节点进行划分并输入Bnd中(Shell)
            N = WMFuncs2D.NsID_App(ref Ps_WiU, ref Ns_WiU, N);                   //////将上边界的节点进行划分(Shell)
            N = WMFuncs2D.NsID_App(ref Bd_R.Nodes, ref Bd_R.Nodes_num, N, true); //////将右边界的节点进行划分并输入Bnd中(Shell),注意需要反向
            N = WMFuncs2D.NsID_App(ref Ps_WiL, ref Ns_WiL, N, true);             //////将下边界的节点进行划分,注意需要反向(Shell)

            //Add_HT2_Bnds(ref Bd_L.Nodes, ref Bds_O);                           //////将左边界头尾节点加入上下边界中(为了节点顺序对,右边界在最后输入)

            //////输出
            Glass_Mesh.Q_FreeNs = Bd_L.Nodes.Count * 2 + Ns_WiL.Count * 2;             /////自由节点数量输出(Shell)
            Glass_Mesh.Add_Ns(ref Bd_L.Nodes, ref Bd_L.Nodes_num, false, 0);           /////输出左边界的节点至Shell节点文件中
            Glass_Mesh.Add_Ns(ref Ps_WiU, ref Ns_WiU, false, 0);                       /////输出上边界的节点至Shell节点文件中
            Glass_Mesh.Add_Ns(ref Bd_R.Nodes, ref Bd_R.Nodes_num, true, 0);            /////输出右边界的节点至Shell节点文件中,注意反向
            Glass_Mesh.Add_Ns(ref Ps_WiL, ref Ns_WiL, true, 0);                        /////输出下边界的节点至Shell节点文件中,注意反向
            /////将边界点放到Shape中
            Glass_Mesh.Shapes[0].Add_Ps(ref Bd_L.Nodes, ref Bd_L.Nodes_num, false, 0); /////输出左边界的节点至Shell节点文件中
            Glass_Mesh.Shapes[0].Add_Ps(ref Ps_WiU, ref Ns_WiU, false, 0);             /////输出上边界的节点至Shell节点文件中
            Glass_Mesh.Shapes[0].Add_Ps(ref Bd_R.Nodes, ref Bd_R.Nodes_num, true, 0);  /////输出右边界的节点至Shell节点文件中,注意反向
            Glass_Mesh.Shapes[0].Add_Ps(ref Ps_WiL, ref Ns_WiL, true, 0);              /////输出下边界的节点至Shell节点文件中,注意反向

            /////对夹丝线进行网格划分//////
            List <WPoint2D> Ps1 = Bd_L.Nodes;
            List <WPoint2D> Ps2 = new List <WPoint2D>();
            List <int>      Ns1 = Bd_L.Nodes_num;
            List <int>      Ns2 = new List <int>();

            WElement2D[] Es = new WElement2D[0];

            for (int i = 0; i <= Ws.Length - 1; i++)
            {
                Ps2 = Geos2D_Modify.DotCurve_Times(Ws[i], Ps_WiU[i], Ps_WiL[i], GLC.Mesh_WireTimes, ref GLC.WGC); /////划分夹丝线
                WMFuncs2D.Ps_Sort(Ps2, false, true);                                                              /////从下到上排列节点
                //Add_HT2_Bnds(ref Ps2, ref Bds_O);                               /////将头尾节点加入上下边界中
                //////Shell//////
                N                  = WMFuncs2D.NsID_App(ref Ps2, ref Ns2, false, N);    /////生成Shell单元的节点编号(注意头尾不要)
                Ns2[0]             = Ns_WiL[i];                                         /////为生成单元,用下边界节点替换最下点编号
                Ns2[Ns2.Count - 1] = Ns_WiU[i];                                         /////为生成单元,用上边界节点替换最上点编号
                E4                 = WMFuncs2D.E4sID_App(ref Ns1, ref Ns2, ref Es, E4); /////生成Shell单元
                Glass_Mesh.AddCross_NodesPair(ref Ns1, ref Ns2);                        /////将节点之间架桥,用于显示
                /////输出
                Glass_Mesh.Add_Ns(ref Ps2, ref Ns2, true, false);                       /////将Shell的中间节点输出至文件(注意头尾不要)
                Glass_Mesh.Add_Es(ref Es);                                              /////输出Shell单元

                E2 = WMFuncs2D.E2sID_App(ref Ns2, ref Es, E2, true);                    /////Beam单元生成
                Glass_Mesh.Add_Es(ref Es);                                              /////Beam单元输出

                //////循环推进//////
                Ps1 = Ps2;
                Ns1 = Ns2;
            }

            ///////最右侧单元处理//////
            Ps2 = Bd_R.Nodes;
            Ns2 = Bd_R.Nodes_num;
            //Add_HT2_Bnds(ref Bd_R.Nodes, ref  Bds_O);                           /////将右侧边界头尾节点加入上下边界中
            E4 = WMFuncs2D.E4sID_App(ref Ns1, ref Ns2, ref Es, E4);               /////输入单元编号
            Glass_Mesh.AddCross_NodesPair(ref Ns1, ref Ns2);                      /////将节点之间架桥,用于显示
            Glass_Mesh.Add_Es(ref Es);
            return(Glass_Mesh);
        }
Пример #20
0
 public static WPoint2D Intersection_L2L(WLine2D L1, WLine2D L2)
 {
     return(Intersection_L2L(L1.StartPoint, L1.EndPoint, L2.StartPoint, L2.EndPoint));
 }
Пример #21
0
        public static List <WPoint2D> Intersection_L2Pl(WPolyLine2D PL, WLine2D L)
        {
            List <WPoint2D>[] Pst = new List <WPoint2D> [0];
            ///Check头尾
            if (Geos2D_Other.Check_PsMerge(PL.StartPoint, L.StartPoint) == true ||
                Geos2D_Other.Check_PsMerge(PL.StartPoint, L.EndPoint) == true)
            {
                Array.Resize <List <WPoint2D> >(ref Pst, Pst.Length + 1);
                Pst[Pst.Length - 1] = new List <WPoint2D>();
                Pst[Pst.Length - 1].Add(PL.StartPoint);
            }
            if (Geos2D_Other.Check_PsMerge(PL.EndPoint, L.StartPoint) == true ||
                Geos2D_Other.Check_PsMerge(PL.EndPoint, L.EndPoint) == true)
            {
                Array.Resize <List <WPoint2D> >(ref Pst, Pst.Length + 1);
                Pst[Pst.Length - 1] = new List <WPoint2D>();
                Pst[Pst.Length - 1].Add(PL.EndPoint);
            }
            /////判断是否相互顶在一起
            //WPoint2D? Pnt = Geos2D_Other.ClosestPoint_P2PL(L.StartPoint, PL, true);
            //if (Pnt != null && Geos2D_Other.Check_PsMerge((WPoint2D)Pnt, L.StartPoint) == true)
            //{
            //    Array.Resize<List<WPoint2D>>(ref Pst, Pst.Length + 1);
            //    Pst[Pst.Length - 1] = new List<WPoint2D>();
            //    Pst[Pst.Length - 1].Add(L.StartPoint);
            //}
            //Pnt = Geos2D_Other.ClosestPoint_P2PL(L.EndPoint, PL, true);
            //if (Pnt != null && Geos2D_Other.Check_PsMerge((WPoint2D)Pnt, L.EndPoint) == true)
            //{
            //    Array.Resize<List<WPoint2D>>(ref Pst, Pst.Length + 1);
            //    Pst[Pst.Length - 1] = new List<WPoint2D>();
            //    Pst[Pst.Length - 1].Add(L.EndPoint);
            //}
            //Pnt = Geos2D_Other.ClosestPoint_P2L(PL.StartPoint, L, true);
            //if (Pnt != null && Geos2D_Other.Check_PsMerge((WPoint2D)Pnt, PL.StartPoint) == true)
            //{
            //    Array.Resize<List<WPoint2D>>(ref Pst, Pst.Length + 1);
            //    Pst[Pst.Length - 1] = new List<WPoint2D>();
            //    Pst[Pst.Length - 1].Add(PL.StartPoint);
            //}
            //Pnt = Geos2D_Other.ClosestPoint_P2L(PL.EndPoint, L, true);
            //if (Pnt != null && Geos2D_Other.Check_PsMerge((WPoint2D)Pnt, PL.EndPoint) == true)
            //{
            //    Array.Resize<List<WPoint2D>>(ref Pst, Pst.Length + 1);
            //    Pst[Pst.Length - 1] = new List<WPoint2D>();
            //    Pst[Pst.Length - 1].Add(PL.EndPoint);
            //}
            ///
            bool Array_Start = true;     /////判断Array是否要增加新数,如为true则增加新数
            bool List_Start  = true;     /////判断是否List要重新开始,如果为true则从新开始

            for (int i = 0; i < PL.Count - 1; i++)
            {
                if (CheckBound_Double(L, PL[i], PL[i + 1]) == true)
                {
                    if (Array_Start == true)
                    {
                        Array.Resize <List <WPoint2D> >(ref Pst, Pst.Length + 1);
                        Pst[Pst.Length - 1] = new List <WPoint2D>();
                        List_Start          = true;
                        Array_Start         = false;
                    }
                    if (List_Start == true)
                    {
                        Pst[Pst.Length - 1].Add(PL[i]);
                    }
                    Pst[Pst.Length - 1].Add(PL[i + 1]);
                }
                else
                {
                    Array_Start = true;
                }
            }
            //////////
            List <WPoint2D> Ps = new List <WPoint2D>();
            WPoint2D        P;

            for (int i = 0; i < Pst.Length; i++)
            {
                for (int j = 0; j < Pst[i].Count - 1; j++)
                {
                    P = Intersection_L2L(L, Pst[i][j], Pst[i][j + 1]);
                    if (P == null)
                    {
                        continue;
                    }
                    Ps.Add((WPoint2D)P);
                    break;
                }
            }
            Pst = null;
            return(Ps);
        }
Пример #22
0
 public static WPoint2D ClosestPoint_P2L(WPoint2D P, WLine2D L, bool Extent)
 {
     return(ClosestPoint_P2L(L.StartPoint, L.EndPoint, P, Extent));
 }