Example #1
0
        public MainForm()
        {
            InitializeComponent();

            region = new Polygon2d();
            region.Add(new Point2d());
            region.Add(new Point2d { X = ClientRectangle.Width });
            region.Add(new Point2d { X = ClientRectangle.Width, Y = ClientRectangle.Height });
            region.Add(new Point2d { Y = ClientRectangle.Height });

            #region Π¨Π°Π³ 1. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ модСль, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· сторон ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°.
            // TODO: ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π° многольник.
            List<Plane2d> borders = new List<Plane2d>();
            for (int i = 0; i < region.Count; i++)
                borders.Add(new Plane2d { Pole = region[i].Copy, Normal = (region[i + 1] - region[i])._I_(false) });
            vertex = Vertex<Geometric>.CreateClosenessModel(borders[0], borders[1], borders[2]);

            vertex.BreakCrosBy(borders[3]);
            #endregion

            #region Π¨Π°Π³ 2. УстанавливаСм для ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ‚Ρ€ΠΎΠ΅ΠΊ ΠΊΡ€ΡƒΠ³ΠΈ Π”Π΅Π»ΠΎΠ½Π΅. !!НуТно Π»ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ?!!
            vertex.SetCircleDelone(new Circle { Pole = new Point2d { X = ClientRectangle.Width - ClientRectangle.Height / 2, Y = ClientRectangle.Height / 2 }, Scalar = ClientRectangle.Height / 2 });
            vertex.Cros.SetCircleDelone(new Circle { Pole = new Point2d { X = ClientRectangle.Height / 2, Y = ClientRectangle.Height / 2 }, Scalar = ClientRectangle.Height / 2 });

            //vertex.SetCircleDelone(Assistant.ΠšΠ Π£Π“_Π”Π•Π›ΠžΠΠ•(borders[0], borders[1], borders[2]));
            //vertex.Cros.SetCircleDelone(Assistant.ΠšΠ Π£Π“_Π”Π•Π›ΠžΠΠ•(borders[2], borders[3], borders[0]));

            vertex.Prev.Cros.SetCircleDelone(new Circle());
            vertex.Cros.Prev.Cros.SetCircleDelone(new Circle());
            #endregion

            rand = new Random();

            triples = ClosenessModelExt<Geometric, Circle>.GetTriples(this.vertex);
        }
Example #2
0
        public FormMain()
        {
            InitializeComponent();

            polygon_list = new List<Polygon2d>();
            polygon = null;

            is_edit = false;

            #region ВСстовый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.
            pole = new Point2d { X = 0, Y = 30 };

            Polygon2d polygon_temp = new Polygon2d { Pole = new Point2d { X = 30, Y = 10 } };
            polygon_temp.Add(new Point2d { X = 0, Y = 0 });
            polygon_temp.Add(new Point2d { X = 100, Y = 0 });
            polygon_temp.Add(new Point2d { X = 100, Y = 100 });
            polygon_list.Add(polygon_temp);

            polygon_temp = new Polygon2d { Pole = new Point2d { X = 150, Y = 90 } };
            polygon_temp.Add(new Point2d { X = 50, Y = 0 });
            polygon_temp.Add(new Point2d { X = 100, Y = 50 });
            polygon_temp.Add(new Point2d { X = 50, Y = 150 });
            polygon_temp.Add(new Point2d { X = 0, Y = 50 });
            polygon_list.Add(polygon_temp);
            #endregion
        }
Example #3
0
        } // Π₯Π°Ρ€ΠΈΠ½, ΠŸΡƒΠ΄Π»ΠΎ

        private bool Step(Polygon2d polygon, StripRegion strip_region, List<Polygon2d> polygon_placed_list)
        {
            #region Π¨Π°Π³-1. Установка Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния (Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ) Ρ‚ΠΎΡ‡ΠΊΠΈ размСщСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Polygon.
            polygon.Pole = new Point2d();
            for (int j = 1; j <= polygon.Pole.Dim; j++)
                polygon.Pole[j] = double.PositiveInfinity;
            #endregion

            #region Π¨Π°Π³-2. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ всСх Π³ΠΎΠ΄ΠΎΡ„ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ»ΠΎΡ‚Π½ΠΎΠ³ΠΎ размСщСния.
            List<Polygon2d> polygon_godograph_list = new List<Polygon2d>(); // Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Capacity.
            #region Π¨Π°Π³-2.1. Π“ΠΎΠ΄ΠΎΡ€Π°Ρ„ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ»ΠΎΡ‚Π½ΠΎΠ³ΠΎ размСщСния ΠΏΠΎ полосС.
            polygon_godograph_list.Add(Π“ΠΎΠ΄ΠΎΡ€Π°Ρ„_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ_ΠΏΠ»ΠΎΡ‚Π½ΠΎΠ³ΠΎ_размСщСния(polygon, strip_region));
            #endregion
            #region Π¨Π°Π³-2.2. Π“ΠΎΠ΄ΠΎΡ€Π°Ρ„Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ»ΠΎΡ‚Π½ΠΎΠ³ΠΎ размСщСния ΠΏΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°ΠΌ.
            for (int i = 0; i < polygon_placed_list.Count; i++)
                polygon_godograph_list.Add(Π“ΠΎΠ΄ΠΎΡ€Π°Ρ„_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ_ΠΏΠ»ΠΎΡ‚Π½ΠΎΠ³ΠΎ_размСщСния(polygon, polygon_placed_list[i]));
            #endregion
            #endregion

            #region Π¨Π°Π³-3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ списка Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ размСщСния.
            poles = new List<Point2d>();
            #endregion

            #region Π¨Π°Π³-4. ДобавляСм Ρ‚ΠΎΡ‡ΠΊΠΈ пСрСсСчСния сторон полосы.
            // Π’Π΅Ρ€ΡˆΠΈΠ½Ρ‹ polygon_godograph_list[0];
            #endregion

            #region Π¨Π°Π³-5. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ Π³ΠΎΠ΄ΠΎΡ€Π°Ρ„ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ»ΠΎΡ‚Π½ΠΎΠ³ΠΎ размСщСния Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΡ… Ρ‚ΠΎΡ‡ΠΊΠΈ пСрСсСчСния.
            for (int i = 0; i < polygon_godograph_list.Count - 1; i++)
                for (int j = i + 1; j < polygon_godograph_list.Count; j++)
                    poles.AddRange(Π’ΠΎΡ‡ΠΊΠΈ_пСрСсСчСния_ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²(polygon_godograph_list[i], polygon_godograph_list[j]));
            #endregion

            #region Π¨Π°Π³-6. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ размСщСния...
            bool is_placed = false;
            for (int i = 0; i < poles.Count; i++)
            {
                #region Π¨Π°Π³-6.1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ условиС принадлСТности области размСщСния.
                bool is_point_right = Π’ΠΎΡ‡ΠΊΠ°_ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚_ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ(poles[i], polygon_godograph_list[0]);
                #endregion
                #region Π¨Π°Π³-6.2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ условиС нСпСрСсСчСния с Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.
                for (int j = 1; j < polygon_godograph_list.Count && is_point_right; j++)
                    is_point_right = !Π’ΠΎΡ‡ΠΊΠ°_ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚_ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ(poles[i], polygon_godograph_list[j]);
                #endregion

                #region Π¨Π°Π³-6.3. Если Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ всС условия размСщСния, Ρ‚ΠΎ...
                if (is_point_right)
                {
                    #region УстанавливаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Ρ‚ΠΎΡ‡ΠΊΡƒ размСщСния (ΠΈΠ· Π΄Π²ΡƒΡ… Ρ‚ΠΎΡ‡Π΅ΠΊ размСщСния Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Π°Ρ). // ΠŸΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ Π»ΠΈ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚?
                    polygon.Pole.Copy = strip_region.OptPole(polygon.Pole, poles[i]);
                    #endregion

                    is_placed = true;
                }
                #endregion
            }
            #endregion

            return is_placed;
        }
Example #4
0
 public static void Fill(this Graphics graphics, Brush brush, Polygon2d polygon)
 {
     if (polygon.Count > 2)
     {
         PointF[] points = polygon.ToArrayOfPointF();
         if (points.Length > 1)
             graphics.FillPolygon(brush, points);
     }
 }
Example #5
0
 /// <summary>
 /// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π² ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ.
 /// </summary>
 /// <param name="rectangle"></param>
 /// <returns></returns>
 public static Polygon2d ToPolygon(this Geometric2dWithPointVector rectangle)
 {
     Polygon2d polygon = new Polygon2d { Pole = rectangle.Pole.Copy };
     polygon.Add(new Point2d());
     polygon.Add(new Point2d { X = rectangle.Vector.X });
     polygon.Add(new Point2d { X = rectangle.Vector.X, Y = rectangle.Vector.Y });
     polygon.Add(new Point2d { Y = rectangle.Vector.Y });
     return polygon;
 }
Example #6
0
 public static void Draw(this Graphics graphics, Pen pen, Polygon2d polygon)
 {
     if (polygon.Count == 2)
     {
         graphics.DrawLine(pen, polygon[0].ToPointF(), polygon[1].ToPointF());
     }
     if (polygon.Count > 2)
     {
         PointF[] points = polygon.ToArrayOfPointF();
         if (points.Length > 1)
             graphics.DrawPolygon(pen, points);
     }
 }
Example #7
0
        private void FormMain_MouseDown(object sender, MouseEventArgs e)
        {
            point_curr.X = e.X;
            point_curr.Y = e.Y;
            is_mouse_down = true;

            if (e.Button == System.Windows.Forms.MouseButtons.Left && e.Clicks == 2)
            {
                is_edit = !is_edit;
                if (is_edit && polygon == null)
                {
                    polygon = new Polygon2d { Pole = new Point2d { Vector = point_curr - pole } };
                    polygon_list.Add(polygon);
                }
                if (!is_edit && !polygon.IsRightPolygon())
                    polygon_list.Remove(polygon);
            }
            if (e.Button == System.Windows.Forms.MouseButtons.Left && e.Clicks == 1)
            {
                Point2d point = new Point2d { Vector = point_curr - pole };
                if (is_edit)
                {
                    point.Vector -= polygon.Pole.Vector;
                    polygon.Add(point);
                }
                else
                {
                    polygon = null;
                    for (int i = 0; i < polygon_list.Count && polygon == null; i++)
                        if (polygon_list[i].IsContain(point))
                            polygon = polygon_list[i];
                }
            }

            Invalidate();
        }
Example #8
0
 public static void FillAndDraw(this Graphics graphics, Brush brush, Pen pen, Polygon2d polygon)
 {
     if (polygon.Count == 2)
     {
         graphics.DrawLine(pen, polygon[0].ToPointF(), polygon[1].ToPointF());
     }
     if (polygon.Count > 2)
     {
         PointF[] points = polygon.ToArrayOfPointF();
         graphics.FillPolygon(brush, points);
         graphics.DrawPolygon(pen, points);
     }
 }
Example #9
0
        public static void FillAndDraw(this Graphics graphics, Polygon2d region, Brush brush, Pen pen, Plane2d plane)
        {
            Polygon2d polygon = new Polygon2d();
            for (int i = 0; i < region.Count; i++)
            {
                double ed = ((region[i] + region.Pole.Vector) - plane.Pole) * plane.Normal;
                if (ed < 0)
                    polygon.Add(region[i] + region.Pole.Vector);

                double ed_temp = (region[i + 1] - region[i]) * plane.Normal;
                if (ed_temp != 0)
                {
                    double t = -(((region[i] + region.Pole.Vector) - plane.Pole) * plane.Normal) / ed_temp;
                    if (0 < t && t <= 1)
                        polygon.Add(region[i] + region.Pole.Vector + (region[i + 1] - region[i]) * t);
                }
            }

            graphics.FillAndDraw(brush, pen, polygon);
        } // !!!ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ!!!
Example #10
0
        // ΠœΠ΅Ρ‚ΠΎΠ΄ поиска Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ…. // TODO: ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ.
        private double Find(Polygon2d.Iterator iti, Polygon2d.Iterator itj)
        {
            int gi = -1;
            int gj = -1;
            double ged = double.NegativeInfinity;

            for (int i = 0; i < iti.Count; i++)
            {
                int lj = -1;
                double led = double.PositiveInfinity;
                for (int j = 0; j < itj.Count; j++)
                {
                    double ed = Plane2dExt.Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅_расстояниС(iti.Plane(i), itj.Point(j));
                    if (led > ed)
                    {
                        led = ed;
                        lj = j;
                    }
                    if (ed < 0)
                    {
                        led = double.PositiveInfinity;
                        break;
                    }
                }

                if (!double.IsPositiveInfinity(led))
                {
                    if (ged < led)
                    {
                        ged = led;
                        gi = i;
                        gj = lj;
                    }
                }
            }

            if (!double.IsNegativeInfinity(ged))
            {
                iti.Move(gi);
                itj.Move(gj);
            }

            return ged;
        }
Example #11
0
        private void FormMain_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            //e.Graphics.ScaleTransform(1, -1);
            //e.Graphics.TranslateTransform(0, -ClientSize.Height);

            if (is_edit)
            {
                e.Graphics.Clear(System.Drawing.Color.FromArgb(200, 200, 200));

                Point2d pole_temp = polygon.Pole;
                polygon.Pole += pole.Vector;

                DrawGrid(e.Graphics, polygon.Pole);
                e.Graphics.FillAndDraw(System.Drawing.Brushes.Green, System.Drawing.Pens.Black, polygon);

                polygon.Pole = pole_temp;
            }
            else
            {
                e.Graphics.Clear(System.Drawing.Color.White);

                DrawGrid(e.Graphics, pole);
                for (int i = 0; i < polygon_list.Count; i++)
                {
                    Point2d pole_temp = polygon_list[i].Pole;
                    polygon_list[i].Pole += pole.Vector;

                    if (polygon_list[i] == polygon)
                        e.Graphics.FillAndDraw(System.Drawing.Brushes.Blue, System.Drawing.Pens.Black, polygon_list[i]);
                    else
                        e.Graphics.FillAndDraw(System.Drawing.Brushes.Yellow, System.Drawing.Pens.Black, polygon_list[i]);

                    polygon_list[i].Pole = pole_temp;
                }
            }
            Polygon2d region = new Polygon2d { Pole = new Point2d() };
            region.Add(new Point2d());
            region.Add(new Point2d { X = ClientSize.Width });
            region.Add(new Point2d { X = ClientSize.Width, Y = ClientSize.Height });
            region.Add(new Point2d { Y = ClientSize.Height });
            System.Drawing.Brush brush = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(100, 100, 100, 100));
            if (plane_dividing_list.Count > 0)
            {
                for (int i = 0; i < plane_dividing_list.Count; i++)
                {
                    Plane2d plane = plane_dividing_list[i].IteratorPlane.Plane(0);
                    Point2d pole_temp = plane.Pole;
                    plane.Pole += pole.Vector;

                    e.Graphics.FillAndDraw(region, brush, System.Drawing.Pens.Black, plane);

                    plane.Pole = pole_temp;
                }
            }
        }
Example #12
0
 public static Polygon2d ΠžΡ‚Ρ€Π΅Π·ΠΎΠΊ(Circle circle_this, Circle circle)
 {
     Polygon2d polygon = new Polygon2d();
     Vector2d vector = circle.Pole - circle_this.Pole;
     double length = Math.Sqrt(vector * vector);
     vector /= length;
     polygon.Add(circle_this.Pole + vector * circle_this.Scalar);
     polygon.Add(circle.Pole - vector * circle.Scalar);
     return polygon;
 }
Example #13
0
 public static Polygon2d ΠžΡ‚Ρ€Π΅Π·ΠΎΠΊ(Circle circle_this, Plane2d plane)
 {
     Polygon2d polygon = new Polygon2d();
     polygon.Add(circle_this.Pole - plane.Normal * circle_this.Scalar);
     polygon.Add(circle_this.Pole - plane.Normal * (circle_this.Scalar + Plane2dExt.Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅_расстояниС(plane, circle_this)));
     return polygon;
 }
Example #14
0
 public PlaneDividing(Polygon2d.Iterator iterator_plane, Polygon2d.Iterator iterator_point)
 {
     this.iterator_plane = iterator_plane;
     this.iterator_point = iterator_point;
 }
Example #15
0
 } // ΠŸΡ€ΠΎΠ»Π΅ΡΠΊΠΎΠ²ΡΠΊΠΈΠΉ.
 private Polygon2d Π“ΠΎΠ΄ΠΎΡ€Π°Ρ„_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ_ΠΏΠ»ΠΎΡ‚Π½ΠΎΠ³ΠΎ_размСщСния(Polygon2d polygon_i, Polygon2d polygon_j)
 {
     throw new NotImplementedException();
 }  // ΠŸΡ€ΠΎΠ»Π΅ΡΠΊΠΎΠ²ΡΠΊΠΈΠΉ.
Example #16
0
        } // !!!ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ!!!

        public static void FillAndDraw_(this Graphics graphics, Polygon2d region, Brush brush, Pen pen, Geometric2d geometric)
        {
            if (geometric is Point2d)
                graphics.FillAndDraw(brush, pen, geometric as Point2d);
            if (geometric is Geometric2dWithPointScalar)
                graphics.FillAndDraw(brush, pen, geometric as Geometric2dWithPointScalar);
            if (geometric is Geometric2dWithPointVector)
                graphics.FillAndDraw(brush, pen, geometric as Geometric2dWithPointVector);
            if (geometric is Polygon2d)
                graphics.FillAndDraw(brush, pen, geometric as Polygon2d);
            if (geometric is Plane2d)
                graphics.FillAndDraw(region, brush, pen, geometric as Plane2d);
        }
Example #17
0
 } // ΠšΡƒΠ·ΠΎΠ²Π»Π΅Π².
 private bool Π’ΠΎΡ‡ΠΊΠ°_ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚_ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ(Point2d point, Polygon2d polygon)
 {
     throw new NotImplementedException();
 } // Π₯Π°Ρ€ΠΈΠ½, ΠŸΡƒΠ΄Π»ΠΎ
Example #18
0
 }  // ΠŸΡ€ΠΎΠ»Π΅ΡΠΊΠΎΠ²ΡΠΊΠΈΠΉ.
 private List<Point2d> Π’ΠΎΡ‡ΠΊΠΈ_пСрСсСчСния_ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²(Polygon2d polygon_i, Polygon2d polygon_j)
 {
     throw new NotImplementedException();
 } // ΠšΡƒΠ·ΠΎΠ²Π»Π΅Π².