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(); }
// Кнопка подтверждения 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); } }
public bool isCollide(MyPoint p) { //Условие: находится ли точка внутри или на поверхности круга if (MyPoint.Distance(center, p) <= rad) return true; else return false; }
// Кнопка подтверждения создания окружности 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();// Вывод результата }
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]); } }
//Нахождение расстояния меджу двумя точками 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)); }
public Circle(MyPoint c, int r) { center = c; rad = r; }
// Метод определения принадлежности точек к многоугольнику 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; }
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); } }
//Нахождение расстояния меджу двумя точками 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))); }