Касательность окружностей и линии с окружностью

This commit is contained in:
2025-12-25 00:44:48 +03:00
parent a31ef22f0f
commit dd4d2e2dbb
5 changed files with 141 additions and 21 deletions

View File

@@ -3,6 +3,11 @@
constexpr auto EPS = 1e-9;
constexpr auto ZOOM_STEP = 0.05;
#define WIDGET_POSITION event->pos()
#define UCS_POSITION screenToLogical(WIDGET_POSITION)
#define CURVE_AS_LINE(CURVE) dynamic_cast<Line*>(CURVE)
#define CURVE_AS_CIRCLE(CURVE) dynamic_cast<Circle*>(CURVE)
#include <QWidget>
#include <QMouseEvent>
#include <QPointF>
@@ -35,7 +40,8 @@ enum class Mode : int
Horizontal = 4, ///< Режим задания горизонтальности
Vertical = 5, ///< Режим задания вертикальности
Perpendicular = 6, ///< Режим задания перпендикулярности
DrawingCircle = 7 ///< Режим рисования окружности
DrawingCircle = 7, ///< Режим рисования окружности
Tangent = 8 //< Режим задания касательности
};
/// Удобный тип для хранения пары параллельных линий (порядок не важен)
@@ -44,6 +50,8 @@ using LinePair = std::pair<Line*, Line*>;
/// Удобный тип для хранения пары точек (порядок не важен)
using PointPair = std::pair<Point*, Point*>;
using CurvePair = std::pair<Curve*, Curve*>;
// ===================================================================
// Основной класс холста
// ===================================================================
@@ -226,6 +234,8 @@ private:
*/
bool areAlreadyPerpendicular(Line* line1, Line* line2);
bool areAlreadyTangent(Curve* curve1, Curve* curve2);
// ====================== Методы работы с ограничениями ======================
/**
@@ -263,6 +273,7 @@ private:
// ====================== Коллекции ограничений ======================
std::set<LinePair> parallelPairs; ///< Пары параллельных линий
std::set<LinePair> perpendicularPairs; ///< Пары перпендикулярных линий
std::set<CurvePair> tangentPairs;
std::set<PointPair> P2Ppairs; ///< Пары совпадающих точек
std::set<PointPair> HORIZ_pairs; ///< Пары точек горизонтальных линий
std::set<PointPair> VERT_pairs; ///< Пары точек вертикальных линий
@@ -270,6 +281,7 @@ private:
// ====================== Временные данные для режимов ======================
Line* current_line{ nullptr }; ///< Текущая линия в режимах рисования/параллельности
Circle* current_circle{ nullptr };
Curve* current_curve { nullptr };
Point* firstPoint{ nullptr }; ///< Первая точка в режиме совпадения
Mode mode{ Mode::None }; ///< Текущий режим работы
@@ -287,7 +299,7 @@ private:
*/
struct ConstraintInfo {
Mode mode; ///< Тип ограничения
std::variant<LinePair, PointPair> data; ///< Данные ограничения
std::variant<LinePair, PointPair, CurvePair> data; ///< Данные ограничения
};
std::map<int, ConstraintInfo> C_Info; ///< Карта информации об ограничениях