From 68451b426157a824f32fb5e8c36ded9ac5099863 Mon Sep 17 00:00:00 2001 From: ParkSuMin Date: Mon, 15 Dec 2025 20:44:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=BF=D0=B5=D0=BD=D0=B4=D0=B8=D0=BA=D1=83?= =?UTF-8?q?=D0=BB=D1=8F=D1=80=D0=BD=D0=BE=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Canvas.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ Canvas.h | 6 +++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/Canvas.cpp b/Canvas.cpp index 556dbf6..c5f0497 100644 --- a/Canvas.cpp +++ b/Canvas.cpp @@ -136,6 +136,11 @@ bool Canvas::areAlreadyParallel(Line* l1, Line* l2) return parallelPairs.count(makeOrderedPair(l1, l2)); } +bool Canvas::areAlreadyPerpendicular(Line* line1, Line* line2) +{ + return perpendicularPairs.count(makeOrderedPair(line1, line2)); +} + // =================================================================== // Методы работы с ограничениями // =================================================================== @@ -443,6 +448,52 @@ void Canvas::mousePressEvent(QMouseEvent* event) update(); return; } + + else if (mode == Mode::Perpendicular) { + Line* found = findAt(scene); + + if (!found) { + current_line = nullptr; + update(); + return; + } + + // Первый клик: выбираем первую линию + if (!current_line) { + current_line = found; + update(); + return; + } + + // Повторный клик на ту же линию: сброс выбора + if (found == current_line) { + current_line = nullptr; + update(); + return; + } + + if (!areAlreadyPerpendicular(found, current_line)) { + auto pair = makeOrderedPair(found, current_line); + sys.addConstraintPerpendicular(*found, *current_line, constraints_count++); + perpendicularPairs.insert(pair); + + current_line = nullptr; + mode = Mode::None; + after_constraint = true; + update(); + } + else { + + QMessageBox::warning(this, + QString("Wrong"), + QString("Perpendicular lines can not be more perpendicular!"), + QMessageBox::Ok + ); + current_line = nullptr; + update(); + return; + } + } } void Canvas::mouseMoveEvent(QMouseEvent* event) diff --git a/Canvas.h b/Canvas.h index e3b9ba6..1a86f60 100644 --- a/Canvas.h +++ b/Canvas.h @@ -30,7 +30,8 @@ enum class Mode : int Parallel = 2, ///< Режим задания параллельности Coincedent = 3, ///< Режим задания совпадения точек Horizontal = 4, ///< Режим задания горизонтальности - Vertical = 5 ///< Режим задания вертикальности + Vertical = 5, ///< Режим задания вертикальности + Perpendicular = 6 }; /// Удобный тип для хранения пары параллельных линий (порядок не важен) @@ -94,6 +95,8 @@ private: /// Проверить, являются ли две линии уже параллельными (дубликат ограничения) bool areAlreadyParallel(Line* line1, Line* line2); + bool areAlreadyPerpendicular(Line* line1, Line* line2); + // ====================== Методы работы с ограничениями ====================== /// Удалить последние добавленные ограничения при ошибке солвера @@ -115,6 +118,7 @@ private: // ====================== Коллекции ограничений ====================== std::set parallelPairs; ///< Пары параллельных линий + std::set perpendicularPairs; std::set P2Ppairs; ///< Пары совпадающих точек std::set HORIZ_pairs; ///< Пары точек горизонтальных линий std::set VERT_pairs; ///< Пары точек вертикальных линий