Ejemplo n.º 1
0
 public bool isCollide(MyPoint p)
 {
     //Условие: находится ли точка внутри или на поверхности круга
     if (MyPoint.Distance(center, p) <= rad)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Ejemplo n.º 2
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);
            }
        }