P2P + Horizontal + Vertical
Очередное исправление багов
This commit is contained in:
41
Canvas.cpp
41
Canvas.cpp
@@ -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(draggedPoint, pair, false)) { // horizontal
|
if (areHorizontalVertical(basePt, other, true)) {
|
||||||
*pair->y = pos.y();
|
*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();
|
logical.ry() = -logical.ry();
|
||||||
|
|
||||||
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;
|
||||||
|
}
|
||||||
|
|||||||
1
Canvas.h
1
Canvas.h
@@ -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);
|
||||||
// ====================== Методы поиска и выбора ======================
|
// ====================== Методы поиска и выбора ======================
|
||||||
|
|
||||||
/// Найти линию под указанной позицией
|
/// Найти линию под указанной позицией
|
||||||
|
|||||||
Reference in New Issue
Block a user