P2P + Horizontal + Vertical

Очередное исправление багов
This commit is contained in:
2025-12-15 18:53:12 +03:00
parent 0f064bf48e
commit cc1f891d90
2 changed files with 30 additions and 12 deletions

View File

@@ -451,17 +451,21 @@ void Canvas::mouseMoveEvent(QMouseEvent* event)
if (draggedPoint) { if (draggedPoint) {
QPointF pos = UCS_POSITION - dragOffset; QPointF pos = UCS_POSITION - dragOffset;
// Обновляем все связанные точки (совпадающие, горизонтальные, вертикальные) auto coincidentGroup = getCoincidentGroup(draggedPoint);
for (Point* pair : points) {
if (areCoincident(draggedPoint, pair)) { for (Point* pt : coincidentGroup) {
*pair->x = pos.x(); *pt->x = pos.x();
*pair->y = pos.y(); *pt->y = pos.y();
} }
if (areHorizontalVertical(draggedPoint, pair, true)) { // vertical
*pair->x = pos.x(); 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();
} }
if (areHorizontalVertical(draggedPoint, pair, false)) { // horizontal
*pair->y = pos.y();
} }
} }
@@ -634,3 +638,16 @@ QPointF Canvas::screenToLogical(const QPointF& screenPos) const
return logical; return logical;
} }
std::vector<Point*> Canvas::getCoincidentGroup(Point* p)
{
std::vector<Point*> group;
group.push_back(p);
for (Point* other : points) {
if (other != p && areCoincident(p, other)) {
group.push_back(other);
}
}
return group;
}

View File

@@ -69,6 +69,7 @@ private:
#endif #endif
QPointF screenToLogical(const QPointF& screenPos) const; QPointF screenToLogical(const QPointF& screenPos) const;
std::vector<Point*> getCoincidentGroup(Point* p);
// ====================== Методы поиска и выбора ====================== // ====================== Методы поиска и выбора ======================
/// Найти линию под указанной позицией /// Найти линию под указанной позицией