Напишите иерархию классов для работы с геометрическими фигурами на плоскости:
-
Структура
Point
- точка на плоскости. Точку можно задать двумя числами типаdouble
. Должны быть открыты поляx
иy
. Точки можно сравнивать операторами==
и!=
. -
Класс
Line
- прямая. Прямую можно задать двумя точками, можно двумя числами (угловой коэффициент и сдвиг), можно точкой и числом (угловой коэффициент). Линии можно сравнивать операторами==
и!=
. -
Абстрактный класс
Shape
- фигура. -
Класс
Polygon
- многоугольник. Многоугольник - частный случай фигуры. У многоугольника можно спроситьverticesCount()
- количество вершин - иstd::vector<Point> getVertices
- сами вершины без возможности изменения. Можно сконструировать многоугольник из вектора точек-вершин в порядке обхода. Для простоты будем считать, что многоугольники с самопересечениями никогда не возникают (гарантируется, что в тестах таковые будут отсутствовать). -
Класс
Ellipse
- эллипс. Эллипс - частный случай фигуры. У эллипса можно спроситьstd::pair<Point,Point> focuses()
- его фокусы;double eccentricity()
- его эксцентриситет,Point center()
- его центр. Эллипс можно сконструировать из двух точек иdouble
(два фокуса и сумма расстояний от эллипса до них); -
Класс
Circle
- круг. Круг - частный случай эллипса. У круга можно спроситьdouble radius()
- радиус. Круг можно задать точкой и числом (центр и радиус). -
Класс
Rectangle
- прямоугольник. Прямоугольник - частный случай многоугольника. У прямоугольника можно спроситьPoint center()
- его центр;std::pair<Line, Line> diagonals()
- пару его диагоналей. Прямоугольник можно сконструировать по двум точкам (его противоположным вершинам) и числу (отношению смежных сторон), причем из двух таких прямоугольников выбирается тот, у которого более короткая сторона расположена по левую сторону от диагонали, если смотреть от первой заданной точки в направлении второй. -
Класс
Square
- квадрат. Квадрат - частный случай прямоугольника. У квадрата можно спроситьCircle circumscribedCircle()
,Circle inscribedCircle()
. Квадрат можно задать двумя точками - противоположными вершинами. -
Класс
Triangle
- треугольник. Треугольник - частный случай многоугольника. У треугольника можно спроситьCircle circumscribedCircle()
,Circle inscribedCircle()
,Point centroid()
- его центр масс,Point orthocenter()
- его ортоцентр,Line EulerLine()
- его прямую Эйлера,Circle ninePointsCircle()
- его окружность Эйлера.
У любой фигуры можно спросить:
-
double perimeter()
- периметр; -
double area()
- площадь; -
operator==(const Shape& another)
- совпадает ли эта фигура с другой;
С любой фигурой можно сделать:
-
rotate(Point center, double angle)
- поворот на угол (в градусах, против часовой стрелки) относительно точки; -
reflex(Point center)
- симметрию относительно точки; -
reflex(Line axis)
- симметрию относительно прямой; -
scale(Point center, double coefficient)
- гомотетию с коэффициентомcoefficient
и центромcenter
.
Задача стоит 9 баллов.
Решения сданные позже 23:59:59 20 Октября 2020 года не принимаются.