Рассмотреть класс геометрических фигур, квадрат, круг, треугольник

ИЛИ ПРОСТО ОПИШИТЕ КЛАСС ГЕОМЕТРИЧЕСКИЕ ФИГУРЫ, КАК ПОСЧИТАЕТЕ НУЖНЫМ.

Помогите пожалуйста. В программирование не силен. Как работать с классами не знаю.

Нужно, что бы выглядело так:

Меню программы:

  1. Треугольник
  2. Круг
  3. Квадрат Выбираем нужную геометрическую фигуру (вводим с клавиатуры например 2). Программа просит, задать размер фигуры, в даном случае размер круга (его радиус). Вводим с клавиатуры например 7. Программа просит выбрать цвет фигуры.
  4. Красный
  5. Оранжевый
  6. Желтый
  7. Зеленый
  8. Голубой
  9. Синий
  10. Фиолетовый Выбираем нужный цвет например 4. Программа выводит графическое окно, в которой нарисован зеленый круг радиусом 7. И для всего этого добра нужно рассмотреть класс геометрических фигур. (ну что бы были Инкапсуляция, Полиморфизм и Наследование) Есть мой код выглядит так, его надо доделывать сильно.
> Program classfigur;
> Uses graphabc;
> Var
>   n: Byte;

> procedure krug;
> begin
> Circle(500,200,100);
> FLOODFILL(500,200,clred);
> end;

> procedure kvadr;
> begin
> line(200,1,440,1);
> line(440,1,440,240);
> line(440,240,200,240);
> line(200,240,200,1);
> FLOODFILL(240,200,clblue);
> end;

> procedure treug;
> begin
> line(300,100,500,300);
> line(500,300,100,300);
> line(100,300,300,100);
> FLOODFILL(300,200,clgreen);
> end;

> begin
>   repeat
>   WriteLn('1-Круг');
>   WriteLn('2-Квадрат');
>   WriteLn('3-Треугольник');
>   WriteLn('4-Выход');
>   Write('5-Следующая фигура: ');
>   ReadLn(n);
>   Case n of
>     1: krug;
>     2: kvadr;
>     3: treug;
>   end;
>   until n <> 0;
> end.

Предусмотреть методы для создания объектов, изменения размеров и цвета. Спасибо.

еще нужно что бы выводил данные о фигурах(место расположение и размер) Есть еще код но уже не мой.

uses GraphAbc;
var w:char;
    j:integer;
begin
  repeat
    ClearWindow;
    textout(1,10,'Выберите действие');
    textout(1,30,'1-нарисовать квадрат');
    textout(1,50,'2-нарисовать круг');
    textout(1,70,'другое выход');
    readln(w);
    case w of 
    '1':begin
        textout(1,90,'Сторона:');
        readln(j);
        ClearWindow;
        Rectangle(WindowWidth div 2-j div 2,WindowHeight div 2-j div 2,WindowWidth div 2+j div 2,WindowHeight div 2+ j div 2);
        textout(WindowWidth div 2-50,10,'Нажмите Enter');
        readln;
        end;
    '2':begin
        textout(1,90,'радиус:');
        readln(j);
        ClearWindow;
        Circle(WindowWidth div 2,WindowHeight div 2,j);
        textout(WindowWidth div 2-50,10,'Нажмите Enter');
        readln;
       end;
     else exit;
   end;  
  until not (w in ['1','2']);   
 end. 

П.С. можно и не 3 фигуры а 1 круг или квадрат.

Если задача показать инкапсуляцию и полиморфизм, то возможно нужно делать что-то на подобии этого:

type
    Shape = auto class
        x, y: integer;
        color: GraphABC.Color;
    end;

    Square = class(Shape)        
        x1, y1: integer;
        
        constructor Create(x, y, x1, y1: integer; color: GraphABC.Color);
        begin
            self.x := x;
            self.x1 := x1;
            self.y := y;
            self.y1 := y1;
            self.color := color;
        end;
        
        procedure Draw();
        begin
            brush.Color := color;
            GraphABC.Rectangle(x, y, x1, y1);
            
            brush.Color := GraphABC.Color.Transparent;
        end;
    end;

Но лучше бы сначала почитать, что это вообще такое, а потом уже код писать.

Задача сформулирована так. Дословно: Рассмотреть класс геометрических фигур. Уже сам пришел к выводу что нужно показать инкапсуляцию и полиморфизм. Уже сам напридумал себе то что описал вышел.

А можно основной код прогрмы тоже написать? Уже третий день мучаюсь с этим и сам пытаюсь и других пытаю все никак да никак. Большое спасибо.

uses
    GraphABC;

type
    Shape = auto class
        x, y: integer;
        color: GraphABC.Color;
        
        procedure Draw(); abstract;
    end;

    Square = class(Shape)        
        x1, y1: integer;
        
        constructor Create(x, y, x1, y1: integer; color: GraphABC.Color := GraphABC.Color.Black);
        begin
            self.x := x;
            self.x1 := x1;
            self.y := y;
            self.y1 := y1;
            self.color := color;
        end;
        
        procedure Draw(); override;
        begin
            brush.Color := color;
            GraphABC.Rectangle(x, y, x1, y1);
            
            brush.Color := GraphABC.Color.Transparent;
        end;
    end;
    
function ChooseColor(color_name: string): GraphABC.Color;
begin
    case color_name of
        'красный': result := GraphABC.Color.Red;
    end;
end;
        
function ChooseFigure(figure_type: string; color: GraphABC.Color): Shape;
begin
    case figure_type of
        'квадрат': result := new Square(100, 100, 200, 200, color);
    end;
end;
    
begin
    writeLn('Напишите цвет:');
    var color_name := ReadString();
    var color := ChooseColor(color_name);
    
    writeLn('Выберите фигуру:');
    var figure_type := ReadString();
    var figure := ChooseFigure(figure_type, color);
    
    figure.Draw();
end.

Спасибо. Это должно выглядиь так?

type
    Shape = auto class
        x, y: integer;
        color: GraphABC.Color;
    end;

    Square = class(Shape)        
        x1, y1: integer;
        
        constructor Create(x, y, x1, y1: integer; color: GraphABC.Color);
        begin
            self.x := x;
            self.x1 := x1;
            self.y := y;
            self.y1 := y1;
            self.color := color;
        end;
        
        procedure Draw();
        begin
            brush.Color := color;
            GraphABC.Rectangle(x, y, x1, y1);
            
            brush.Color := GraphABC.Color.Transparent;
        end;
    end;
Square = class(Shape)        
        x1, y1: integer;
        
        constructor Create(x, y, x1, y1: integer; color: GraphABC.Color := GraphABC.Color.Black);
        begin
            self.x := x;
            self.x1 := x1;
            self.y := y;
            self.y1 := y1;
            self.color := color;
        end;
        
        procedure Draw(); override;
        begin
            brush.Color := color;
            GraphABC.Rectangle(x, y, x1, y1);
            
            brush.Color := GraphABC.Color.Transparent;
        end;
    end;
    
function ChooseColor(color_name: string): GraphABC.Color;
begin
    case color_name of
        'красный': result := GraphABC.Color.Red;
    end;
end;
        
function ChooseFigure(figure_type: string; color: GraphABC.Color): Shape;
begin
    case figure_type of
        'квадрат': result := new Square(100, 100, 200, 200, color);
    end;
end;
    
begin
    writeLn('Напишите цвет:');
    var color_name := ReadString();
    var color := ChooseColor(color_name);
    
    writeLn('Выберите фигуру:');
    var figure_type := ReadString();
    var figure := ChooseFigure(figure_type, color);
    
    figure.Draw();
end.

все огромное спасибо, теперь думаю я смогу и сам добавить еще две фигуры, и цвет к ним. Спасибо. А я правильно понял, что фигура только квадрат в программе а цвет только красный, им не нужно добавить следующие строки ’красный’: result := GraphABC.Color.Red; тоже самое только менять синий и всесто ред блу? и еще, что бы задать размер квадрата самостоятельно я должен написать следующее ? Rectangle(WindowWidth div 2-j div 2,WindowHeight div 2-j div 2,WindowWidth div 2+j div 2,WindowHeight div 2+ j div 2);

Во с цветами разобрался, а вот как добавить еще две фигуры не очень. вот что получилось с цветом, это было легко и очевидно.

 'красный': result := GraphABC.Color.Red;
        'оранжевый': result := GraphABC.Color.Orange;
        'желтый': result := GraphABC.Color.Yellow;
        'зеленый': result := GraphABC.Color.Green;
        'голубой': result := GraphABC.Color.LightCyan;
        'синий': result := GraphABC.Color.Blue;
        'фиолетовый': result := GraphABC.Color.Magenta;
        

А вот с фигурой не очень, треугольник это точно сложно для меня добавить, а круг попытаться можно.

type
    Shape = auto class
        q, w: integer; // расположение круга.
        color: GraphABC.Color;
        
        procedure Draw(); abstract;
    end;

    Square = class(Shape)        
        e: integer; // дааметр круга
        
        constructor Create(q, w, e: integer; color: GraphABC.Color := GraphABC.Color.Black);
        begin
            self.q := q;
            self.w := w;
            self.e:= e;
            self.color := color;
        end;
        
        procedure Draw(); override;
        begin
            brush.Color := color;
            GraphABC.Rectangle(q, w, e);
            
            brush.Color := GraphABC.Color.Transparent;
        end;
        function ChooseFigure(figure_type: string; color: GraphABC.Color): Shape;
begin
    case figure_type of
        'квадрат': result := new Square(100, 100, 200, 200, color);
        'круг': result := new Circle(500,200,100, color);
    end;
end;

Но что-то я все таки не понимаю как его туда добавить. Как в меню что бы был понимаю, а как в самой программе нет

кажется понял как добавить прямоугольник

'прямоугольник': result := new Square(200,100,300,300);

круг собственно так-же добавляется да? только нужно новый конструктор создать, с тремя переменными?

я понял как сделать круг, у меня получилось,но как сделать так что бы был и круг и квадрат и теугольник не получается я добавил новую строчку

constructor Create(x, y, x1: integer; color: GraphABC.Color := GraphABC.Color.Black);

и эту

  GraphABC.Circle(x, y, x1);
  • в case добавил, что бы выводилось. Но выдает ошибку Предописание функции без описания или тут все таки надо новый класс как-то объявить?

http://pastebin.com/HKMZKugD

Большое спасибо, теперь все стало ясно как добавлять новый конструктор

Все таки это оказалось сложнее чем я думал. Не понимаю немного, смотрите. Треугольник состоит из 3 линей, значит нам нужно 6 переменных x1 x2 x3 y1 y2 y3

Line = class(Shape)
        q1,w1: integer;
       
        constructor Create(x1, x2, x3, y1, y2, y3: integer; color: GraphABC.Color);
        begin
            self.x1= x1;
            self.x2 := x2;
            self.x3= x3;
            self.y1 := y1;
            self.y2= y2;
            self.y3 := y3;
            self.color := color;
        end;
       
        procedure Draw(); override;
        begin
            brush.Color := color;
            GraphABC.Line(x1, x2, x3, y1, y2, y3);
           
            brush.Color := GraphABC.Color.Transparent;
        end;
    end;

и сотвественно в case

'треугольник': result := new LIne (x1, y1, x2, y2, x3, y3, color);

все разобрался. Спасибо

Хотя нет так и не понял, все равно когда 6 значений идет (Нет перегруженной подпрограммы с таким количеством параметров)

я и ‘Triangle’ ввожу как класс, а абс нет его не видет. Ведь как то можно сделать треугольник проще,.

http://pastebin.com/cUcPxEwT

Вообще вы бы почитали лучше что. А то для вас это магия какая-то получается.

Огромное спасибо. Очень сильно помогли.

Я правильно понял, если мне нужно что бы код возвращался после рисования фигуры обратно к меню выбора. надо добавить переменную в начало кода

uses
    GraphABC;
    var l:char;

и добавлять

repeat
   else exit;
   end;  
  until not (w in ['1','2']);

в каждый case или как то можно проще сделать?