/// <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; }
/// <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(); }
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; }
/// <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) }; }
/// <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)); }
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); } // !!!Переделать!!!
/// <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; } }
/// <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 }; }
/// <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; }
/// <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; }
/// <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(); }