diff --git a/Canvas.cpp b/Canvas.cpp index b0b61dc..18ec9d8 100644 --- a/Canvas.cpp +++ b/Canvas.cpp @@ -7,7 +7,7 @@ static double dist_P2P(QPointF p1, QPointF p2) { template T makeOrderedPair(A* obj1, B* obj2) { - return (obj1->get_tag() < obj2->get_tag()) ? std::make_pair(obj1, obj2) : std::make_pair(obj2, obj1); + return (obj1 < obj2) ? std::make_pair(obj1, obj2) : std::make_pair(obj2, obj1); } void Canvas::changeMode(Mode _mode) @@ -46,9 +46,18 @@ bool Canvas::areCoincident(Point* p1, Point* p2) return P2Ppairs.count(makeOrderedPair(p1, p2)); } +// False - Horizonta, True - Vertical +bool Canvas::areHorizontalVertical(Point* p1, Point* p2, bool mode) +{ + if (!mode) + return HORIZ_pairs.count(makeOrderedPair(p1, p2)); + else + return VERT_pairs.count(makeOrderedPair(p1, p2)); +} + bool Canvas::areAlreadyParallel(Line* l1, Line* l2) { - return parallelPairs.count(makeOrderedPair(l1, l2)) > 0; + return parallelPairs.count(makeOrderedPair(l1, l2)); } void Canvas::mousePressEvent(QMouseEvent* event) @@ -71,10 +80,14 @@ void Canvas::mousePressEvent(QMouseEvent* event) Line* found = findAt(scene); if (found) { - if (mode == Mode::Horizontal) + if (mode == Mode::Horizontal) { sys.addConstraintHorizontal(*found, constraints_count++); - else + HORIZ_pairs.insert(makeOrderedPair(found->start_ref, found->end_ref)); + } + else { sys.addConstraintVertical(*found, constraints_count++); + VERT_pairs.insert(makeOrderedPair(found->start_ref, found->end_ref)); + } update(); } mode = Mode::None; @@ -244,6 +257,12 @@ void Canvas::mouseMoveEvent(QMouseEvent* event) *pair->x = pos.x(); *pair->y = pos.y(); } + if (areHorizontalVertical(draggedPoint, pair, true)) { + *pair->x = pos.x(); + } + if (areHorizontalVertical(draggedPoint, pair, false)) { + *pair->y = pos.y(); + } } *draggedPoint->x = pos.x(); *draggedPoint->y = pos.y(); @@ -311,18 +330,10 @@ void Canvas::paintEvent(QPaintEvent*) // === Текущая рисуемая линия (DrawingLine) === if (current_line && mode == Mode::DrawingLine) { - QPen pen(Qt::blue, 3, Qt::DashLine); - p.setPen(pen); - p.setBrush(Qt::transparent); - - p.drawLine(QPointF(*current_line->p1.x, *current_line->p1.y), - QPointF(*current_line->p2.x, *current_line->p2.y)); - // Концы текущей линии — синие точки p.setBrush(Qt::blue); p.setPen(Qt::NoPen); p.drawEllipse(QPointF(*current_line->p1.x, *current_line->p1.y), 6, 6); - p.drawEllipse(QPointF(*current_line->p2.x, *current_line->p2.y), 6, 6); } } diff --git a/Canvas.h b/Canvas.h index ca234c9..9c2cf16 100644 --- a/Canvas.h +++ b/Canvas.h @@ -53,6 +53,7 @@ private: Line* findAt(QPointF&); // ищет линию под курсором Point* findPointAt(QPointF, qreal tolerance = 5.0); bool areCoincident(Point*, Point*); + bool areHorizontalVertical(Point*, Point*, bool); // ====================== Параллельность ====================== bool areAlreadyParallel(Line* l1, Line* l2); // проверка на дубликат @@ -68,6 +69,8 @@ private: std::set parallelPairs; // уже запараллеленные пары (защита от дублей) std::set P2Ppairs; + std::set HORIZ_pairs; + std::set VERT_pairs; Line* current_line{ nullptr }; Point* firstPoint{ nullptr };