From cc1f891d903b4bfda190561843aed1a10068f0e6 Mon Sep 17 00:00:00 2001 From: ParkSuMin Date: Mon, 15 Dec 2025 18:53:12 +0300 Subject: [PATCH] P2P + Horizontal + Vertical MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Очередное исправление багов --- Canvas.cpp | 41 +++++++++++++++++++++++++++++------------ Canvas.h | 1 + 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/Canvas.cpp b/Canvas.cpp index 28d813c..556dbf6 100644 --- a/Canvas.cpp +++ b/Canvas.cpp @@ -451,17 +451,21 @@ void Canvas::mouseMoveEvent(QMouseEvent* event) if (draggedPoint) { QPointF pos = UCS_POSITION - dragOffset; - // Обновляем все связанные точки (совпадающие, горизонтальные, вертикальные) - for (Point* pair : points) { - if (areCoincident(draggedPoint, pair)) { - *pair->x = pos.x(); - *pair->y = pos.y(); - } - if (areHorizontalVertical(draggedPoint, pair, true)) { // vertical - *pair->x = pos.x(); - } - if (areHorizontalVertical(draggedPoint, pair, false)) { // horizontal - *pair->y = pos.y(); + auto coincidentGroup = getCoincidentGroup(draggedPoint); + + for (Point* pt : coincidentGroup) { + *pt->x = pos.x(); + *pt->y = pos.y(); + } + + for (Point* basePt : coincidentGroup) { + for (Point* other : points) { + if (areHorizontalVertical(basePt, other, true)) { + *other->x = pos.x(); + } + if (areHorizontalVertical(basePt, other, false)) { + *other->y = pos.y(); + } } } @@ -633,4 +637,17 @@ QPointF Canvas::screenToLogical(const QPointF& screenPos) const logical.ry() = -logical.ry(); return logical; -} \ No newline at end of file +} + +std::vector Canvas::getCoincidentGroup(Point* p) +{ + std::vector group; + group.push_back(p); + + for (Point* other : points) { + if (other != p && areCoincident(p, other)) { + group.push_back(other); + } + } + return group; +} diff --git a/Canvas.h b/Canvas.h index ed16485..e3b9ba6 100644 --- a/Canvas.h +++ b/Canvas.h @@ -69,6 +69,7 @@ private: #endif QPointF screenToLogical(const QPointF& screenPos) const; + std::vector getCoincidentGroup(Point* p); // ====================== Методы поиска и выбора ====================== /// Найти линию под указанной позицией