Beispiel #1
0
 /// <summary>
 /// Получить расширенное расстояние от полуплоскости до полуплоскости.
 /// </summary>
 /// <param name="plane_this">Полуплоскость.</param>
 /// <param name="plane">Полуплоскость.</param>
 /// <returns>Расширенное расстояние.</returns>
 public static double Расширенное_расстояние(Plane2d plane_this, Plane2d plane)
 {
     if (plane_this.Normal * plane.Normal == -1)
         return Расширенное_расстояние(plane_this, plane.Pole);
     else
         return double.PositiveInfinity;
 }
Beispiel #2
0
        /// <summary>
        /// Получить точку пересечения границ круга и полуплоскости.
        /// </summary>
        /// <param name="circle_prev">Круг.</param>
        /// <param name="plane_next">Полуплоскость.</param>
        /// <returns>Точка пересечения.</returns>
        public static Point2d Точка_пересечения_границ(Geometric2dWithPointScalar circle_prev, Plane2d plane_next)
        {
            Vector2d vector_prev = plane_next.Normal._I_(false);
            Vector2d vector = plane_next.Pole - circle_prev.Pole;

            double b = vector_prev * vector;
            double c = vector * vector - circle_prev.Scalar * circle_prev.Scalar;
            double d = b * b - c;
            if (d < 0)
                return null;
            else
            {
                double t = -b - Math.Sqrt(d);
                return plane_next.Pole + vector_prev * t;
            }
        }
        public PlacingWithCloseModel(double height, Circle[] circles, double eps)
            : base(height, 0, circles, eps)
        {
            length = 2 * height;

            #region Шаг 1. Создаём начальную модель, состоящую из сторон прямоугольника. !!!Потом переделать на полосу!!!
            Geometric2d border_1 = new Plane2d { Id = -1, Pole = new Point2d { X = 0, Y = 2 * height / 2 }, Normal = new Vector2d { X = 0, Y = -1 } };
            Geometric2d border_2 = new Plane2d { Id = -2, Pole = new Point2d { X = 0, Y = 1 * height / 2 }, Normal = new Vector2d { X = 1, Y = 0 } };
            Geometric2d border_3 = new Plane2d { Id = -3, Pole = new Point2d { X = 0, Y = 0 * height / 2 }, Normal = new Vector2d { X = 0, Y = +1 } };

            Geometric2d border_4 = new Plane2d { Id = -4, Pole = new Point2d { X = length, Y = height / 2 }, Normal = new Vector2d { X = -1, Y = 0 } };

            vertex = Vertex<Geometric2d>.CreateClosenessModel(border_1, border_2, border_3);
            vertex.BreakCrosBy(border_4);
            #endregion

            #region Шаг 2. Устанавливаем для полученных троек круги Делоне. !Для полосы можно не автоматизировать. Для многоугольника необходимо придумать автоматизацию.
            vertex.SetCircleDelone(new Circle { Pole = new Point2d { X = height / 2, Y = height / 2 }, Scalar = height / 2 });
            vertex.Cros.SetCircleDelone(new Circle { Pole = new Point2d { X = length - height / 2, Y = height / 2 }, Scalar = height / 2 });

            vertex.Prev.Cros.SetCircleDelone(new Circle { Pole = new Point2d { X = -height / 2, Y = height / 2 }, Scalar = 0 });
            vertex.Cros.Prev.Cros.SetCircleDelone(new Circle { Pole = new Point2d { X = double.PositiveInfinity /*length + height / 2*/, Y = height / 2 }, Scalar = 0 });
            #endregion

            length = 0;

            vertex = vertex.Cros.Next.Cros.Next;

            triples = vertex.GetTriples();
        }
Beispiel #4
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;
 }
Beispiel #5
0
 /// <summary>
 /// Получить серединную полуплоскость круга и полуплоскости.
 /// </summary>
 /// <param name="circle_prev">Круг.</param>
 /// <param name="plane_next">Полуплоскость.</param>
 /// <returns>Серединная полуплоскость.</returns>
 public static Plane2d Серединная_полуплоскость(Geometric2dWithPointScalar circle_prev, Plane2d plane_next)
 {
     return new Plane2d { Pole = circle_prev.Pole.Copy, Normal = plane_next.Normal._I_(true) };
 }
Beispiel #6
0
 /// <summary>
 /// Получить точку близости второго рода для круга и множества (полуплоскость, полуплоскость).
 /// </summary>
 /// <param name="circle_this">Круг.</param>
 /// <param name="plane_prev">Полуплоскость.</param>
 /// <param name="plane_next">Полуплоскость.</param>
 /// <returns>Точка близости.</returns>
 public static Point2d Точка_близости_второго_рода(this Geometric2dWithPointScalar circle_this, Plane2d plane_prev, Plane2d plane_next)
 {
     return Plane2dExt.Точка_пересечения_границ(Plane2dExt.Годограф_функции_плотного_размещения(plane_prev, circle_this), Plane2dExt.Годограф_функции_плотного_размещения(plane_next, circle_this));
 }
Beispiel #7
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);
        } // !!!Переделать!!!
Beispiel #8
0
 /// <summary>
 /// Получить точку пересечения полуплоскости и полуплоскости.
 /// </summary>
 /// <param name="plane_prev">Полуплоскость.</param>
 /// <param name="plane_next">Полуплоскость.</param>
 /// <returns>Точка пересечения.</returns>
 public static Point2d Точка_пересечения_границ(Plane2d plane_prev, Plane2d plane_next)
 {
     Vector2d plane_prev_vector = plane_prev.Normal._I_(false);
     double t = plane_prev_vector * plane_next.Normal;
     if (t == 0)
         return null;
     else
     {
         t = (plane_next.Pole - plane_prev.Pole) * plane_next.Normal / t;
         return plane_prev.Pole + plane_prev_vector * t;
     }
 }
Beispiel #9
0
 /// <summary>
 /// Получить годограф функции плотного размещения круга возле полуплоскости.
 /// </summary>
 /// <param name="plane_this">Полуплоскость.</param>
 /// <param name="circle">Круг.</param>
 /// <returns>Годограф функции плотного размещения.</returns>
 public static Plane2d Годограф_функции_плотного_размещения(Plane2d plane_this, Geometric2dWithPointScalar circle)
 {
     return new Plane2d() { Pole = plane_this.Pole + plane_this.Normal * circle.Scalar, Normal = plane_this.Normal };
 }
Beispiel #10
0
 /// <summary>
 /// Получить расширенное расстояние от полуплоскости до круга.
 /// </summary>
 /// <param name="plane_this">Полуплоскость.</param>
 /// <param name="circle">Круг.</param>
 /// <returns>Расширенное расстояние.</returns>
 public static double Расширенное_расстояние(Plane2d plane_this, Geometric2dWithPointScalar circle)
 {
     return Расширенное_расстояние(plane_this, circle.Pole) - circle.Scalar;
 }
Beispiel #11
0
 /// <summary>
 /// Получить расширенное расстояние от полуплоскости до точки.
 /// </summary>
 /// <param name="plane_this">Полуплоскость.</param>
 /// <param name="point">Точка.</param>
 /// <returns>Расширенное расстояние.</returns>
 public static double Расширенное_расстояние(Plane2d plane_this, Point2d point)
 {
     return (point - plane_this.Pole) * plane_this.Normal;
 }
Beispiel #12
0
 /// <summary>
 /// Получить серединную полуплоскость полуплоскости и полуплоскости.
 /// </summary>
 /// <param name="plane_prev">Полуплоскость.</param>
 /// <param name="plane_next">Полуплоскость.</param>
 /// <returns>Серединная полуплоскость.</returns>
 public static Plane2d Серединная_полуплоскость(Plane2d plane_prev, Plane2d plane_next)
 {
     throw new NotImplementedException();
 }