/// <inheritdoc /> public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (values[1] is List <ILayoutElement> elements) { // Create a StreamGeometry to draw element StreamGeometry geometry = new StreamGeometry(); using (StreamGeometryContext ctx = geometry.Open()) { if (elements.FirstOrDefault() is Obstacle) { foreach (var obstacle in elements) { var position = obstacle.Position; var pointNW = new Point(position.X, position.Y); var pointNE = new Point(position.X + obstacle.Area.Width, position.Y); var pointSW = new Point(position.X, position.Y + obstacle.Area.Height); var pointSE = new Point(position.X + obstacle.Area.Width, position.Y + obstacle.Area.Height); ctx.BeginFigure(pointNW, false, true); ctx.LineTo(pointNE, true, false); ctx.LineTo(pointSE, true, false); ctx.LineTo(pointSW, true, false); ctx.LineTo(pointNW, true, false); ctx.LineTo(pointSE, true, false); ctx.LineTo(pointNE, true, false); ctx.LineTo(pointSW, true, false); } geometry.FillRule = FillRule.EvenOdd; } else if (elements.FirstOrDefault() is PickingSlot) { foreach (var pickingSlot in elements) { ctx.DrawGeometry(new EllipseGeometry(new Point(pickingSlot.Position.X, pickingSlot.Position.Y), 1.5, 1.5)); } } else if (elements.FirstOrDefault() is CoordLayoutElement) { foreach (var travelStep in elements) { ctx.DrawGeometry(new RectangleGeometry(new Rect(travelStep.Position.X, travelStep.Position.Y, 1, 1))); } } geometry.Freeze(); return(geometry); } } return(Binding.DoNothing); }
private Geometry CreateGeometry(Point p, double radius, double startDegrees, double deltaDegrees) { // Create a StreamGeometry for describing the shape StreamGeometry geometry = new StreamGeometry(); using (StreamGeometryContext context = geometry.Open()) { var rad1 = Deg2Rad(startDegrees); var drad = Deg2Rad(deltaDegrees); var rad2 = rad1 + drad; var p1 = new Point((Math.Cos(rad1) + 1) * radius + p.X, -(Math.Sin(rad1) - 1) * radius + p.Y); var p2 = new Point((Math.Cos(rad2) + 1) * radius + p.X, -(Math.Sin(rad2) - 1) * radius + p.Y); context.BeginFigure(p, true, true); if (deltaDegrees >= 360) { context.DrawGeometry(new EllipseGeometry(new Rect(p.X - radius, p.Y - radius, radius * 2, radius * 2))); } else if (deltaDegrees >= 0) { context.LineTo(p1, true, true); context.ArcTo(p2, new Size(radius, radius), drad, deltaDegrees > 180, SweepDirection.Counterclockwise, true, true); context.Close(); } } // Freeze the geometry for performance benefits geometry.Freeze(); return(geometry); }
private static void AddPoint(StreamGeometryContext context, SqlGeometry point, Func <Point, Point> transform) { var center = transform(point.AsWpfPoint()); context.DrawGeometry(new EllipseGeometry(new Rect(center.X - pointSize / 2.0, center.Y - pointSize / 2.0, pointSize, pointSize))); //context.DrawGeometry(new EllipseGeometry(transform(new Point(point.STX.Value, point.STY.Value)), pointSize, pointSize)); }
/// <summary> /// Draws the pie piece /// </summary> private void DrawGeometry(StreamGeometryContext context) { if (WedgeAngle == 0) { return; } if (WedgeAngle == 360) { context.DrawGeometry(new EllipseGeometry(new Point(CentreX, CentreY), Radius, Radius)); return; } Point innerArcStartPoint = ComputeCartesianCoordinate(RotationAngle, InnerRadius); innerArcStartPoint.Offset(CentreX, CentreY); Point innerArcEndPoint = ComputeCartesianCoordinate(RotationAngle + WedgeAngle, InnerRadius); innerArcEndPoint.Offset(CentreX, CentreY); Point outerArcStartPoint = ComputeCartesianCoordinate(RotationAngle, Radius); outerArcStartPoint.Offset(CentreX, CentreY); Point outerArcEndPoint = ComputeCartesianCoordinate(RotationAngle + WedgeAngle, Radius); outerArcEndPoint.Offset(CentreX, CentreY); bool largeArc = WedgeAngle > 180.0; if (PushOut > 0) { Point offset = ComputeCartesianCoordinate(RotationAngle + WedgeAngle / 2, PushOut); innerArcStartPoint.Offset(offset.X, offset.Y); innerArcEndPoint.Offset(offset.X, offset.Y); outerArcStartPoint.Offset(offset.X, offset.Y); outerArcEndPoint.Offset(offset.X, offset.Y); } Size outerArcSize = new Size(Radius, Radius); Size innerArcSize = new Size(InnerRadius, InnerRadius); context.BeginFigure(innerArcStartPoint, true, true); context.LineTo(outerArcStartPoint, true, true); context.ArcTo(outerArcEndPoint, outerArcSize, 0, largeArc, SweepDirection.Clockwise, true, true); context.LineTo(innerArcEndPoint, true, true); context.ArcTo(innerArcStartPoint, innerArcSize, 0, largeArc, SweepDirection.Counterclockwise, true, true); }
private void InternalDraw(StreamGeometryContext context) { var center = new Point(ActualWidth / 2d, ActualHeight / 2d); var rad1 = Deg2Rad(StartDegrees); var drad = Deg2Rad(DeltaDegrees); var rad2 = rad1 + drad; var p1 = new Point((Math.Cos(rad1) + 1) * ActualWidth / 2d, -(Math.Sin(rad1) - 1) * ActualHeight / 2d); var p2 = new Point((Math.Cos(rad2) + 1) * ActualWidth / 2d, -(Math.Sin(rad2) - 1) * ActualHeight / 2d); context.BeginFigure(center, true, true); if (DeltaDegrees >= 360) { context.DrawGeometry(new EllipseGeometry(new Rect(0, 0, ActualWidth, ActualHeight))); } else if (DeltaDegrees >= 0) { context.LineTo(p1, true, true); context.ArcTo(p2, new Size(ActualWidth / 2d, ActualHeight / 2d), drad, DeltaDegrees > 180, SweepDirection.Counterclockwise, true, true); context.Close(); } }