Касательность окружностей и линии с окружностью
This commit is contained in:
16
Canvas.h
16
Canvas.h
@@ -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; ///< Карта информации об ограничениях
|
||||
|
||||
Reference in New Issue
Block a user