Example #1
0
 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);
         }
     }
 }
Example #2
0
        //获取折线与边的交点
        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
            });
        }
Example #3
0
        //由线段集合生成等值线集合
        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()));
        }
Example #4
0
        //获取多条等值线与线段你的交点
        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
            });
        }