Пятница, 29 Марта 2024, 03:09

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Иерархия геометрических фигур (Как правильно составить)
Иерархия геометрических фигур
SWFcreatorДата: Четверг, 26 Января 2012, 18:55 | Сообщение # 1
участник
Сейчас нет на сайте
Сегодня на паре преподаватель дал мне задание написать иерархию. Я составил ее так:
Code

class point
{
public:
//Конструкторы и методы доступа
private:
short x, y
}:

class line
{
public:
//Конструкторы и методы доступа
private:
point start, end;
};

//И так далее - четырехугольник содержит в себе 4 линии....

Но мне все кажется, что это немного не то и под словом "иерархия" он имел введу наследование. Хотя мне мой вариант кажется логичнее. Правильно ли я сделал? Если нет, как было бы правильно составить иерархию?


Сообщение отредактировал SWFcreator - Четверг, 26 Января 2012, 19:09
ComentДата: Четверг, 26 Января 2012, 20:34 | Сообщение # 2
почетный гость
Сейчас нет на сайте
Ммм... Я так понимаю, что нужно вроде вот так



Сообщение отредактировал Coment - Четверг, 26 Января 2012, 20:36
SWFcreatorДата: Четверг, 26 Января 2012, 21:18 | Сообщение # 3
участник
Сейчас нет на сайте
В том то и дело, я знаю, что это не иерархия, но, плохо себе представляю, как она должна выглядеть. Допустим, класс точка с коорд. х, у. Линия, в моем понимании должна иметь в себе две точки - начало и конец, то есть, производный линия должен вмещать в себе дополнительно х2, у2 или же объект точки. По-моему, как то это некрасиво, гораздо удобнее оперировать двумя объектами точки. А с четырехугольником вообще страшно представить. Но препод сказал именно иерархию и мне кажется, я чего то не догоняю, кто что посоветует?
MontegДата: Четверг, 26 Января 2012, 21:28 | Сообщение # 4
участник
Сейчас нет на сайте
SWFcreator, А обязательно использовать геометрические фигуры? Вариант с зоопарком намного интуитивнее.

Сообщение отредактировал Monteg - Четверг, 26 Января 2012, 21:29
ComentДата: Четверг, 26 Января 2012, 21:37 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Посмотри вот здесь. Немного сложновато если для новичка, но принцип как раз по геометрическим фигурам.



Сообщение отредактировал Coment - Четверг, 26 Января 2012, 21:41
MatouДата: Четверг, 26 Января 2012, 21:55 | Сообщение # 6
Исходный коТ
Сейчас нет на сайте
Ну обычно под иерархией геометрических фигур понимается что-то вроде этого.

class shape{
//---
public:
point center;
virtual void Draw(void);
//---
}

class Ractangle: public shape{
//---
point p1, p2;
virtual void Draw(void);
//---
};

class Triangle: public shape{
//---
point p1, p2, p3;
virtyal void Draw(void);
//---
};

class Circle: public shape{
//---
virtual void Draw(void);
//---
};

ну и т.д. На основе этого можно полиморфизм замутить

shape shapes[3];
//---
shape[0] = new Ractangle(...);
shape[1] = new Triangle(...);
shape[3] = new Circle(...);
//---
for(int i = 0; i < 3; ++i){
shape[i].Draw();
}

ну и т.д. Хотя то что ты написал (члены классов содержат другие классы) тоже иерархия. Хотя такую иерархию (иерархию владения), обычно называют агрегацией.





Сообщение отредактировал Matou - Четверг, 26 Января 2012, 21:57
SWFcreatorДата: Четверг, 26 Января 2012, 22:28 | Сообщение # 7
участник
Сейчас нет на сайте
Monteg, да, с зоопарком и мне понятно.
Coment, спасибо.
Matou, спасибо, классный код, но ты используешь точку в форме, а мне, как я понял, нужна последовательная иерархия прямиком от класса точки, еще должна быть линия. Вообще, можно наследовать линию от точки и использовать в форме, как ты это сделал, но это уже 2 иерархии, зато смотрится куда лучше.
MatouДата: Четверг, 26 Января 2012, 23:03 | Сообщение # 8
Исходный коТ
Сейчас нет на сайте
Quote (SWFcreator)
классный код

Жудко банальный код, можно найти в любом более-менее толковом учебнике по С++

Quote (SWFcreator)
Вообще, можно наследовать линию от точки и использовать в форме, как ты это сделал, но это уже 2 иерархии, зато смотрится куда лучше.

Я мысль не совсем понял, но мне кажется что не стоит наследовать линию от точки.

Quote (SWFcreator)
ты используешь точку в форме

Точка в фигуре служебная, она нужна для того чтобы у всех фигур было что-то общее, что-то что позволит работать с любой фигурой не зависимо от того какой именно, т.е. отношения к геометрии фигуры эти данные не имеют, в данном случае это просто точка относительно которой задаются другие точки фигуры и относительно нее же рисуется фигура. Так фигуры можно не только рисовать, но еще вращать и перемещать, например:

class shape{
//---
public:
point center;
virtual rotate(degree);
virtual moveTo(point);
vitrual move(point);
virtual void Draw(void);
//---
}

class Ractangle: public shape{
//---
point p1, p2;
virtual moveTo(point);
vitrual move(point);
virtual void Draw(void);
//---
};

// теперь можно определить соответствующие виртуальные ф-ии
void Ractangle::moveTo(point myPoint)
{
center = myPoint;
}

void Ractangle::moveTo(point myPoint)
{
center += myPoint;
}

void Ractangle::rotate(degree)
{
p1.rotate(center);
p1.rotate(center);
}

ну и т.д. для других фигур, теперь

shape shapes[3];
//---
shape[0] = new Ractangle(...);
shape[1] = new Triangle(...);
shape[3] = new Circle(...);
//---

point somePoint(0, 25);

for(int i = 0; i < 3; ++i){
shape[i].Draw();
shape[i].rotate(15);
shape[i].move(somePoint);
}

выведет наши фигуты, а потом повернет каждую вокруг ее центра и переместит на 25 точек в сторону положительной оси Х (как правило вправо).



SWFcreatorДата: Четверг, 26 Января 2012, 23:25 | Сообщение # 9
участник
Сейчас нет на сайте
А, понял насчет центральной точки. А насчет линии я имел ввиду
Code

class point
{
short x, y;
};

class line: public point
{
short x2, y2;
};

class shape
{
virtual void draw() const;
};

class rectangle: public shape
{
virtual void draw() const;
line up, down, right, left;
};

class triangle: public shape
{
virtual void draw() const;
line line1, line2, line3;
};
Форум игроделов » Программирование » C/C++ » Иерархия геометрических фигур (Как правильно составить)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг