/// 分割点集为线段集合 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]); } } }
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(); }
/// 对夹丝边界线进行排序,从左至右输出竖向线 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); }
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); }
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); }
/// 增加几何实例 /// <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; } }
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)); } }
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); }
/// 对夹丝线进行排序,从左至右输出 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); }
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:\\"); } } }
/// <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); }
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); }
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); }
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); }
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); }
/// <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); }
public static WPoint2D Intersection_L2L(WLine2D L1, WPoint2D P1, WPoint2D P2) { return(Intersection_L2L(L1.StartPoint, L1.EndPoint, P1, P2)); }
/// 找到所有的边界线及所有的区域 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)); }
/// <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); }
public static WPoint2D Intersection_L2L(WLine2D L1, WLine2D L2) { return(Intersection_L2L(L1.StartPoint, L1.EndPoint, L2.StartPoint, L2.EndPoint)); }
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); }
public static WPoint2D ClosestPoint_P2L(WPoint2D P, WLine2D L, bool Extent) { return(ClosestPoint_P2L(L.StartPoint, L.EndPoint, P, Extent)); }