Example #1
0
        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));
        }
Example #2
0
        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));
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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));
        }
Example #6
0
        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
        }
Example #7
0
        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();
        }
Example #8
0
        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);
        }
Example #9
0
        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();
            }
        }
Example #10
0
        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));
        }
Example #11
0
        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();
            }
        }