public override Vector GetPortPosition(Port port) { // map the compass points onto our bounding rectangle var compass = (CompassPort)port; return(InnerBounds.GetCorner(compass.CompassPoint)); }
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)))); }
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); } }
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))); }
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); }