public void TestRectangleSegmentDistance() { Polygon r1 = new PolygonRectangle(new RealPoint(0, 0), 10, 10); // Test avec segments confondus Segment s11 = new Segment(new RealPoint(0, 0), new RealPoint(0, 10)); Segment s12 = new Segment(new RealPoint(0, 10), new RealPoint(10, 10)); Segment s13 = new Segment(new RealPoint(10, 10), new RealPoint(10, 0)); Segment s14 = new Segment(new RealPoint(10, 0), new RealPoint(0, 0)); Assert.AreEqual(0, r1.Distance(s11)); Assert.AreEqual(0, r1.Distance(s12)); Assert.AreEqual(0, r1.Distance(s13)); Assert.AreEqual(0, r1.Distance(s14)); // Test avec segments décales Segment s21 = new Segment(new RealPoint(20, 0), new RealPoint(20, 10)); Segment s22 = new Segment(new RealPoint(-10, 0), new RealPoint(-10, 10)); Segment s23 = new Segment(new RealPoint(0, -10), new RealPoint(10, -10)); Segment s24 = new Segment(new RealPoint(0, 20), new RealPoint(10, 20)); Assert.AreEqual(10, r1.Distance(s21)); Assert.AreEqual(10, r1.Distance(s22)); Assert.AreEqual(10, r1.Distance(s23)); Assert.AreEqual(10, r1.Distance(s24)); }
public void TestRectanglesDistance() { Polygon r1 = new PolygonRectangle(new RealPoint(0, 0), 10, 10); // Polygones décalés vérticalements OU horizontalement + coincidence segment Polygon r11 = new PolygonRectangle(new RealPoint(10, 0), 10, 10); Polygon r12 = new PolygonRectangle(new RealPoint(-10, 0), 10, 10); Polygon r13 = new PolygonRectangle(new RealPoint(0, 10), 10, 10); Polygon r14 = new PolygonRectangle(new RealPoint(0, -10), 10, 10); Assert.AreEqual(0, r1.Distance(r11)); Assert.AreEqual(0, r1.Distance(r12)); Assert.AreEqual(0, r1.Distance(r13)); Assert.AreEqual(0, r1.Distance(r14)); // Polygones décalés vérticalements ou horizontalement + coincidence coin Polygon r21 = new PolygonRectangle(new RealPoint(10, 0), 10, 10); Polygon r22 = new PolygonRectangle(new RealPoint(-10, 0), 10, 10); Polygon r23 = new PolygonRectangle(new RealPoint(0, 10), 10, 10); Polygon r24 = new PolygonRectangle(new RealPoint(0, -10), 10, 10); Assert.AreEqual(0, r1.Distance(r21)); Assert.AreEqual(0, r1.Distance(r22)); Assert.AreEqual(0, r1.Distance(r23)); Assert.AreEqual(0, r1.Distance(r24)); // Polygones décalés vérticalements ET horizontalement Polygon r31 = new PolygonRectangle(new RealPoint(20, 20), 10, 10); Polygon r32 = new PolygonRectangle(new RealPoint(-20, -20), 10, 10); Polygon r33 = new PolygonRectangle(new RealPoint(-20, -20), 10, 10); Assert.AreEqual(Math.Sqrt(10 * 10 + 10 * 10), r1.Distance(r31)); Assert.AreEqual(Math.Sqrt(10 * 10 + 10 * 10), r1.Distance(r32)); }
private static IShape BuildCurrentShape(ShapeMode mode, RealPoint startPoint, RealPoint endPoint) { IShape output = null; switch (mode) { case ShapeMode.Rectangle: output = new PolygonRectangle(startPoint, endPoint.X - startPoint.X, endPoint.Y - startPoint.Y); break; case ShapeMode.Circle: output = new Circle(new Segment(startPoint, endPoint).Barycenter, startPoint.Distance(endPoint) / 2); break; case ShapeMode.CircleFromCenter: output = new Circle(startPoint, startPoint.Distance(endPoint)); break; case ShapeMode.Segment: output = new Segment(startPoint, endPoint); break; case ShapeMode.Line: output = new Line(startPoint, endPoint); break; } return(output); }
public IShape GetBounds() { IShape contact = new PolygonRectangle(new RealPoint(Position.Coordinates.X - LenghtBack / 2, Position.Coordinates.Y - Width / 2), LenghtBack + LenghtFront, Width); contact = contact.Rotation(new AngleDelta(Position.Angle)); return(contact); }
public void TestCrossRectangleAndCircleDistance() { Polygon r1 = new PolygonRectangle(new RealPoint(0, 0), 10, 10); Circle c11 = new Circle(new RealPoint(5, 5), 2); Assert.AreEqual(0, r1.Distance(c11)); Assert.AreEqual(0, c11.Distance(r1)); }
public void TestCrossRectanglesDistance() { Polygon r1 = new PolygonRectangle(new RealPoint(0, 0), 10, 10); Polygon r11 = new PolygonRectangle(new RealPoint(5, 5), 10, 10); // Rectangles qui se croisent sur 2 points Assert.AreEqual(0, r1.Distance(r11)); Polygon r12 = new PolygonRectangle(new RealPoint(2, 2), 6, 6); // Rectangles imbriqués Assert.AreEqual(0, r1.Distance(r12)); // Test imbrication rectangle A dans B Assert.AreEqual(0, r12.Distance(r1)); // Test imbrication rectangle B dans A }
private void picWorld_MouseDown(object sender, MouseEventArgs e) { _startPoint = PicCoordinates(); if (_shapeMode == ShapeMode.Zoom) { _rectZoomOrg = new PolygonRectangle(_startPoint, 1, 1); } else { _currentShape = BuildCurrentShape(_shapeMode, _startPoint, _startPoint); } picWorld.Invalidate(); }
private Bitmap GenerateBackground() { Bitmap b = new Bitmap(picWorld.Width, picWorld.Height); Graphics g = Graphics.FromImage(b); if (picWorld.Width > 0 && picWorld.Height > 0) { g.SmoothingMode = SmoothingMode.AntiAlias; PolygonRectangle bounds = new PolygonRectangle(picWorld.Dimensions.WorldRect); for (int i = 100; i < 5000; i += 100) { Circle c = new Circle(new RealPoint(), i); if (c.Cross(bounds) || bounds.Contains(c)) { c.Paint(g, i % 1000 == 0 ? Color.LightGray : Color.DimGray, 1, Color.Transparent, picWorld.Dimensions.WorldScale); } } if (picWorld.Dimensions.WorldScale.Factor < 1 && !picWorld.Moving) { for (int i = 10; i < 5000; i += 10) { if (i % 100 != 0) { Circle c = new Circle(new RealPoint(), i); if (c.Cross(bounds) || bounds.Contains(c)) { c.Paint(g, Color.FromArgb(60, 60, 60), 1, Color.Transparent, picWorld.Dimensions.WorldScale); } } } } } g.Dispose(); return(b); }
private void picWorld_MouseMove(object sender, MouseEventArgs e) { RealPoint pos = PicCoordinates(); lblPosition.Text = "X = " + pos.X.ToString().PadLeft(4) + ": Y = " + pos.Y.ToString().PadLeft(4); if (_startPoint != null) { if (_shapeMode == ShapeMode.Zoom) { double dx = pos.X - _startPoint.X; double dy = pos.Y - _startPoint.Y; double finalDx = dx; double finalDy = dy; _rectZoomOrg = new PolygonRectangle(_startPoint, dx, dy); if (Math.Abs(dx / dy) > Math.Abs(picWorld.Width / picWorld.Height)) { finalDx = Math.Sign(dx) * (picWorld.Width * (Math.Abs(dy) / picWorld.Height)); } else { finalDy = Math.Sign(dy) * (picWorld.Height * (Math.Abs(dx) / picWorld.Width)); } _rectZoomFinal = new PolygonRectangle(RealPoint.Shift(_startPoint, -(finalDx - dx) / 2, -(finalDy - dy) / 2), finalDx, finalDy); } else if (_shapeMode != ShapeMode.None) { _currentShape = BuildCurrentShape(_shapeMode, _startPoint, pos); lblItem.Text = _currentShape.GetType().Name + " : " + _currentShape.ToString(); } picWorld.Invalidate(); } }
public void TestRectangleEqual() { Polygon r0 = new PolygonRectangle(new RealPoint(0, 0), 0, 0); Assert.AreEqual(r0, r0); Assert.AreEqual(r0, r0.Rotation(90)); Assert.AreEqual(r0, r0.Rotation(-180)); Assert.AreEqual(r0, r0.Rotation(-90)); Polygon r1 = new PolygonRectangle(new RealPoint(0, 0), 100, 100); Polygon r2 = new PolygonRectangle(new RealPoint(0, 0), 100, 100); Assert.AreEqual(r1, r1); Assert.AreEqual(r1, r2); Assert.AreEqual(r1, r2.Rotation(90)); Assert.AreEqual(r1, r2.Rotation(180)); Assert.AreEqual(r1, r2.Rotation(-90)); r1 = new PolygonRectangle(new RealPoint(10, 10), 100, 100); r2 = new PolygonRectangle(new RealPoint(10, 10), 100, 100); Assert.AreEqual(r1, r1); Assert.AreEqual(r1, r2); Assert.AreEqual(r1, r2.Rotation(90)); Assert.AreEqual(r1, r2.Rotation(180)); Assert.AreEqual(r1, r2.Rotation(-90)); r1 = new PolygonRectangle(new RealPoint(-10, -10), -100, -100); r2 = new PolygonRectangle(new RealPoint(-10, -10), -100, -100); Assert.AreEqual(r1, r1); Assert.AreEqual(r1, r2); Assert.AreEqual(r1, r2.Rotation(90)); Assert.AreEqual(r1, r2.Rotation(180)); Assert.AreEqual(r1, r2.Rotation(-90)); }
private void picWorld_MouseUp(object sender, MouseEventArgs e) { if (_startPoint != null) { if (_shapeMode == ShapeMode.Zoom) { double dx = _rectZoomFinal.Points.Max(pt => pt.X) - _rectZoomFinal.Points.Min(pt => pt.X); //dx = _worldScale.RealToScreenDistance(dx); WorldScale finalScale = CreateWorldScale(dx / picWorld.Width, _rectZoomFinal.Barycenter); _moveZoom = (_worldScale.Factor - finalScale.Factor) / 20; _moveHorizontal = -finalScale.ScreenToRealDistance((finalScale.OffsetX - _worldScale.OffsetX) / 20); _moveVertical = -finalScale.ScreenToRealDistance((finalScale.OffsetY - _worldScale.OffsetY) / 20); _step = 0; ThreadManager.CreateThread(o => ZoomStepParam()).StartLoop(20, 40); //_worldScale = finalScale; _startPoint = null; _rectZoomFinal = null; _rectZoomOrg = null; _shapeMode = ShapeMode.None; btnZoom.Checked = false; } else if (_shapeMode != ShapeMode.None) { _shapes.Add(BuildCurrentShape(_shapeMode, _startPoint, PicCoordinates())); lblItem.Text = ""; _currentShape = null; _startPoint = null; } picWorld.Invalidate(); } }