Skip to content

Latest commit

 

History

History

geometry

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

Проект 2: geometry

Условие:

Напишите иерархию классов для работы с геометрическими фигурами на плоскости:

  • Структура 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 года не принимаются.