private static WElement2D[] Create_Elements(ref int[] Ls1, ref int[] Ls2, List <int> Nums, List <WPoint2D> Ps, bool PreCheck) { //bool ClockCheck = false; //if ((Ps[Ls1[0]].X > Ps[Ls2[0]].X) && (Ps[Ls1[0]].Y > Ps[Ls1[Ls1.Length - 1]].Y)) // ClockCheck = true; //if ((Ps[Ls1[0]].X < Ps[Ls2[0]].X) && (Ps[Ls1[0]].Y < Ps[Ls1[Ls1.Length - 1]].Y)) // ClockCheck = true; //if ((Ps[Ls1[0]].Y < Ps[Ls2[0]].Y) && (Ps[Ls1[0]].X > Ps[Ls1[Ls1.Length - 1]].X)) // ClockCheck = true; //if ((Ps[Ls1[0]].Y > Ps[Ls2[0]].Y) && (Ps[Ls1[0]].X < Ps[Ls1[Ls1.Length - 1]].X)) // ClockCheck = true; /////// WElement2D[] Es = new WElement2D[0]; int L1 = Ls1.Length; int L2 = Ls2.Length; int Lm = L1; if (L2 < Lm) { Lm = L2; } bool RevCheck = Check_Reverse(Ls1[L1 - 1], Ls1[L1 - 2], Ls2[L2 - 1], Ps); Add_Element(ref Es, 3, Ls1[L1 - 1], Ls1[L1 - 2], Ls2[L2 - 1], 0, RevCheck, ref Nums); //////最后先用三角形封起来 Array.Resize <int>(ref Ls1, L1 - 1); L1--; while (L1 != L2) { if (L1 > L2) { Add_Element(ref Es, 3, Ls1[L1 - 1], Ls1[L1 - 2], Ls2[L2 - 1], 0, RevCheck, ref Nums); Array.Resize <int>(ref Ls1, L1 - 1); L1--; } else { Add_Element(ref Es, 3, Ls2[L2 - 2], Ls2[L2 - 1], Ls1[L1 - 1], 0, RevCheck, ref Nums); Array.Resize <int>(ref Ls2, L2 - 1); L2--; } } for (int i = L1 - 1; i > 0; i--) { Add_Element(ref Es, 4, Ls1[i], Ls1[i - 1], Ls2[i - 1], Ls2[i], RevCheck, ref Nums); } return(Es); }
public static int E4sID_App(ref List <int> Ns1, ref List <int> Ns2, ref WElement2D[] Es, int Num_Start) { int Quan = Ns1.Count - 1; Array.Resize <WElement2D>(ref Es, Quan); int Num; for (int i = 0; i < Quan; i++) { Num = Num_Start + i + 1; Es[i] = new WElement2D(4, Ns1[i], Ns2[i], Ns2[i + 1], Ns1[i + 1]); } return(Num_Start + Quan - 1); }
public static int E2ID_App(int N1, int N2, ref WElement2D[] Es, int Num_Start, bool Append_Check) { int Quan_Pre; if (Append_Check == true) { Quan_Pre = Es.Length; } else { Quan_Pre = 0; } Array.Resize <WElement2D>(ref Es, Quan_Pre + 1); Es[Quan_Pre] = new WElement2D(2, N1, N2, 0, 0); return(Num_Start + 1); }
public static WElement2D[] Do_Mesh(ref WEntity2D[] Rim_Curves, string Name, ref WMesh2D_Para MP) { List <WPoint2D> Ps = new List <WPoint2D>(); ///// 节点集 List <int> Ns = new List <int>(); ///// 节点编号集 Get_Rim(ref Rim_Curves, ref Ps, ref Ns); int[] Corner = Find_Corner(ref Ps); WElement2D[] Es = new WElement2D[0]; if (Corner.Length == 3) { Es = Mesh_TriCorner(ref Corner, Ns, Ps); } if (Corner.Length == 4) { Es = Mesh_FourCorner(ref Corner, Ns, Ps); } return(Es); }
public static int E2sID_App(ref List <int> Ns, ref WElement2D[] Es, int Num_Start, bool Append_Check) { int Quan = Ns.Count - 1; int Quan_Pre, Num; if (Append_Check == true) { Quan_Pre = Es.Length; } else { Quan_Pre = 0; } Array.Resize <WElement2D>(ref Es, Quan + Quan_Pre); for (int i = 0; i < Quan; i++) { Num = Num_Start + i + 1; Es[i + Quan_Pre] = new WElement2D(2, Ns[i], Ns[i + 1], 0, 0); } return(Num_Start + Quan - 1); }
public void Add_E(WElement2D E) { this.Elements.Add(E); }
/// <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); }
private static WMesh2D_Mesh Mesh_FreeRim(ref WEntity2D[] WBs, ref WEntity2D[] Ws, ref GLCommon GLC, string Name) { WMesh2D_Mesh Mesh_Glass = new WMesh2D_Mesh(Name); ///// WEntity2D[] Bds = new WEntity2D[0]; /////所有的内部边界线 List <int>[] Rims = Find_BdsRims(ref WBs, ref Ws, ref GLC, ref Bds, Mesh_Glass); /////找到所有的边界线及所有的区域 /////逐个Rim分别Mesh WElement2D[] Es = new WElement2D[0]; WEntity2D[] Rim; List <int> Ns = new List <int>(); List <WPoint2D> Ps = new List <WPoint2D>(); ///// for (int i = 0; i < Rims.Length; i++) { Rim = new WEntity2D[Rims[i].Count]; for (int j = 0; j < Rim.Length; j++) { Rim[j] = Bds[Rims[i][j]]; } Es = Mesh2D_SingleLayerMesh.Do_Mesh(ref Rim, i.ToString(), ref GLC.MP); if (Es == null || Es.Length == 0) { for (int j = 0; j < Rim.Length; j++) { for (int k = 0; k < ((WCurve2D)Rim[j]).Nodes.Count - 1; k++) { Ps.Add(((WCurve2D)Rim[j]).Nodes[k]); Ns.Add(((WCurve2D)Rim[j]).Nodes_num[k]); } } Es = Mesh2D_MeshFree.Mesh_SingleRim(ref Ns, ref Ps, ref GLC.MP, i.ToString()); } if (Es == null || Es.Length == 0) { continue; } Mesh_Glass.Add_Es(ref Es); } if (Mesh_Glass.QEs == 0) { return(null); } else { for (int i = 0; i < Bds.Length; i++) { if (Bds[i].Trace != -2) { continue; } Es = new WElement2D[0]; WMFuncs2D.E2sID_App(ref ((WCurve2D)Bds[i]).Nodes_num, ref Es, 0, true); /////Beam单元生成 if (Es == null || Es.Length == 0) { continue; } Mesh_Glass.Add_Es(ref Es); /////Beam单元输出 } } ///// int Nt = 0; for (int i = 0; i < WBs.Length; i++) { if (((WCurve2D)WBs[i]).Meshed_Check == true) { continue; } ((WCurve2D)WBs[i]).Nodes = new List <WPoint2D>(); for (int j = 0; j < Bds.Length; j++) { Nt = ((WCurve2D)Bds[j]).Trace; if (Nt != i) { continue; } for (int k = 0; k < ((WCurve2D)Bds[j]).Nodes.Count - 1; k++) { ((WCurve2D)WBs[i]).Nodes.Add(((WCurve2D)Bds[j]).Nodes[k]); } } ((WCurve2D)WBs[i]).Nodes.Add(new WPoint2D(((WCurve2D)WBs[i]).EndPoint.X, ((WCurve2D)WBs[i]).EndPoint.Y)); } ////// return(Mesh_Glass); }