Example #1
0
        public override Vector GetPortPosition(Port port)
        {
            // map the compass points onto our bounding rectangle
            var compass = (CompassPort)port;

            return(InnerBounds.GetCorner(compass.CompassPoint));
        }
Example #2
0
        public static float DistanceFromRect(Rect rect, Vector pos)
        {
            if (rect.Contains(pos))
            {
                return(0);
            }
            var nw = rect.GetCorner(CompassPoint.NorthWest);
            var ne = rect.GetCorner(CompassPoint.NorthEast);
            var sw = rect.GetCorner(CompassPoint.SouthWest);
            var se = rect.GetCorner(CompassPoint.SouthEast);

            var distanceFromTop    = DistanceFromLineSegment(new LineSegment(nw, ne), pos);
            var distanceFromRight  = DistanceFromLineSegment(new LineSegment(ne, se), pos);
            var distanceFromBottom = DistanceFromLineSegment(new LineSegment(se, sw), pos);
            var distanceFromLeft   = DistanceFromLineSegment(new LineSegment(sw, nw), pos);

            return(Math.Min(distanceFromTop, Math.Min(distanceFromLeft, Math.Min(distanceFromBottom, distanceFromRight))));
        }
Example #3
0
        private static void Annotate(XGraphics graphics, Palette palette, LineSegment lineSegment, TextBlock text, StringAlignment alignment)
        {
            Vector point;
            var    delta = lineSegment.Delta;

            switch (alignment)
            {
            case StringAlignment.Near:
            default:
                point = lineSegment.Start;
                delta.Negate();
                break;

            case StringAlignment.Center:
                point = lineSegment.Mid;
                break;

            case StringAlignment.Far:
                point = lineSegment.End;
                break;
            }

            var bounds = new Rect(point, Vector.Zero);

            bounds.Inflate(Settings.TextOffsetFromConnection);

            var angle        = (float)-(Math.Atan2(delta.Y, delta.X) / Math.PI * 180.0);
            var compassPoint = CompassPoint.East;

            if (Numeric.InRange(angle, 0, 45))
            {
                compassPoint = CompassPoint.NorthWest;
            }
            else if (Numeric.InRange(angle, 45, 90))
            {
                compassPoint = CompassPoint.SouthEast;
            }
            else if (Numeric.InRange(angle, 90, 135))
            {
                compassPoint = CompassPoint.SouthWest;
            }
            else if (Numeric.InRange(angle, 135, 180))
            {
                compassPoint = CompassPoint.NorthEast;
            }
            else if (Numeric.InRange(angle, 0, -45))
            {
                compassPoint = CompassPoint.NorthEast;
            }
            else if (Numeric.InRange(angle, -45, -90))
            {
                compassPoint = CompassPoint.NorthEast;
            }
            else if (Numeric.InRange(angle, -90, -135))
            {
                compassPoint = CompassPoint.NorthWest;
            }
            else if (Numeric.InRange(angle, -135, -180))
            {
                compassPoint = CompassPoint.SouthEast;
            }

            var pos    = bounds.GetCorner(compassPoint);
            var format = new XStringFormat();

            Drawing.SetAlignmentFromCardinalOrOrdinalDirection(format, compassPoint);
            if (alignment == StringAlignment.Center && Numeric.InRange(angle, -10, 10))
            {
                // HACK: if the line segment is pretty horizontal and we're drawing mid-line text,
                // move text below the line to get it out of the way of any labels at the ends,
                // and center the text so it fits onto a line between two proximal rooms.
                pos = bounds.GetCorner(CompassPoint.South);
                format.Alignment     = XStringAlignment.Center;
                format.LineAlignment = XLineAlignment.Near;
            }
            if (!Settings.DebugDisableTextRendering)
            {
                text.Draw(graphics, Settings.LineFont, palette.LineTextBrush, pos, Vector.Zero, format);
            }
        }
Example #4
0
        public static float DistanceFromRect(Rect rect, Vector pos)
        {
            if (rect.Contains(pos))
            {
                return 0;
            }
            var nw = rect.GetCorner(CompassPoint.NorthWest);
            var ne = rect.GetCorner(CompassPoint.NorthEast);
            var sw = rect.GetCorner(CompassPoint.SouthWest);
            var se = rect.GetCorner(CompassPoint.SouthEast);

            var distanceFromTop = DistanceFromLineSegment(new LineSegment(nw, ne), pos);
            var distanceFromRight = DistanceFromLineSegment(new LineSegment(ne, se), pos);
            var distanceFromBottom = DistanceFromLineSegment(new LineSegment(se, sw), pos);
            var distanceFromLeft = DistanceFromLineSegment(new LineSegment(sw, nw), pos);

            return Math.Min(distanceFromTop, Math.Min(distanceFromLeft, Math.Min(distanceFromBottom, distanceFromRight)));
        }
Example #5
0
        private static void Annotate(XGraphics graphics, Palette palette, LineSegment lineSegment, TextBlock text, StringAlignment alignment, RoomShape? shape = RoomShape.SquareCorners)
        {
            Vector point;
              var delta = lineSegment.Delta;
              switch (alignment)
              {
            case StringAlignment.Near:
            default:
              point = lineSegment.Start;
              delta.Negate();
              break;
            case StringAlignment.Center:
              point = lineSegment.Mid;
              break;
            case StringAlignment.Far:
              point = lineSegment.End;
              break;
              }

              var bounds = new Rect(point, Vector.Zero);
              bounds.Inflate(Settings.TextOffsetFromConnection);

              var angle = (float) -(Math.Atan2(delta.Y, delta.X)/Math.PI*180.0);
              var compassPoint = CompassPoint.East;
              if (Numeric.InRange(angle, 0, 45))
              {
            compassPoint = CompassPoint.NorthWest;
              }
              else if (Numeric.InRange(angle, 45, 90))
              {
            compassPoint = CompassPoint.SouthEast;
              }
              else if (Numeric.InRange(angle, 90, 135))
              {
            compassPoint = CompassPoint.SouthWest;
              }
              else if (Numeric.InRange(angle, 135, 180))
              {
            compassPoint = CompassPoint.NorthEast;
              }
              else if (Numeric.InRange(angle, 0, -45))
              {
            compassPoint = CompassPoint.NorthEast;
              }
              else if (Numeric.InRange(angle, -45, -90))
              {
            compassPoint = CompassPoint.NorthEast;
              }
              else if (Numeric.InRange(angle, -90, -135))
              {
            compassPoint = CompassPoint.NorthWest;
              }
              else if (Numeric.InRange(angle, -135, -180))
              {
            compassPoint = CompassPoint.SouthEast;
              }

              var pos = bounds.GetCorner(compassPoint);
              var format = new XStringFormat();
              Drawing.SetAlignmentFromCardinalOrOrdinalDirection(format, compassPoint);
              if (alignment == StringAlignment.Center && Numeric.InRange(angle, -10, 10))
              {
            // HACK: if the line segment is pretty horizontal and we're drawing mid-line text,
            // move text below the line to get it out of the way of any labels at the ends,
            // and center the text so it fits onto a line between two proximal rooms.
            pos = bounds.GetCorner(CompassPoint.South);
            format.Alignment = XStringAlignment.Center;
            format.LineAlignment = XLineAlignment.Near;
              }

              if (!Settings.DebugDisableTextRendering)
            text.Draw(graphics, Settings.LineFont, palette.LineTextBrush, pos, Vector.Zero, format);
        }