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

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

10.02.2020, 17:52. Показов 5756. Ответов 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru