/// 找到0节点和节点编号的圈圈 private static void Get_Rim(ref WEntity2D[] Rim_Curves, ref List <WPoint2D> Ps_Out, ref List <int> Ns_Out) { for (int i = 0; i < Rim_Curves.Length; i++) { if (((WCurve2D)Rim_Curves[i]).Meshed_Check == false) { return; /////如果有线没有Mesh则返回-1 } } int[] Sorts = Geos2D_Other.Sort_Curves(Rim_Curves); int Num; bool Tc; /////判断某条线是否首尾颠倒,true为颠倒,false为不颠倒 ///////处理第一条线/////// Num = 0; WCurve2D C = (WCurve2D)Rim_Curves[Num]; List <int> Ns = new List <int>(); List <WPoint2D> Ps = new List <WPoint2D>(); for (int i = 1; i < C.Nodes.Count; i++) { Ps.Add(C.Nodes[i]); /////将Curve的Node复制出来至Ps Ns.Add(C.Nodes_num[i]); } Ps_Out = Ps; Ns_Out = Ns; //////处理中间线////////// for (int i = 1; i <= Sorts.Length - 1; i++) { Num = (int)(Math.Floor((double)(Sorts[i] / 2))); if (Sorts[i] - 2 * Num == 0) { Tc = false; } else { Tc = true; /////首尾颠倒则为true } Ps = new List <WPoint2D>(); Ns = new List <int>(); C = (WCurve2D)Rim_Curves[Num]; for (int j = 0; j < C.Nodes.Count; j++) { Ps.Add(C.Nodes[j]); /////将Curve的Node复制出来至Ps Ns.Add(C.Nodes_num[j]); } WMFuncs2D.Points_Reverse(ref Ps, Tc); /////翻转点集 WMFuncs2D.Nums_Reverse(ref Ns, Tc); /////翻转点集 Ps.RemoveAt(0); /////去掉起点 Ns.RemoveAt(0); /////去掉起点 for (int j = 0; j < Ps.Count; j++) { Ps_Out.Add(Ps[j]); Ns_Out.Add(Ns[j]); } } }
public static void Combine_Curves(WEntity2D Co, WEntity2D Ct) { WCurve2D C1 = (WCurve2D)Co; WCurve2D C2 = (WCurve2D)Ct; int check = -1; /////起点相连 if ((C1.StartPoint.X - C2.StartPoint.X) < WGeos2D_Paras.E_Merge && (C1.StartPoint.Y - C2.StartPoint.Y) < WGeos2D_Paras.E_Merge) { check = 1; } }
/// <summary> /// Mesh单条线 /// </summary> /// <param name="Cin"></param> /// <param name="Mesh_Length"></param> public static void Mesh_Curve(WEntity2D Cin, double Mesh_Length) { WCurve2D C = (WCurve2D)Cin; int Times; if (C.Meshed_Check == true) { if (C.StartPoint.DistanceTo(C.Nodes[0]) > (C.StartPoint.DistanceTo(C.Nodes[C.Nodes.Count - 1]))) { WMFuncs2D.Points_Reverse(ref C.Nodes, true); /////翻转点集 } return; } Times = (int)Math.Ceiling(C.Length / Mesh_Length); C.Nodes = Geos2D_Modify.DotCurve_Times(C, Times); }
/// 将一堆WEntity2D[]数组连接成为单个数组 /// <summary> /// 将一堆WEntity2D[]数组连接成为单个数组,如果Free_Check为False不会检查是否是自由线 /// </summary> public static WEntity2D[] Combine_CsArray(ref WEntity2D[][] Cs, bool Free_Check) { WEntity2D[] Cs_Out = new WCurve2D[0]; for (int i = 0; i < Cs.Length; i++) { for (int j = 0; j < Cs[i].Length; j++) { if (((WCurve2D)Cs[i][j]).Free_Check == false && Free_Check == true) { continue; } Array.Resize <WEntity2D>(ref Cs_Out, Cs_Out.Length + 1); Cs_Out[Cs_Out.Length - 1] = Cs[i][j]; } } return(Cs_Out); }
/// 给定一组收尾相连的线,判断每根线是否是首尾颠倒的,颠倒为true /// <summary> /// 给定一组收尾相连的线,判断每根线是否是首尾颠倒的,颠倒为true /// </summary> public static bool[] Check_HeadTail(WEntity2D[] Curves) { bool[] Out = new bool[Curves.Length]; Out[0] = false; WCurve2D C = (WCurve2D)Curves[0]; WPoint2D P0 = C.EndPoint; for (int i = 1; i < Out.Length; i++) { C = (WCurve2D)Curves[i]; if (P0.DistanceTo(C.StartPoint) > P0.DistanceTo(C.EndPoint)) { Out[i] = true; P0 = C.StartPoint; } else { Out[i] = false; P0 = C.EndPoint; } } return(Out); }
/// <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); }
/// 得到一组线从头到尾的顺序 /// <summary> /// 得到一组线从头到尾的顺序 /// </summary> /// <param name="Curves"></param> /// <returns></returns> public static int[] Sort_Curves(WEntity2D[] Curves) { int Quan = Curves.Length; WPoint2D Pt; /////上一条线的尾端点 WPoint2D Ps, Pe; /////扫描线的起点及终点 List <int> At = new List <int>(); /////预先存储的顺序数组 for (int i = 1; i < Quan; i++) { At.Add(i); } int[] Ao = new int[Quan]; /////输出用的标示曲线顺序的数组 Ao[0] = 0; bool[] Co = new bool[Quan]; /////输出用的标示曲线起点开始或是终点开始的数组,True为首尾颠倒 Co[0] = true; WCurve2D C = (WCurve2D)Curves[0]; int Num; double l; Pt = C.EndPoint; for (int i = 1; i < Quan; i++) { for (int j = 0; j < At.Count; j++) { Num = At[j]; C = (WCurve2D)Curves[Num]; Ps = C.StartPoint; Pe = C.EndPoint; l = Ps.DistanceTo(Pt); if (l < WGeos2D_Paras.E_Merge) { Ao[i] = Num; Co[i] = false; Pt = Pe; At.RemoveAt(j); break; } l = Pe.DistanceTo(Pt); if (l < WGeos2D_Paras.E_Merge) { Ao[i] = Num; Co[i] = true; Pt = Ps; At.RemoveAt(j); break; } } } //////////////// for (int i = 0; i < Quan; i++) { Ao[i] *= 2; if (Co[i] == true) /////如果首尾颠倒则输出一个奇数,否则输出一个偶数 { Ao[i]++; } } return(Ao); }