/// 找出线集围城的封闭区域,输出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); }
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); }
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); }
/// <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); }
/// <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); }
/// 找到最大的,可以包络所有其他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 }); }