public TopoPolyline(ContourPolyline polyline) { this.ArcID = polyline.PID; Innerid = _ArcID++; MiddlePoint = new List <TopoPoint>(); MBR = new MinBoundRect(); if (polyline.PointList.Count >= 2) { TopoPoint startPoint = new TopoPoint(polyline.PointList.First(), true); startPoint.TopologyArcs.Add(this); this.BeginNode = startPoint; TopoPoint endPoint = new TopoPoint(polyline.PointList.Last(), true); endPoint.TopologyArcs.Add(this); this.EndNode = endPoint; MBR.UpdateRect(startPoint.X, startPoint.Y); MBR.UpdateRect(endPoint.X, endPoint.Y); for (int i = 1; i < polyline.PointList.Count - 1; i++) { if (polyline.PointList[i].OID != startPoint.PointID && polyline.PointList[i].OID != EndNode.PointID) { TopoPoint midPoint = new TopoPoint(polyline.PointList[i], false); MiddlePoint.Add(midPoint); midPoint.TopologyArcs.Add(this); } MBR.UpdateRect(polyline.PointList[i].X, polyline.PointList[i].Y); } } }
//获取折线与边的交点 public static Object[] IntersectResult(ContourPolyline pl1, Edge edge) { List <ContourPolyline> sublineFromPL1 = new List <ContourPolyline>(); List <Edge> suEdgeFromEdge = new List <Edge>(); //对边上点排序 List <DataPoint> subEdgePoint = new List <DataPoint>(); subEdgePoint.Add(edge.StartPoint); subEdgePoint.Add(edge.EndPoint); edge.StartPoint.RelativeLoc = 0; edge.EndPoint.RelativeLoc = 1; //对折线上点排序 List <DataPoint> subLinePoint = new List <DataPoint>(); subLinePoint.Add(pl1.PointList[0]); for (int i = 0; i < pl1.PointList.Count - 1; i++) { Edge pl1OneEdge = new Edge(pl1.PointList[i], pl1.PointList[i + 1]); DataPoint intersectP = Edge.IntersectPoint(pl1OneEdge, edge); double relativeLocOnLine = Edge.IntersectPointRelativeLoc(pl1OneEdge, edge); double relativeLocOnEdge = Edge.IntersectPointRelativeLoc(edge, pl1OneEdge); if (intersectP != null) { if (relativeLocOnEdge < 1 && relativeLocOnEdge > 0) { intersectP.RelativeLoc = relativeLocOnEdge; subEdgePoint.Add(intersectP); } if (relativeLocOnLine <= 1 && relativeLocOnLine > 0) { subLinePoint.Add(intersectP); sublineFromPL1.Add(new ContourPolyline(subLinePoint.ToArray())); subLinePoint = new List <DataPoint>(); subLinePoint.Add(intersectP); } } subLinePoint.Add(pl1.PointList[i + 1]); } sublineFromPL1.Add(new ContourPolyline(subLinePoint.ToArray())); subEdgePoint.Sort((x, y) => x.RelativeLoc.CompareTo(y.RelativeLoc)); for (int i = 0; i < subEdgePoint.Count - 1; i++) { suEdgeFromEdge.Add(new Edge(subEdgePoint[i], subEdgePoint[i + 1])); } return(new Object[2] { sublineFromPL1, suEdgeFromEdge }); }
//由线段集合生成等值线集合 public static ContourPolylineSet TopologyGenerateContourPolylineSet(Edge[] Edges) { List <ContourPolyline> ContourPolylineList = new List <ContourPolyline>(); PointSet ContourPointSet = new PointSet(); EdgeSet ContourEdgeSet = new EdgeSet(Edges); EdgeSet ContourEdgeSetCopy = new EdgeSet(Edges); for (int i = 0; i < Edges.Length; i++) { ContourPointSet.AddPoint(Edges[i].StartPoint); ContourPointSet.AddPoint(Edges[i].EndPoint); } List <int> PointOID = ContourPointSet.GetPointOIDList(); while (PointOID.Count > 0) { //选取一个等值线上的点 List <int> tempPointsOID = new List <int>(); tempPointsOID.Add(PointOID[0]); PointOID.Remove(PointOID[0]); for (int i = 0; i < tempPointsOID.Count; i++) { Edge tempEdge = ContourEdgeSetCopy.GetEdgeByOID(tempPointsOID[i]); if (tempEdge != null) { int tempoid = (tempEdge.StartOID == tempPointsOID[i]) ? tempEdge.EndOID : tempEdge.StartOID; tempPointsOID.Add(tempoid); ContourEdgeSetCopy.EdgeList.Remove(tempEdge); PointOID.Remove(tempoid); i = -1; } } //找到了这条线上的全部点 List <DataPoint> tempPointList = new List <DataPoint>(); tempPointList.Add(ContourPointSet.GetPointByOID(tempPointsOID[0])); Edge firstEdge = ContourEdgeSet.GetEdgeByOID(tempPointsOID[0]); int secondOID = (firstEdge.StartOID == tempPointsOID[0]) ? firstEdge.EndOID : firstEdge.StartOID; tempPointList.Add(ContourPointSet.GetPointByOID(secondOID)); ContourEdgeSet.EdgeList.Remove(firstEdge); while (true) { int endPointOID = tempPointList.Last().OID; Edge endEdge = ContourEdgeSet.GetEdgeByOID(endPointOID); if (endEdge != null) { int endOID = (endEdge.StartOID == endPointOID) ? endEdge.EndOID : endEdge.StartOID; tempPointList.Add(ContourPointSet.GetPointByOID(endOID)); ContourEdgeSet.EdgeList.Remove(endEdge); } else { break; } } while (true) { int startPointOID = tempPointList.First().OID; Edge startEdge = ContourEdgeSet.GetEdgeByOID(startPointOID); if (startEdge != null) { int startOID = (startEdge.StartOID == startPointOID) ? startEdge.EndOID : startEdge.StartOID; tempPointList.Insert(0, ContourPointSet.GetPointByOID(startOID)); ContourEdgeSet.EdgeList.Remove(startEdge); } else { break; } } ContourPolyline tempPolyline = new ContourPolyline(tempPointList.ToArray()); ContourPolylineList.Add(tempPolyline); } return(new ContourPolylineSet(ContourPolylineList.ToArray())); }
//获取多条等值线与线段你的交点 public static Object[] IntersectResult(ContourPolyline[] plineList, Edge edge) { List <ContourPolyline> sublineFromPLs = new List <ContourPolyline>(); List <Edge> suEdgeFromEdge = new List <Edge>(); //对边上点排序 List <DataPoint> subEdgePoint = new List <DataPoint>(); subEdgePoint.Add(edge.StartPoint); subEdgePoint.Add(edge.EndPoint); edge.StartPoint.RelativeLoc = 0; edge.EndPoint.RelativeLoc = 1; for (int k = 0; k < plineList.Length; k++) { //对折线上点排序 List <DataPoint> subLinePoint = new List <DataPoint>(); ContourPolyline curCpl = plineList[k]; subLinePoint.Add(curCpl.PointList[0]); //选取一个等值线 for (int i = 0; i < curCpl.PointList.Count - 1; i++) { Edge pl1OneEdge = new Edge(curCpl.PointList[i], curCpl.PointList[i + 1]); DataPoint intersectP = Edge.IntersectPoint(pl1OneEdge, edge); double relativeLocOnLine = Edge.IntersectPointRelativeLoc(pl1OneEdge, edge); double relativeLocOnEdge = Edge.IntersectPointRelativeLoc(edge, pl1OneEdge); if (intersectP != null) { if (relativeLocOnEdge < 1 && relativeLocOnEdge > 0) { intersectP.RelativeLoc = relativeLocOnEdge; subEdgePoint.Add(intersectP); } if (relativeLocOnLine <= 1 && relativeLocOnLine > 0) { if (subLinePoint.Count == 1 && subLinePoint[0].OID == intersectP.OID) { } else { subLinePoint.Add(intersectP); sublineFromPLs.Add(new ContourPolyline(subLinePoint.ToArray())); subLinePoint = new List <DataPoint>(); subLinePoint.Add(intersectP); } } } subLinePoint.Add(curCpl.PointList[i + 1]); } if (subLinePoint.Count >= 2 && !(subLinePoint.Count == 2 && subLinePoint[0].OID == subLinePoint[1].OID)) { sublineFromPLs.Add(new ContourPolyline(subLinePoint.ToArray())); } } subEdgePoint.Sort((x, y) => x.RelativeLoc.CompareTo(y.RelativeLoc)); for (int i = 0; i < subEdgePoint.Count - 1; i++) { if (subEdgePoint[i].RelativeLoc != subEdgePoint[i + 1].RelativeLoc) { suEdgeFromEdge.Add(new Edge(subEdgePoint[i], subEdgePoint[i + 1])); } } return(new Object[2] { sublineFromPLs, suEdgeFromEdge }); }