예제 #1
0
파일: Program.cs 프로젝트: isen131/Polygons
        static void Main(string[] args)
        {
            //Точка
            Console.WriteLine("Введите координаты точки: ");
            int x = int.Parse(Console.ReadLine());
            int y = int.Parse(Console.ReadLine());
            MyPoint point = new MyPoint(x, y);
            //Окружность
            #region
            Console.WriteLine("Введите координаты окружности: ");
            int x1 = int.Parse(Console.ReadLine());
            int y1 = int.Parse(Console.ReadLine());

            Console.WriteLine("Введите радиус: ");
            int r = int.Parse(Console.ReadLine());

            Circle circle = new Circle(new MyPoint(x1, y1), r);
            Console.WriteLine(circle.isCollide(point).ToString());
            #endregion

            //Полигон
            Console.WriteLine("Введите количество вершин: ");
            //Polygon polygon = new Polygon(int.Parse(Console.ReadLine()));
            //Console.WriteLine(polygon.isCollide(polygon, point).ToString());
            Console.ReadKey();
        }
예제 #2
0
        // Кнопка подтверждения
        private void OK_Click(object sender, EventArgs e)
        {
            string[] str1 = X.Text.Split(',');                  // Массив координат "X" в формате string
            string[] str2 = Y.Text.Split(',');                  // Массив координат "Y" в формате string
            int[] Xs = new int[str1.Length];                    // Создание массива для хранения координат X
            int[] Ys = new int[str1.Length];                    // Массив для Y
            points = new Point[str1.Length];                    // Определение размера массива точек

            //Заполнение массива точек с помощью массивов координат заранее преобразуя string в int
            for (int i = 0; i < str1.Length; i++)
            {
                Xs[i] = int.Parse(str1[i]);
                Ys[i] = int.Parse(str2[i]);
                points[i].X = Xs[i];
                points[i].Y = Ys[i];
            }
            Polygon polygon = new Polygon(Xs, Ys);                          // Создание экземпляра класса Polygon
            // Создание точки для проверки, используя введенные координаты
            string[] pointStr = PointBox.Text.Split(',');
            int x = int.Parse(pointStr[0]);
            int y = int.Parse(pointStr[1]);
            point = new MyPoint(x, y);
            f1.Result.Text = polygon.isCollide(polygon, point).ToString();  // Вывод результата проверки
            using (Graphics g = CreateGraphics())
            {
                g.DrawPolygon(Pens.Black, points);
            }
        }
예제 #3
0
파일: MyPoint.cs 프로젝트: isen131/Polygons
 public bool isCollide(MyPoint p)
 {
     //Условие: находится ли точка внутри или на поверхности круга
     if (MyPoint.Distance(center, p) <= rad)
         return true;
     else
         return false;
 }
예제 #4
0
 // Кнопка подтверждения создания окружности
 private void button1_Click(object sender, EventArgs e)
 {
     // Задание точки центра окружности
     string[] s = CircleCentre.Text.Split(',');
     int x1 = int.Parse(s[0]);
     int y1 = int.Parse(s[1]);
     MyPoint p = new MyPoint(x1, y1);
     int r = int.Parse(Radius.Text);                     // Задание радиуса
     // Создание точки для проверки
     string[] pointStr = PointBox.Text.Split(',');
     int x = int.Parse(pointStr[0]);
     int y = int.Parse(pointStr[1]);
     MyPoint point = new MyPoint(x, y);
     Circle circle = new Circle(p, r);                   // Создание окружности соответсвующей введенным данным
     f1.Result.Text = circle.isCollide(point).ToString();// Вывод результата
 }
예제 #5
0
파일: MyPoint.cs 프로젝트: isen131/Polygons
        public MyPoint[] points; // Массив точек класса MyPoint

        #endregion Fields

        #region Constructors

        // Конструктор класса Polygon
        public Polygon(int[] Xs, int[] Ys)
        {
            pointnumber = Xs.Length;                         // Задание значений основных полей массива
            points = new MyPoint[pointnumber];
            for (int i = 0; i < Xs.Length; i++)
            {
                points[i] = new MyPoint(Xs[i], Ys[i]);
            }
        }
예제 #6
0
파일: MyPoint.cs 프로젝트: isen131/Polygons
 //Нахождение расстояния меджу двумя точками
 public static double Distance(MyPoint p1, MyPoint p2)
 {
     return Math.Sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
 }
예제 #7
0
파일: MyPoint.cs 프로젝트: isen131/Polygons
 public Circle(MyPoint c, int r)
 {
     center = c;
     rad = r;
 }
예제 #8
0
파일: MyPoint.cs 프로젝트: isen131/Polygons
        // Метод определения принадлежности точек к многоугольнику
        public bool isCollide(Polygon polygon, MyPoint p)
        {
            double bigArea;                                     // Площадь заданного многоугольника
            double[] smallAreas = new double[pointnumber];      // Площади треугольников
            double[] ps = new double[pointnumber];              // Полупериметры для треугольников
            double[] dists = new double[points.Length * 2];     // Массив расстоянии между точками

            for (int i = 0; i < points.Length - 1; i++)         // Нахождение расстоянии между двумя точками
            {
                dists[i] = MyPoint.Distance(points[i], points[i + 1]);
            }
            dists[points.Length - 1] = MyPoint.Distance(points[points.Length - 1], points[0]);

            for (int i = 0; i < points.Length; i++)             //
            {
                dists[points.Length + i] = MyPoint.Distance(points[i], p);
            }

            for (int i = 0; i < points.Length - 1; i++)         // Нахождение полупериметров треугольников
            {
                ps[i] = (dists[i] + dists[i + points.Length] + dists[i + points.Length + 1]) / 2;
            }
            ps[pointnumber - 1] = (dists[pointnumber - 1] + dists[pointnumber] + dists[pointnumber * 2 - 1]) / 2;

            //Нахождение площади основного многоугольника
            double sum1 = 0;
            double sum2 = 0;

            for (int i = 0; i < pointnumber - 1; i++)
            {
                sum1 += points[i].x * points[i + 1].y;
            }
            sum1 += points[pointnumber-1].x * points[0].y;

            for (int i = 0; i < pointnumber - 1; i++)
            {
                sum2 += points[i].y * points[i + 1].x;
            }
            sum2 += points[pointnumber - 1].y * points[0].x;
            bigArea = Math.Abs(sum1 - sum2) / 2;

            for (int i = 0; i < pointnumber - 1; i++)       // Нахождение площадей треугольников
            {
                smallAreas[i] = Math.Sqrt(ps[i] * (ps[i] - dists[i]) * (ps[i] - dists[i + points.Length]) * (ps[i] - dists[i + points.Length + 1]));
            }
            smallAreas[pointnumber - 1] = Math.Sqrt(ps[pointnumber - 1] * (ps[pointnumber - 1] - dists[pointnumber - 1]) * (ps[pointnumber - 1] - dists[pointnumber]) * (ps[pointnumber - 1] - dists[pointnumber * 2 - 1]));

            MyRound(smallAreas);
            double sumSmallAreas = 0;                       // Сумма площадей треугольников
            for (int i = 0; i < pointnumber; i++)
            {
                sumSmallAreas += smallAreas[i];
            }

            if(bigArea == sumSmallAreas)                    // Сравнение площадей
                return true;
            else
                return false;
        }
예제 #9
0
        public bool isCollide(Polygon polygon, MyPoint p)        // Метод определения принадлежности точек к многоугольнику
        {
            double bigArea;                                      // Площадь заданного многоугольника

            double[] smallAreas = new double[pointnumber];       // Площади треугольников
            double[] ps         = new double[pointnumber];       // Полупериметры для треугольников
            double[] dists      = new double[points.Length * 2]; // Массив расстоянии между точками

            for (int i = 0; i < points.Length - 1; i++)          // Нахождение расстоянии между двумя точками
            {
                dists[i] = MyPoint.Distance(points[i], points[i + 1]);
            }
            dists[points.Length - 1] = MyPoint.Distance(points[points.Length - 1], points[0]);

            for (int i = 0; i < points.Length; i++)             //
            {
                dists[points.Length + i] = MyPoint.Distance(points[i], p);
            }

            for (int i = 0; i < points.Length - 1; i++)         // Нахождение полупериметров треугольников
            {
                ps[i] = (dists[i] + dists[i + points.Length] + dists[i + points.Length + 1]) / 2;
            }
            ps[pointnumber - 1] = (dists[pointnumber - 1] + dists[pointnumber] + dists[pointnumber * 2 - 1]) / 2;

            //Нахождение площади основного многоугольника
            double sum1 = 0;
            double sum2 = 0;

            for (int i = 0; i < pointnumber - 1; i++)
            {
                sum1 += points[i].x * points[i + 1].y;
            }
            sum1 += points[pointnumber - 1].x * points[0].y;

            for (int i = 0; i < pointnumber - 1; i++)
            {
                sum2 += points[i].y * points[i + 1].x;
            }
            sum2   += points[pointnumber - 1].y * points[0].x;
            bigArea = Math.Abs(sum1 - sum2) / 2;

            for (int i = 0; i < pointnumber - 1; i++)       // Нахождение площадей треугольников
            {
                smallAreas[i] = Math.Sqrt(ps[i] * (ps[i] - dists[i]) * (ps[i] - dists[i + points.Length]) * (ps[i] - dists[i + points.Length + 1]));
            }
            smallAreas[pointnumber - 1] = Math.Sqrt(ps[pointnumber - 1] * (ps[pointnumber - 1] - dists[pointnumber - 1]) * (ps[pointnumber - 1] - dists[pointnumber]) * (ps[pointnumber - 1] - dists[pointnumber * 2 - 1]));

            MyRound(smallAreas);
            double sumSmallAreas = 0;                       // Сумма площадей треугольников

            for (int i = 0; i < pointnumber; i++)
            {
                sumSmallAreas += smallAreas[i];
            }

            if (bigArea == sumSmallAreas)                    // Сравнение площадей
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
예제 #10
0
 public Circle(MyPoint c, int r)
 {
     center = c;
     rad    = r;
 }
예제 #11
0
 //Нахождение расстояния меджу двумя точками
 public static double Distance(MyPoint p1, MyPoint p2)
 {
     return(Math.Sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y)));
 }