ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.12.2023
Просмотров: 86
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
ООП. Обязательное задание
Геометрические фигуры
Задание
-
Создать файл base-types.h, содержащий определения следующих структур:
-
point_t, представляющую собой точку на плоскости. Координаты должны храниться в полях x и y. -
rectangle_t, описывающую прямоугольник шириной width и высотой height с центром в точке pos.
-
Создать файл shape.h, содержащий определение абстрактного класса Shape. Этот класс должен предоставлять следующие методы:
-
getArea вычисление площади -
getFrameRect получение ограничивающего прямоугольника для фигуры (см. типы из предыдущего пункта), стороны ограничивающего прямоугольника всегда параллельны осям -
move перемещение центра фигуры, реализовать в двух вариантах:
-
перемещение в конкретную точку -
смещение по осям абсцисс и ординат
-
scale изотропное масштабирование фигуры относительно её центра с указанным коэффициентом -
getName получение названия фигуры (RECTANGLE, CIRCLE, COMPLEX и т.д.), метод использовать при выводе -
clone создание копии фигуры в динамической памяти и получение указателя на эту копию
-
Реализовать класс Rectangle, производный от Shape, в файлах rectangle.h и rectangle.cpp, соответственно (см. раздел «Фигуры»). -
Реализовать фигуру, указанную преподавателем (см. раздел «Фигуры»). -
Реализовать класс CompositeShape, производный от Shape (см. раздел «Фигуры»), представляющий собой составную фигуру и хранящий массив в динамической памяти из произвольных фигур, реализованных в вашей программе. Использование умных указателей и контейнеров стандартной библиотеки недопустимо. Объекты класса должны корректно копироваться и перемещаться. При добавлении базовой (прямоугольник, круг и т.п.) фигуры в составную, добавляться должна копия базовой фигуры. -
Перегрузить оператор вывода << для класса Shape. Вывод должен содержать в одну строчку: название фигуры, её площадь, координаты левого нижнего угла и правого верхнего угла ограничивающего прямоугольника. Элементы при выводе должны округляться до одного знака после запятой в соответствии с правилами математики. -
Перегрузить оператор сравнения < для класса Shape. Сравнение проводить по площади фигуры. -
Реализовать функцию, сортирующую массив указателей на фигуры в порядке неубывания их площадей. -
Написать программу, которая считывает описания фигур и команд из файла (см. раздел «Требования») и после окончания ввода фигур, а также после выполнения каждой команды выводит в стандартный вывод на отдельных строках информацию о каждой фигуре в порядке неубывания их площадей. Вывод для составной фигуры должен быть таким же, как и для всех остальных: название, площадь, координаты углов ограничивающего прямоугольника. -
Отдельно продемонстрировать работу всех методов копирования и перемещения составной фигуры.
Фигуры
Каждая фигура описывается своим набором параметров. Отсутствие самопересечений, выпуклость фигур и корректное количество (и только количество) параметров гарантируется, если не сказано иного:
-
Прямоугольник. Описывается парой координат своих углов: левым нижним и правым верхним. Считается, что стороны прямоугольника параллельны осям координат. Центром фигуры считается точка пересечения диагоналей
RECTANGLE 1.0 1.0 3.0 4.0
RECTANGLE 0.0 0.0 -2.0 -10.0
-
Круг. Описывается координатами центра и радиусом. Центром фигуры считается центр окружности
CIRCLE 2.0 3.0 5.0
-
Кольцо. Описывается координатами центра и парой радиусов: внешней и внутренней окружности соответственно. Центром фигуры считаются центры окружностей
RING 2.0 3.0 5.0 4.0
-
Эллипс. Описывается координатами центра и двумя значениями радиусов: по вертикальной оси и по горизонтальной оси. Считается, что оси эллипса параллельны осям координатам. Центром фигуры считается точка пересечения осей эллипса
ELLIPSE 0.0 0.0 5.0 7.0
-
Квадрат. Описывается координатами своего левого нижнего угла и длиной стороны. Считается, что стороны квадрата параллельны осям координат. Центром фигуры считается точка пересечения диагоналей
SQUARE 1.0 2.0 1.0
-
Треугольник. Описывается координатами трёх своих вершин. Центром фигуры считается центр тяжести фигуры
TRIANGLE 0.0 0.0 1.0 1.0 0.0 1.0
-
Параллелограмм. Описывается тремя вершинами, составляющими треугольник, одна из сторон которого является диагональю параллелограмма, а две другие сторонами параллелограмма. Стороны параллелограмма формируются первой и последней парой вершин. При этом одна из сторон должна быть параллельна оси абсцисс. Центром фигуры считается точка пересечения диагоналей
PARALLELOGRAM 0.0 1.0 5.0 1.0 3.0 0.0
PARALLELOGRAM 0.0 1.0 10.0 1.0 5.0 5.0
-
Ромб. Описывается координатами центра и двумя значениями диагоналей: по вертикальной оси и по горизонтальной оси. Считается, что диагонали ромба параллельны осям координатам. Центром фигуры считается точка пересечения диагоналей
DIAMOND 0.0 5.0 10.0 8.0
-
Правильный многоугольник. Описывается тремя вершинами. Вершины должны формировать прямоугольный треугольник, гипотенуза которого равна радиусу описанной у многоугольника окружности, а один из катетов - радиусу вписанной в многоугольник окружности. Центром фигуры считается первая из трёх вершин.
REGULAR 0.0 0.0 0.0 1.0 1.0 1.0
-
Невыпуклый четырёхугольник. Описывается четырьмя вершинами. Первые три должны удовлетворять свойствам треугольника. Четвёртая вершина должна лежать внутри треугольника, формируемого первыми тремя вершинами. Вогнутость четырёхугольника формируется последними тремя вершинами в описании. Центром фигуры считается точка, формирующая вогнутость
CONCAVE 0.0 5.0 0.0 0.0 10.0 -1.0 1.0 1.0
-
Равнобедренная трапеция. Описывается координатами левого нижнего угла, длиной нижнего основания, длиной верхнего основания и высотой. Основания должны быть параллельны оси абсцисс. Центром фигуры считается середина средней линии
ISOTRAPEZIUM 1.0 1.0 5.0 3.0 4.0
-
Прямоугольная трапеция. Описывается координатами левого нижнего угла, длиной нижнего основания, длиной верхнего основания и высотой. Основания должны быть параллельны оси абсцисс, а левая сторона – оси ординат. Центром фигуры считается середина средней линии
RECTRAPEZIUM -1.0 1.0 6.0 3.0 2.0
-
Составная фигура. Состоит из нескольких простых (не составных) фигур. Описывается на нескольких строках, начинаясь и завершаясь специальными командами (всегда находятся на отдельных строках). В первой строке указывается параметр – максимально возможное количество простых фигур. Центром фигуры считается центр ограничивающего прямоугольника
COMPLEX 5
CIRCLE 2.0 3.0 15.0
RECTANGLE -5.0 -3.0 3.0 4.0
CIRCLE 1.0 1.0 10.0
SQUARE -1.5 -1.5 10.0
SQUARE 0.0 0.0 5.0
COMPLEXEND
Команды
Количество и корректность параметров гарантируются.
-
Перемещение. Выполняет смещение по осям абсцисс и ординат соответственно
MOVE 2.0 3.0 -
Масштабирование. Выполняет изотропное масштабирование относительно указанного центра. Первые два параметра – координаты центра, третий – коэффициент масштабирования. Коэффициент должен быть положительным.
SCALE 8.0 -3.0 2.0
Команда должна быть реализована только с помощью методов move и scale, без расширения интерфейса Shape. Например, чтобы выполнить изотропное масштабирование произвольной фигуры, центр которой нельзя получить через её интерфейс, относительно точки S (8.0; -3.0) с коэффициентом 2 нужно:-
Получить её ограничивающий прямоугольник и выбрать на нём произвольную точку А1 -
Переместить фигуру в центр изотропного масштабирования S (метод move) -
Получить ограничивающий прямоугольник фигуры, центр которой находится в точке S и выбрать на нём точку А2, соответствующую точке A1 -
Определить вектор смещения (разность координат) из A1 в A2 -
Провести масштабирование фигуры (метод scale) -
Выполнить масштабирование вектора смещения и поместить его начало в центр изотропного масштабирования (получаем вектор delta). -
Переместить фигуру на полученный вектор смещения (метод move)
-
Требования
-
Все числовые данные должны быть представлены значениями с плавающей запятой. -
Использование умных указателей и контейнеров стандартной библиотеки недопустимо (за исключением std::string для обработки ввода). -
Каждая строка в файле с описанием фигур и команд гарантировано содержит описание не более одной фигуры или команды, только составная фигура описывается несколькими строками. Элементы в описании разделены ровно одним пробелом и гарантировано являются вещественными числами (за исключением названия фигур и команд). Все описания фигур идут перед описанием команд.
Пример:
CIRCLE 1.15 2.5 10.1
RECTANGLE -5.9 -3.4 3.0 4.0
SQUARE -1.55 -1.55 10.5
TRIANGLE 1.3 2.2 3.2 5.0 10.0 -5.5
COMPLEX 5
CIRCLE 2.0 3.0 15.0
RECTANGLE -5.0 -3.0 3.0 4.0
CIRCLE 1.0 1.0 10.0
SQUARE -1.5 -1.5 10.0
SQUARE 0.0 0.0 5.0
COMPLEXEND
SCALE -15.0 -7.5 1.5
MOVE 2.0 3.0 -
Команды применяются к каждой из фигур -
Пустые строки должны игнорироваться -
Описания фигур, не реализованных в программе должны игнорироваться, как если бы строка была пустой -
Если фигура задана некорректно, программа игнорирует её, но в стандартной поток ошибок должно выводиться сообщение о наличии ошибок в описании фигуры -
Строки внутри описания составной фигуры обрабатываются точно так же, как и все остальные, т.е. пустые строки, нереализованные и некорректные фигуры игнорируются