Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 5

ООП. Геометрические фигуры

10.02.2020, 17:52. Показов 5810. Ответов 27

Студворк — интернет-сервис помощи студентам
Классическая задачка на абстрактные классы: создать абстрактный класс Figure, напихать туда чисто виртуальных методов аля Draw(), Rotate(), Expand() и так далее, унаследоваться от него всякими Line, Triangle, реализовать методы абстрактного класса, запихать адреса потомков в вектор указателей родительского класса и вызывай себе из него методы.

Но вот задумался: по сути дела у нас может быть Point - класс, описывающий точку как геом. фигуру. И вот её крутить и деформировать, как по мне, абсолютно бесполезно. И что же это выходит - придется пилить отдельный класс FigureWithoutRotate или лепить мелкие интерфейсы аля IDraw(), IRotate(), IExpand(), где надо их реализовать. Но тогда фиг запихнёшь все твои точки и треугольники в один вектор. Можно вообще продолжать наследоваться от Figure, а для неугодных методов делать пустую реализацию и/или кидать их в приватную секцию. Короче ступор.

Как же тогда поступить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.02.2020, 17:52
Ответы с готовыми решениями:

Классическая задача ООП: геометрические фигуры
Решить эту задачу не составляет труда, сталкивался с ней уже. Самому интересно взглянуть чужой код, а лучше посмотреть решение...

[ООП] Геометрические функции
Очередное задание по ООП (наследование): Используя метод декомпозиции реализовать геометрические функции + значение площадей этих фигур. ...

ООП . Геометрические тела
Здравствуйте , нужна ваша помощь . Дан класс Geometric_object . И у него есть два подкласса Plane_figure_2d и Volumetric_body_3d , и у...

27
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.02.2020, 18:41
Цитата Сообщение от Chupakabra0_0 Посмотреть сообщение
Point - класс, описывающий точку как геом. фигуру. И вот её крутить и деформировать, как по мне, абсолютно бесполезно.
Неужели? Преобразование поворотом вокруг оси вполне себе полезно.
1
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 5
10.02.2020, 19:10  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Неужели? Преобразование поворотом вокруг оси вполне себе полезно.
Интересное замечание)) Возможно так и сделаю, но всё равно вопрос остаётся в силе. Просто любопытная штука, хотелось бы знать как правильнее. Не писать же пустую реализацию
0
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
10.02.2020, 20:25
Цитата Сообщение от Chupakabra0_0 Посмотреть сообщение
Как же тогда поступить?
1. Поставить задачу или определить круг задач, для которых создается классификация.
2. Не придумывать классификацию "на все случаи жизни", т.к. это гиблое дело.
3. На основании поставленных задач определить отношения между классами.
В результате может оказаться, например, что Point нужна лишь как часть (подобъект) более сложной геом. фигуры. В этом случае она играет роль вершины и вступает с другими фигурами в ассоциативную связь. Тогда возникает вопрос стоит ли Point наследовать от Figure. Если же круг задач требует от Point быть самостоятельной фигурой, то для нее следует определить центр трансформации (т.н. pivot point) и работать с ней как с полноценной геометрией, потому что имея центр трансформации, можно перемещать поворачивать и масштабировать все что угодно, в том числе и точку.
2
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 21:18
Цитата Сообщение от Chupakabra0_0 Посмотреть сообщение
Классическая задачка на абстрактные классы: создать абстрактный класс Figure, напихать туда чисто виртуальных методов аля Draw(), Rotate(), Expand() и так далее, унаследоваться от него всякими Line, Triangle, реализовать методы абстрактного класса, запихать адреса потомков в вектор указателей родительского класса и вызывай себе из него методы.
Хорошее задание.

Цитата Сообщение от Chupakabra0_0 Посмотреть сообщение
Но вот задумался: по сути дела у нас может быть Point - класс, описывающий точку как геом. фигуру. И вот её крутить и деформировать, как по мне, абсолютно бесполезно.
Но по-сути это будет круг класс Cicle так ведь? И да бесполезно разве что не будут доп свойств типа надписи внутри итп.

Помимо указанных выше замечаний:
Можно сказать что если Rotate(), Expand() лишены смысла то возможно их не стоит включать в класс Figure.
А создать другой абстрактный класс с ними.
1
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
10.02.2020, 21:25
Цитата Сообщение от Avazart Посмотреть сообщение
Ну по-сути это будет круг класс Cicle так ведь?
Не совсем. Точка остается точкой, не имеющей размеров и площади.
При этом деформация точки это абсолютно нормальная (имеющая смысл) операция, возможная в том случае, если для геометрической фигуры (в т.ч. и точки) определена другая точка, относительно которой производится деформация.
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 21:29
Цитата Сообщение от fao Посмотреть сообщение
Не совсем. Точка остается точкой, не имеющей размеров и площади.
Да, но тогда она может и не рисоваться вообще.

Вся суть в том что за точка и какой ее смысл.
1
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
10.02.2020, 21:31
Цитата Сообщение от Avazart Посмотреть сообщение
Вся суть в том что за точка и какой ее смысл.
Точно. Поэтому для начала нужно определиться с задачами
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 21:39
Если говорить про геометрические фигуры, то точка это не фигура.
0
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
10.02.2020, 21:48
Цитата Сообщение от Avazart Посмотреть сообщение
Если говорить про геометрические фигуры, то точка это не фигура.
Это смотря какое определение точки рассматривать. С точки зрения геометрии точка это фигура.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 22:35
Цитата Сообщение от fao Посмотреть сообщение
С точки зрения геометрии точка это фигура.
Фигура это множество точек. Т.е. больше одной. При чем точки должны быть с разными координатами.
0
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
10.02.2020, 23:36
Avazart, не буду спорить, т.к. подзабыл уже школьные определения. Вот тут по ссылке, например, есть такое: https://naobumium.info/planime... tochka.php
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 23:46
Точку определять как фигуру, а фигуру как множество точек как-то не логично.

Добавлено через 1 минуту
То́чка — одно из фундаментальных понятий математики, абстрактный объект в пространстве, не имеющий никаких измеримых характеристик (нульмерный объект).
https://ru.wikipedia.org/wiki/... 0%B8%D1%8F)

В то время как фигура- плоский объект, тело- трехмерный объект.
0
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
10.02.2020, 23:48
Цитата Сообщение от Avazart Посмотреть сообщение
Точку определять как фигуру, а фигуру как множество точек как то не логично.
В 3д графике полигон это множество треугольников - фигура, состоящая из множества элементарных фигур. Вполне логично.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 23:54
Полигон это многоугольник, тоже множество точек.
0
0 / 0 / 0
Регистрация: 21.05.2019
Сообщений: 5
11.02.2020, 13:30  [ТС]
Заставили задуматься конечно по поводу природы точки. Пришел к двум вариантом: или точка нечто вообще иное и единственное, что будет роднить её с фигурой это возможность её рисовать, перемещать и так далее. Выходит, будет отдельный абстрактный класс, который наследует несколько интерфейсов. И потом наследуется от него, реализуем интерфейсы и готово.

И второй вариант: точка геометрическая фигура по своим свойствам схожа с кругом и тогда нужно сначала круг сделать, потом от него наследоваться. И если поворот вокруг своего центра для круга может быть полезным (например, в круге текст или символ), то для точки придется писать пустую реализацию, ведь поворот вокруг другой точки, как по мне, немного другая история и для неё нужна отдельная функция. А то выходит как перегрузка оператора ^ не как XOR, а как возведение в степень. Хотя, многие так делают и им норм
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.02.2020, 13:36
Это бред.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
11.02.2020, 13:59
Chupakabra0_0, т.к. у тебя задача на классы, а не на математику или графику, то вот пример для твоей иерархии
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
struct Figure
{
    virtual ~Figure() {}
 
    virtual void scale(double factorX, double factorY) = 0;
    virtual void translate(double offX, double offY) = 0;
    virtual void rotate(double angle, double originX, double originY) = 0;
 
    virtual void draw() = 0;
    //...
};
 
class Point : public Figure
{
    double x, y;
 
public:
 
    Point(double, double);
 
    void scale(double factorX, double factorY) override;
    void translate(double offX, double offY) override;
    void rotate(double angle, double originX, double originY) override;
 
    void draw() override;
    //...
};
 
class Circle : public Figure
{
    Point center;
    double radius;
 
public:
 
    Circle(Point, double);
 
    void scale(double factorX, double factorY) override
    {
        center.scale(factorX, factorY);
        // по хорошему надо два радиуса, и отмасштабировать каждый
    }
    void translate(double offX, double offY) override
    {
        center.translate(offX, offX);
    }
    void rotate(double angle, double originX, double originY) override
    {
        center.rotate(angle, originX, originY);
    }
 
    void draw() override;
    //...
};
 
class Triangle : public Figure
{
    Point points[3];
 
public:
 
    Triangle(Point, Point, Point);
 
    void scale(double factorX, double factorY) override
    {
        for (auto& p : points)
            p.scale(factorX, factorY);
    }
    void translate(double offX, double offY) override
    {
        for (auto& p : points)
            p.translate(offX, offX);
    }
    void rotate(double angle, double originX, double originY) override
    {
        for (auto& p : points)
            p.rotate(angle, originX, originY);
    }
 
    void draw() override;
    //...
};
 
// и т.д. и т.п.
1
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
11.02.2020, 15:33
zayats80888, как может выглядеть осмысленная реализация метода Point::scale(double factorX, double factorY) ?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
11.02.2020, 17:42
Цитата Сообщение от fao Посмотреть сообщение
как может выглядеть осмысленная реализация метода Point::scale(double factorX, double factorY) ?
А как выглядит осмысленное масштабирование прямоугольника, например?
Тут так же.
C++
1
2
3
4
5
6
void Point::scale(double factorX, double factorY)
{
    // масштабирование относительно начала координат
    x *= factorX;
    y *= factorY;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2020, 17:42
Помогаю со студенческими работами здесь

ООП . Геометрические тела
Здравствуйте , нужна ваша помощь . Дан класс Geometric_object . И у него есть два подкласса Plane_figure_2d и Volumetric_body_3d , и у...

Геометрические фигуры
Доброго времени суток, господа. Возник вопрос. Подскажите, какие функции в с++ используются для рисования простейших геометрических фигур....

с++ нарисовать геометрические фигуры
Как сделать программу которая выведет на экран геометрическую фигуру: 1.квадрат 2.треугольник 3.прямоугольник Модификации: _НА...

Геометрические фигуры циклом С++
Здравствуйте мне нужно сделать квадрат и треугольник, перевернутый треугольник при этом вводя ширину и высоту и чтоб они были пустые...

Геометрические фигуры: реализовать наследование с полиморфизмом
Здравствуйте, Помогите пожалуйста реализовать следующую идею: Есть общий класс: фигура Его подклассы: Окружность, треугольник ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru