public Placing(Rect[] rects, Region region) { // TODO: Проверка области размещения (должна быть хотя бы одна не фиксированная граница). this.region = region; this.rects = new Rect[rects.Length + 1]; // Добавление вспомогательного объекта (начало центра координат). this.rects[0] = new Rect(); for (int i = 0; i < rects.Length; i++) this.rects[i + 1] = rects[i]; // TODO: Удалить все объекты, которые не помещаются в область размещения. }
/// <summary> /// Проверка того, содержит ли данная область размещения параллелепипед. /// </summary> /// <param name="rect">Параллелепипед.</param> /// <param name="eps">Погрешность.</param> /// <returns>Возвращает true, если область размещения полностью содержит параллелепипед.</returns> public bool IsContaine(Rect rect, double eps = 0) { bool is_containe = true; for (int i = 0; i < Dim && is_containe; i++) { is_containe = (Min(i) <= rect.Min(i) + eps); if (freez[i]) is_containe = is_containe && (rect.Max(i) <= Max(i) + eps); } return is_containe; }
/// <summary> /// Получение объекта со строки. /// </summary> /// <param name="s">Строка.</param> /// <returns>Параллелепипед.</returns> public static Rect Parse(string s) { Rect res = new Rect(); string[] ss = s.Split(' '); if (ss.Length == Dim) for (int i = 0; i < Dim; i++) res.size[i] = int.Parse(ss[i]); else for (int i = 0; i < Dim; i++) { res.coor[i] = int.Parse(ss[2 * i]); res.size[i] = int.Parse(ss[2 * i + 1]); } return res; }
/// <summary> /// Проверка на пересечение с параллелепипедом. /// </summary> /// <param name="rect">Параллелепипед.</param> /// <param name="eps">Погрешность.</param> /// <returns>Возвращает true, если произошло пересечение с параллелепипедом.</returns> public bool IsCollideWith(Rect rect, double eps = 0) { bool is_collide = true; for (int i = 0; i < Dim && is_collide; i++) is_collide = (Min(i) < rect.Max(i) - eps) && (rect.Min(i) < Max(i) - eps); return is_collide; }