Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249

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

08.03.2015, 20:23. Показов 1956. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализовать движение фигур статическими методами

Фигуры типа
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
TTriangle = object (TLineSegment)
  private
    x3, y3: integer;
  public
    constructor Init;
    procedure Draw;
    procedure Erase;
    function getX3: integer;
    function getY3: integer;
    procedure setX3(newX: integer);
    procedure setY3(newY: integer);
  end;
И вот в этом надо умудриться использовать статические методы. Это возможно реализовать как-то попрямее?.. Мне пока приходит на ум только получать координаты с помощью get, менять с помощью этого статического метода, и устанавливать с помощью set... Но это так криво... Посоветуйте пожалуйста как попрямее
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.03.2015, 20:23
Ответы с готовыми решениями:

Реализовать движение фигур
Вот такие фигуры должны быть Круг у меня не закрашивается. Поставить его самым правым не получается ибо тогда движение в ряду...

Реализовать движение фигур
Всем привет. В C# новичок, так что не судите строго. Необходимо реализовать следующее: нарисовать фигуру следующего вида: ...

Реализовать движение фигур
Всем привет. Помогите плиз. Есть код на C# в котором рисуется фигура квадрата в звезде. Подскажите пожалуйста как из ниже...

13
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
08.03.2015, 21:09
Лучший ответ Сообщение было отмечено MayaNash как решение

Решение

Точно ли речь про статические методы класса?
http://www.freepascal.org/docs... fsu32.html
Скорее всего речь просто про невиртуальные методы.
На задание лабораторной работы №3 можно где-то глянуть?
1
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
08.03.2015, 21:12  [ТС]
Хм, точно, речь про невиртуальные методы
Как запутали
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
08.03.2015, 21:51
Возможно, речь про серию лабораторных, где от работы к работе показываются недостатки и достоинства того или иного подхода. При невиртуальных методах выбор типа переменной приходится делать собственным кодом, точнее вызываемый метод полностью зависит от типа переменной (или выражения с приведением типа) во время компиляции.

Добавлено через 10 минут
Pascal
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
TTriangle = object (TLineSegment)
  private
    x3, y3: integer;
  public
    constructor Init;
    procedure Draw;
    procedure Erase;
    procedure MoveBy(dx,dy: Integer);
  end;
 
procedure TTriangle.Draw;
begin
  SetColor(color);
  MoveTo(x3,y3); LineTo(x1,y1); LineTo(x2,y2); LineTo(x3,y3); 
end;
 
procedure TTriangle.Erase;
var
  OldColor: Word;
begin
  OldColor:=Color;
  Color:=GetBkColor;
  Draw;
  Color:=OldColor;
end;
 
procedure TTriangle.MoveBy(dx,dy: Integer);
begin
  Erase;
  Inc(x1,dx); Inc(x2,dx); Inc(x3,dx);
  Inc(y1,dy); Inc(y2,dy); Inc(y3,dy);
  Draw;
end;
Если бы метод Draw был виртуальным, Erase и Move не пришлось бы переписывать для каждого объекта в иерархии.
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
08.03.2015, 21:57  [ТС]
Ага Это вот было очень неудобно
Еще один вопрос, если вам не сложно: можно ли в паскале объявить массив указателей на родительский класс, выделить область памяти для объекта дочернего класса, и запомнить этот адрес в элементе этого массива? Будет ли такое нормально работать? И как это сделать с помощью new?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
08.03.2015, 22:12
Объявить можно, выделить можно. Работать нормально без виртуальных методов не будет, если не делать специально приседаний.
Как пример,
Pascal
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
type
  TShapes=(shPoint, shLine, shTriangle);
  PPoint=^TPoint;
  TPoint=object
    Shape: TShapes;
    constructor Init(AX,AY: Integer);
    ...
  end;
 
constructor TPoint.Init;
begin
  Shape:=shPoint;
  ...
end;
 
var
  s: array [1..9] of PPoint;
  i: Integer;
begin
  for i:=1 to 3 do s[i]:=New(PPoint,Init(...));
  for i:=4 to 6 do s[i]:=New(PLine,Init(...));
  for i:=7 to 9 do s[i]:=New(PTriangle,Init(...));
 
  for i:=1 to 9 do
    case s[i].Shape of
    shPoint:    s[i]^.Draw;
    shLine:     PLine(s[i])^.Draw;
    shTriangle: PTriangle(s[i])^.Draw;
    end;
...
end.
1
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
08.03.2015, 22:19  [ТС]
В смысле с виртуальными, извиняюсь
Значит можно написать
Pascal
1
2
3
4
5
var
  a: array [1..6] of ^TPoint;
...
a[1] := new(TPoint, Init);
a[2] := new(TCircle, Init);
и будет нормально, это хорошо, спасибо

Добавлено через 4 минуты
Нет, не получается... Говорит что pointer type expected, but got "TPoint"
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
08.03.2015, 22:22
Правда с отдельным типом пример выйдет совсем нерасширяемым, уж лучше тогда
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
const
  shPoint=1;
  shLine=2;
  shTriangle=3;
type
  TPoint=object
    Shape: Integer;
...
constructor TPoint.Init;  
begin
  Shape:=shPoint;
...
Но все это имеет смысл только для того, чтобы показать, как делать не надо...

Добавлено через 1 минуту
a1:=New(PPoint,Init(aX,aY,aColor: Integer));
...
Первым аргументом New() -- указатель, не object. С классами проходит, поскольку class -- уже указатель.
1
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
08.03.2015, 22:26  [ТС]
А, опять это ограничение с предопределением даже таких типов...
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
08.03.2015, 22:58  [ТС]
Снова что-то виртуальное не работает
Сделала вот так, функции move, erase и draw виртуальные во всех классах
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
a[1] := new(pPoint, Init);
  a[2] := new(pCircle, Init);
  a[3] := new(pEllipse, Init);
  a[4] := new(pLineSegment, Init);
  a[5] := new(pTriangle, Init);
  a[6] := new(pRectangle, Init);
  old[1] := new(pPoint, Init);
  old[2] := new(pCircle, Init);
  old[3] := new(pEllipse, Init);
  old[4] := new(pLineSegment, Init);
  old[5] := new(pTriangle, Init);
  old[6] := new(pRectangle, Init);
...
      2: begin
           cycle := true;
           while cycle do
           begin
             old[choice]^ := a[choice]^;
             cycle := a[choice]^.Move;
             old[choice]^.Erase;
             a[choice]^.Draw;
           end;
         end;
Прикрепила полный вариант кода
Вложения
Тип файла: rar i386-win32.rar (2.1 Кб, 4 просмотров)
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
09.03.2015, 00:26
Керра,
не успел ваш пример разглядеть как следует (который удалили уже), но из того, что запомнилось, сделать можно было так:
Pascal
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
uses Graph, Crt;
 
type
  PShape=^TShape;
  TShape=object
  protected
    x, y: Integer;
    color: Word;
  public
    constructor Init(aX, aY: Integer; aColor: Word);
    destructor  Done; virtual;
    procedure Draw; virtual; abstract;
    procedure MoveBy(adx, ady: Integer);
    procedure DrawColor(aColor: Word);
    procedure Erase;
  end;
  
  PPoint=^TPoint;
  TPoint=object(TShape)
    constructor Init(aX, aY: Integer; aColor: Word);
    procedure Draw; virtual;
  end;
  
  PLine=^TLine;
  TLine=object(TShape)
  protected
    dx, dy: Integer;
  public
    constructor Init(aX1, aY1, aX2, aY2: Integer; aColor: Word);
    procedure Draw; virtual;
  end;
 
  PTriangle=^TTriangle;
  TTriangle=object(TShape)
  protected
    dx2, dy2, dx3, dy3: Integer;
  public
    constructor Init(aX1, aY1, aX2, aY2, aX3, aY3: Integer; aColor: Word);
    procedure Draw; virtual;
  end;
 
constructor TShape.Init(aX, aY: Integer; aColor: Word);
begin
  x:=aX; y:=aY; color:=aColor;
end;
 
destructor  TShape.Done;
begin end;
 
procedure TShape.MoveBy(adx, ady: Integer);
begin
  Erase;
  Inc(x,adx); Inc(y,ady);
  Draw;
end;
 
procedure TShape.DrawColor(aColor: Word);
var
  OldColor: Word;
begin
  OldColor:=color;
  color:=aColor;
  Draw;
  color:=OldColor;
end;
 
procedure TShape.Erase;
begin
  DrawColor(GetBkColor());
end;
 
constructor TPoint.Init(aX, aY: Integer; aColor: Word);
begin
  inherited Init(aX,aY,aColor);
end;
 
procedure TPoint.Draw;
begin
  PutPixel(x,y,color);
end;
 
constructor TLine.Init(aX1, aY1, aX2, aY2: Integer; aColor: Word);
begin
  inherited Init(aX1, aY1, aColor);
  dx:=aX2-aX1;
  dy:=aY2-aY1;
end;
 
procedure TLine.Draw;
begin
  SetColor(color);
  MoveTo(x,y); LineRel(dx,dy);
end;
 
constructor TTriangle.Init(aX1, aY1, aX2, aY2, aX3, aY3: Integer; aColor: Word);
begin
  inherited Init(aX1,aY1,aColor);
  dx2:=aX2-aX1; dy2:=aY2-aY1;
  dx3:=aX3-aX1; dy3:=aY2-aY1;
end;
 
procedure TTriangle.Draw;
begin
  SetColor(color);
  MoveTo(x,y); LineTo(x+dx2,y+dy2); LineTo(x+dx3,y+dy3); LineTo(x,y);
end;
 
var
  s: array [1..10] of PShape;
  i: Integer;
begin
  {...}
  for i:=Low(s) to High(s) do
    case Random(3) of
    0:
      s[i]:=New(PPoint,Init(
        Random(GetMaxX),Random(GetMaxY),
        Random(GetMaxColor)+1));
    1:
      s[i]:=New(PLine,Init(
        Random(GetMaxX),Random(GetMaxY),
        Random(GetMaxX),Random(GetMaxY),
        Random(GetMaxColor)+1));
    2:
      s[i]:=New(PTriangle,Init(
        Random(GetMaxX),Random(GetMaxY),
        Random(GetMaxX),Random(GetMaxY),
        Random(GetMaxX),Random(GetMaxY),
        Random(GetMaxColor)+1));
    end;
  for i:=Low(s) to High(s) do s[i]^.Draw;
  for i:=Low(s) to High(s) do s[i]^.MoveBy(10,0);
  for i:=Low(s) to High(s) do s[i]^.MoveBy(0,-10);
  for i:=Low(s) to High(s) do begin
    s[i]^.Erase;
    Dispose(s[i],Done);
  end;
  {...}
end.
Добавлено через 12 минут
Вся общая логика вынесена в базовый TShape, дочерним классам оставлена только инициализация и отрисовка себя. Причем отрисовка сделана относительно базовой точки x,y, поэтому для перемещения достаточно стереть примитив (отрисовать цветом фона), изменить только x,y и отрисовать примитив. А что самое главное -- можно сделать это в базовом классе.
1
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
09.03.2015, 09:12  [ТС]
bormant, так и делаю, вероятно проблема в этом: old[choice]^ := a[choice]^;
Вынесла в отдельную тему Не работает функция в копии при копировании объекта
Извиняюсь за удаление, попросила удалить на всякий случай, т.к. это заказ, если препод вдруг будет проверять, чтоб не нашел... Задание надо подкорректировать тоже...
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
09.03.2015, 11:53
Возвращаясь к заданию (невиртуальным методам), примеру реализации, скорее всего имелось в виду что-то вроде:
Pascal
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
var
  o1: TPoint;
  o2: TCircle;
  o3: TEllipse;
  o4: TLineSegment;
  o5: TTriangle;
  o6: TRectangle;
begin
...
  o1.Init; o1.Draw;
  o2.Init; o2.Draw;
  o3.Init; o3.Draw;
  o4.Init; o4.Draw;
  o5.Init; o5.Draw;
  o6.Init; o6.Draw;
...
  case choice of
  1: o1.Move;
  2: o2.Move;
  3: o3.Move;
  4: o4.Move;
  5: o5.Move;
  6: o6.Move;
  end;
...
1
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
09.03.2015, 11:55  [ТС]
bormant, да, примерно так и сделала
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2015, 11:55
Помогаю со студенческими работами здесь

Реализовать движение разных фигур по разным траекториям
Нужно сделать движение разных фигур по разной траектории...т.е. выбрал фигуру..какой-то квадратик или кружок и выбрал для него...

Класс со статическими методами или функции
Описание: есть множество мелких функций в файлах разбитых по классу/типу. Зависимости бывают только в пределах 1 файла. Все кешируется в...

Дан класс, преобразуйте его в статический класс со статическими методами и продемонстрируйте работу с ним
Дан класс, преобразуйте его в статический класс со статическими методами и продемонстрируйте работу с ним.

Разработать интерфейс, используемый для обработки геометрических фигур, с методами
Создайте программу, в которую входят: 1. Интерфейс, используемый для обработки геометрических фигур, с методами – а)метод ...

Движение фигур в C++
Нарисовать пульсирующий зеленый круг, увеличивающийся и уменьшающийся, программа завершается нажатием любой клавиши. Рисование фигуры...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru