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); // ====================== Методы поиска и выбора ====================== /// Найти линию под указанной позицией