public Shape(ShapeType shapeType, Color color, Rectangle bounds) { FigureType = shapeType; Color = color; switch (shapeType) { case ShapeType.DrawRect: case ShapeType.FillRect: case ShapeType.DrawLine: Points = bounds.ToPolygon(); break; case ShapeType.FillEllipse: case ShapeType.DrawEllipse: Points = new EllipseBuilder().BuildEllipse(bounds); break; case ShapeType.DrawPolygon: case ShapeType.FillPolygon: Random rnd = new Random(); var pointCount = rnd.Next(3, 13); var size = bounds.Width / 2; var innerSize = size * (0.2 + rnd.NextDouble() * 0.5); var angle = rnd.NextDouble() * 2 * Math.PI; Points = new StarBuilder().BuildStar(pointCount, size, innerSize, bounds.CenterPoint, angle); break; } }
private void DrawForrestPaths() { Canvas.Children.Clear(); foreach (var crossroad in GlobalForestPaths.GetCrossroads()) { BuildDirector ellipseDirector = new BuildDirector(); EllipseBuilder ellipseBuilder = ellipseDirector.BuildEllipse(crossroad); Ellipse ellipse = ellipseBuilder.GetEllipse(); Canvas.SetLeft(ellipse, crossroad.Position.X - ellipse.Height / 2); Canvas.SetTop(ellipse, crossroad.Position.Y - ellipse.Width / 2); Canvas.SetZIndex(ellipse, 2); Canvas.Children.Add(ellipse); foreach (var eges in GlobalForestPaths.GetNextCrossroads(crossroad)) { BuildDirector lineDirector = new BuildDirector(); LineBuilder lineBuilder = lineDirector.BuildLine(GlobalForestPaths, crossroad.Key, eges.Key); Line line = lineBuilder.GetLine(); string[] lineName = line.Name.Split('_'); if (FindChildByName($"{lineName[1]}_{lineName[0]}") == null) { Canvas.SetZIndex(line, 1); Canvas.Children.Add(line); } } } }
public void Execute() { key = forestPaths.AddCrossroad(crossroad); BuildDirector director = new BuildDirector(); EllipseBuilder builder = director.BuildEllipse(crossroad); Ellipse ellipse = builder.GetEllipse(); Canvas.SetLeft(ellipse, crossroad.Position.X - ellipse.Height / 2); Canvas.SetTop(ellipse, crossroad.Position.Y - ellipse.Width / 2); Canvas.SetZIndex(ellipse, 2); canvas.Children.Add(ellipse); }
public void GB_BuildCircle() { var builder = new EllipseBuilder(); const int radius = 4; var points = builder.BuildCircle(Vector2.Zero, radius); foreach (var point in points) { point.Length().Should().BeApproximately(radius, 0.00001f, $"Point {point} should be at radius {radius} but instead was at {point.Length()}"); } }
public void GB_BuildEllipseAxisAligned() { var builder = new EllipseBuilder(); const int majorAxis = 8; const int minorAxis = 4; var points = builder.BuildEllipse(Vector2.Zero, majorAxis, minorAxis, 0); foreach (var point in points) { // Equation for an ellipse: // (x/a)^2 + (y/b)^2 = 1 var norm = Vector2.UnitX * point.X / majorAxis + Vector2.UnitY * point.Y / minorAxis; norm.LengthSquared().Should().BeApproximately(1, 0.00001f, $"Point {point} does not satisfy the ellipse equation."); } }
public void GB_BuildEllipseBoundingBox() { var builder = new EllipseBuilder(); const int majorAxis = 8; const int minorAxis = 4; Rectangle boundingBox = new Rectangle(-majorAxis, -minorAxis, majorAxis * 2, minorAxis * 2); var points = builder.BuildEllipse((RectangleF)boundingBox); foreach (var point in points) { // Equation for an ellipse: // (x/a)^2 + (y/b)^2 = 1 var norm = Vector2.UnitX * point.X / majorAxis + Vector2.UnitY * point.Y / minorAxis; norm.LengthSquared().Should().BeApproximately(1, 0.00001f, $"Point {point} does not satisfy the ellipse equation."); } }