static void TryToIncreaseRank(LgEdgeInfo edgeInfo, double edgeRank)
 {
     if (edgeInfo.Rank < edgeRank)
     {
         edgeInfo.Rank = edgeRank;
     }
 }
 void TryToDecreaseZoomLevel(LgEdgeInfo edgeInfo)
 {
     if (edgeInfo.ZoomLevel > zoomLevel)
     {
         edgeInfo.ZoomLevel = zoomLevel;
     }
 }
        internal Rail(ICurve curveSegment, LgEdgeInfo topRankedEdgeInfoOfTheRail, int zoomLevel)
#if DEBUG
            : this()
#endif
        {
            TopRankedEdgeInfoOfTheRail = topRankedEdgeInfoOfTheRail;
            this.ZoomLevel = zoomLevel;
            Geometry = curveSegment;
        }
Beispiel #4
0
        public void UpdateTopEdgeInfo(LgEdgeInfo ei)
        {
            if (TopRankedEdgeInfoOfTheRail == null || TopRankedEdgeInfoOfTheRail.Rank < ei.Rank)
            {
                TopRankedEdgeInfoOfTheRail = ei;
            }

            MinPassingEdgeZoomLevel = 1 + Math.Min(MinPassingEdgeZoomLevel, ei.ZoomLevel);
        }
Beispiel #5
0
        internal Rail(ICurve curveSegment, LgEdgeInfo topRankedEdgeInfoOfTheRail, int zoomLevel)
#if DEBUG
            : this()
#endif
        {
            TopRankedEdgeInfoOfTheRail = topRankedEdgeInfoOfTheRail;
            this.ZoomLevel             = zoomLevel;
            Geometry = curveSegment;
        }
Beispiel #6
0
        internal Rail(Arrowhead arrowhead, Point curveAttachmentPoint, LgEdgeInfo topRankedEdgeInfoOfTheRail,
                      int zoomLevel)
#if DEBUG
            : this()
#endif
        {
            TopRankedEdgeInfoOfTheRail = topRankedEdgeInfoOfTheRail;
            Geometry             = arrowhead.Clone();
            CurveAttachmentPoint = curveAttachmentPoint;
            ZoomLevel            = zoomLevel;
        }
Beispiel #7
0
        public void AssembleEdgeAtLevel(LgEdgeInfo lgEi, int iLevel, Set <Rail> rails)
        {
            var edge = lgEi.Edge;

            var level = Levels[iLevel];

            level._railsOfEdges[edge] = rails;
            foreach (Rail rail in rails)
            {
                level.AddRail(rail);
                rail.UpdateTopEdgeInfo(lgEi);
            }
        }
Beispiel #8
0
        internal void RegisterRailsOfEdge(LgEdgeInfo edgeInfo)
        {
            var curve = edgeInfo.Edge.Curve as Curve;

            if (curve != null)
            {
                foreach (var seg in curve.Segments)
                {
                    RegisterElementaryRail(edgeInfo, seg);
                }
            }
            else
            {
                RegisterElementaryRail(edgeInfo, edgeInfo.Edge.Curve);
            }
            RegisterRailsForArrowheads(edgeInfo);
        }
Beispiel #9
0
        void RegisterElementaryRail(LgEdgeInfo edgeInfo, ICurve seg)
        {
            Rail rail;
            var  tuple = new Tuple <Point, Point>(seg.Start, seg.End);

            //was the seg registered before?
            if (_railDictionary.TryGetValue(tuple, out rail))
            {
                if (rail.TopRankedEdgeInfoOfTheRail.Rank < edgeInfo.Rank) //newcoming edgeInfo is more important
                {
                    rail.TopRankedEdgeInfoOfTheRail = edgeInfo;
                }
            }
            else
            {
                _railDictionary[tuple] = new Rail(seg, edgeInfo, ZoomLevel);
            }
        }
Beispiel #10
0
        void RegisterRailsForArrowheads(LgEdgeInfo edgeInfo)
        {
            var edgeGeom = edgeInfo.Edge.EdgeGeometry;

            if (edgeGeom.SourceArrowhead != null)
            {
                var  tuple = new Tuple <Point, Point>(edgeGeom.SourceArrowhead.TipPosition, edgeGeom.Curve.Start);
                Rail rail;
                if (_railDictionary.TryGetValue(tuple, out rail))
                {
                    if (rail.TopRankedEdgeInfoOfTheRail.Rank < edgeInfo.Rank) //the newcoming edgeInfo is more important
                    {
                        rail.TopRankedEdgeInfoOfTheRail = edgeInfo;
                    }
                }
                else
                {
                    _railDictionary[tuple] = new Rail(edgeGeom.SourceArrowhead, edgeGeom.Curve.Start, edgeInfo,
                                                      ZoomLevel);
                }
            }

            if (edgeGeom.TargetArrowhead != null)
            {
                var  tuple = new Tuple <Point, Point>(edgeGeom.TargetArrowhead.TipPosition, edgeGeom.Curve.End);
                Rail rail;
                if (_railDictionary.TryGetValue(tuple, out rail))
                {
                    if (rail.TopRankedEdgeInfoOfTheRail.Rank < edgeInfo.Rank) //the newcoming edgeInfo is more important
                    {
                        _railDictionary[tuple] = new Rail(edgeGeom.TargetArrowhead, edgeGeom.Curve.End, edgeInfo,
                                                          ZoomLevel);
                    }
                }
                else
                {
                    _railDictionary[tuple] = new Rail(edgeGeom.TargetArrowhead, edgeGeom.Curve.End, edgeInfo,
                                                      ZoomLevel);
                }
            }
        }
 static bool AddLevel(LgData lgData, IZoomLevelCalculator nodeZoomLevelCalculator, int nodeCountOnLevel, LgEdgeInfo[] edgeInfos) {
     var zoomLevel = (int) nodeZoomLevelCalculator.SortedLgNodeInfos[nodeCountOnLevel - 1].ZoomLevel;
     var edgeInfosOfLevel = edgeInfos.TakeWhile(ei => ei.ZoomLevel <= zoomLevel).ToList();
     lgData.AddLevel();
     return edgeInfosOfLevel.Count() == lgData.GeometryEdgesToLgEdgeInfos.Count;
 }
 static void TryToIncreaseRank(LgEdgeInfo edgeInfo, double edgeRank) {
     if (edgeInfo.Rank < edgeRank)
         edgeInfo.Rank = edgeRank;
 }
 void WriteLgEdgeInfo(Edge edge, LgEdgeInfo ei) {
     WriteStartElement(GeometryToken.LgEdgeInfo);
     WriteAttribute(GeometryToken.EdgeId, edgeIds[edge]);
     WriteAttribute(GeometryToken.Rank, ei.Rank);
     WriteAttribute(GeometryToken.Zoomlevel, ei.ZoomLevel);
     WriteEndElement();
 }
 void UpdateToRankedEdgeInfoForRail(string railId, LgEdgeInfo edgeInfo) {
     LgEdgeInfo topRankeEdgeInfo;
     if (railIdsToTopRankedEdgeInfo.TryGetValue(railId, out topRankeEdgeInfo)) {
         if (topRankeEdgeInfo.Rank < edgeInfo.Rank)
             railIdsToTopRankedEdgeInfo[railId] = edgeInfo;
     }
     else
         railIdsToTopRankedEdgeInfo[railId] = edgeInfo;
 }
        Rail ContinueReadingRail(LgEdgeInfo topRankedEdgoInfo, int zoomLevel, LgLevel level) {
            XmlRead();
            string pointString;
            if (TokenIs(GeometryToken.Arrowhead)) {
                Point arrowheadPosition = TryGetPointAttribute(GeometryToken.ArrowheadPosition);
                Point attachmentPoint = TryGetPointAttribute(GeometryToken.CurveAttachmentPoint);
                Arrowhead ah = new Arrowhead {
                    TipPosition = arrowheadPosition,
                    Length = (attachmentPoint - arrowheadPosition).Length
                };
                XmlRead();
                ReadEndElement();
                var rail = new Rail(ah, attachmentPoint, topRankedEdgoInfo, zoomLevel);
                var tuple = new SymmetricSegment(arrowheadPosition, attachmentPoint);
                level._railDictionary[tuple] = rail;
                return rail;
            }

            if (TokenIs(GeometryToken.LineSegment)) {
                pointString = GetAttribute(GeometryToken.Points);
                var linePoints = ParsePoints(pointString);
                Debug.Assert(linePoints.Length == 2);
                LineSegment ls = new LineSegment(linePoints[0], linePoints[1]);
                XmlRead();
                ReadEndElement();
                var rail = new Rail(ls, topRankedEdgoInfo, zoomLevel);
                var tuple = new SymmetricSegment(ls.Start, ls.End);
                level._railDictionary[tuple] = rail;
                level._railTree.Add(ls.BoundingBox, rail);
                return rail;
            }
            if (TokenIs(GeometryToken.CubicBezierSegment)) {
                pointString = GetAttribute(GeometryToken.Points);
                var controlPoints = ParsePoints(pointString);
                Debug.Assert(controlPoints.Length == 4);
                var bs = new CubicBezierSegment(controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3]);
                XmlRead();
                ReadEndElement();
                var rail = new Rail(bs, topRankedEdgoInfo, zoomLevel);
                var tuple = new SymmetricSegment(bs.Start, bs.End);
                level._railDictionary[tuple] = rail;
                return rail;
            }
            throw new Exception();
        }
        public void UpdateTopEdgeInfo(LgEdgeInfo ei)
        {
            if (TopRankedEdgeInfoOfTheRail == null || TopRankedEdgeInfoOfTheRail.Rank < ei.Rank)
                TopRankedEdgeInfoOfTheRail = ei;

            MinPassingEdgeZoomLevel = Math.Min(MinPassingEdgeZoomLevel, ei.ZoomLevel);
        }
        internal Rail(Arrowhead arrowhead, Point curveAttachmentPoint, LgEdgeInfo topRankedEdgeInfoOfTheRail,
            int zoomLevel)
#if DEBUG
            : this()
#endif
        {
            TopRankedEdgeInfoOfTheRail = topRankedEdgeInfoOfTheRail;
            Geometry = arrowhead.Clone();
            CurveAttachmentPoint = curveAttachmentPoint;
            ZoomLevel = zoomLevel;
        }
        public void AssembleEdgeAtLevel(LgEdgeInfo lgEi, int iLevel, Set<Rail> rails) {
            var edge = lgEi.Edge;

            var level = Levels[iLevel];

            level._railsOfEdges[edge] = rails;
            foreach (Rail rail in rails) {
                level.AddRail(rail);
                rail.UpdateTopEdgeInfo(lgEi);
            }
        }
 void TryToDecreaseZoomLevel(LgEdgeInfo edgeInfo) {
     if (edgeInfo.ZoomLevel > zoomLevel)
         edgeInfo.ZoomLevel = zoomLevel;
 }