Построить дом в паскале

Работа с графикой в PascalABC

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

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

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

Подключение осуществляется в разделе описаний.
Формат подключения модуля GraphABC:Uses GraphABC;

Графический экран PascalABC (по умолчанию) содержит 640 точек по горизонтали и 400 точек по вертикали. Начало отсчета – левый верхний угол экрана. Ось x направлена вправо, а ось y –вниз. Координаты исчисляются в пикселях.

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

Управление графическим окном

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

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

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

Подключение осуществляется в разделе описаний.
Формат подключения модуля GraphABC:Uses GraphABC;

Графический экран PascalABC (по умолчанию) содержит 640 точек по горизонтали и 400 точек по вертикали. Начало отсчета – левый верхний угол экрана. Ось x направлена вправо, а ось y –вниз. Координаты исчисляются в пикселях.

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

Процедуры рисования графических примитивов

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

Процедуры для работы с текстом

Цвета в PascalABC

Пример графической программы, рисующей изображение дома:

Program Domik;
uses Graphabc; //подключение модуля GraphABC
begin
SetWindowWidth(800); //ширина окна программы
SetWindowHeight(600); //высота окна программы
SetPenWidth(3); //толщина пера
SetFontSize(18); //размер шрифта
SetFontColor(clRed); //цвет шрифта
SetFontStyle(fsBold); //жирный стиль шрифта
TextOut(100,100,’Домик’); //текст
Rectangle(200, 300, 600,600); //дом
Circle(400,225, 40); //круг
SetBrushColor(clAqua); //цвет заливки окна
FillRect(300, 400,500,500); //процедура заливки окна
rectangle(300,400,500,500); //окно
Line(400,400,400,500); // окно
Line(300,450,500,450); //окно
Line(200,300,400,150); //крыша
Line(400,150,600,300); //крыша
Line(480,210,480,160); //труба
Line(480,160,520,160); //труба
Line(520,160,520,240); //труба
end.

Рисунок в PascalABC

Программа, рисующая фигурку:

Program Figurka;
uses GraphABC;
begin
SetWindowSize(500, 500); //задаем размер графического окна
SetPenWidth(3); //устанавливаем стиль пера
SetBrushColor(clFuchsia); //устанавливаем цвет кисти
Circle(225,160,50); //рисуем окружность
Line(225,160,225,180); //рисуем линии
Line( 210,190,240,190);
Line( 225,210,225,250);
Line( 100,100,200,260);
Line( 200,260,400,260);
Line( 210,350,200,480);
Line(240,350,250,480);
Rectangle(200,230,250,350); //рисуем прямоугольник SetBrushColor(clLime);
FillRect(0, 480,500,500); //рисуем закрашенный прямоугольник
SetBrushColor(clWhite);
Circle(205,150,10);
Circle(245,150,10);
end.

Практическая работа за компьютером

Задание 1. Определите координаты и составьте программу, выводящую на экран рисунок  дома и дерева.

Программа будет иметь вид:

Program domik_2;
uses GraphABC;
var i: integer;
st:string;
begin
SetWindowSize(500, 500);
{Коричневая стена}
SetPenWidth(2);
SetBrushColor(clBrown);
FillRect(100,50,150,100);
{Крыша желтого цвета}
SetPenColor(clBrown);
Line(125,25,80,75);
Line(125,25,170,75);
FloodFill(125, 30,clYellow);
{Крона дерева}
SetPenColor(clGreen);
SetBrushColor(clGreen);
Ellipse(100,150,150,200);
{ствол дерева}
SetBrushColor(clBrown);
FillRect(120,200,130,230);
end.

Задание 2. Используя оператор цикла и введя переменную для пересчета координат по оси  x, постройте “поселок”, состоящий из 5 домов. Внесите соответствующие дополнения и изменения в предыдущую программу.

Весь наш «поселок» выстроился вдоль горизонтальной оси экрана — оси X. Построение рисунка начинается с левого верхнего угла стены первого дома — точки с координатами (100, 50). Координата Y не изменяется. Чтобы начать рисовать второй домик, нужно координату X увеличить на 150 (50 точек — ширина первого дома и 100 точек — расстояние между домиками).

Выберем в качестве параметра цикла целочисленную переменную X.
Для всех элементов нашего рисунка абсолютное значение координаты X заменим на относительное. Например, для стены дома процедура для рисования запишется следующим образом:

FillRect(x,50,x+50,100);

Сформулируем условие выполнения цыклических действий для нашей задачи.Какие координаты имеет левый верхний угол пятого дома? Конечное значение выбранного нами параметра цикла x = 700. Тогда условие выполнения цикла записывается так: x<=700.

Словесное описание алгоритма коротко можно записать так:

Переменной цикла x присвоить начальное значение 100. Пока x<=700 выполнять серию действий «Нарисуй дом и дерево», после каждого фрагмента рисунка увеличивать значение переменной цикла  на 150.

Программа будет иметь вид:

Program Domik;
uses GraphABC;
var i: integer;
st:string;
x:integer;
begin
SetWindowSize(800, 500);
x:=100;
While x<=700 do
begin
{Коричневая стена}
SetPenWidth(2);
SetBrushColor(clBrown);
FillRect(x,50,x+50,100);

{Крыша желтого цвета}
SetPenColor(clBrown);
Line(x+25,25,x-20,75);
Line(x+25,25,x+70,75);
FloodFill(x+25, 30,clYellow);
{Крона дерева}
SetPenColor(clGreen);
SetBrushColor(clGreen);
Ellipse(x,150,x+50,200);

{ствол дерева}
SetBrushColor(clBrown);
FillRect(x+20,200,x+30,230);
x:=x+150;
end;
end.

Источник

Обучение работе в «Паскаль»

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

Что научиться программировать надо сначала скачать саму программу в которую вводить код. Скачать ее можно нажав вот СЮДА.

Скриншот с сайта https://pascalabc.net

Далее нажимаем кнопку скачать

Важно знать, что данная программа адаптирована ТОЛЬКО под операционную систему «Windows», и работает программа только на ней

Вас перекидывает на следующую страницу:

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

После окончания загрузки у вас остается файл в формате .exe, его открываем и устанавливаем как обычную программу.

Далее на рабочем столе у вас появляется иконка «Паскаля»:

Обрезанный скриншот ‘Windows 7″

Открываем ярлык «Паскаль» и видим это:

Скриншот программы

Скриншот программы

Что же мы на нем видим:

  1. Строка ввода программы — сюда мы будем писать код
  2. Строка ввода данных — сюда будем вводить переменные данные
  3. Панель управления — проверка программы на ошибки, запуск программы…

Как же строится основа программы (это то, без чего программа не будет работать, это неизменная часть кода):

Program (название программы на латинском без скобочек);

В конце каждой строки обязательно должна быть «;»

Далее:

Var a, b, c : integer;

Var — ввод в программу буквенных переменных, далее перечисляются все буквы через запятую.

После через двоеточие пишем integer если у нас будут целые показатели (или если у нас простейшая программа на сложение вычитание челых чисел)

Или пишем real если у нас будут десятичные дроби ( или же программа где будет присутствовать деление).

И пишем Begin без точки с запятой в конце

(тут будет сама программа)

А в конце пишем End. Точка в конце обязательна на этой строке.

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

Обрезанный скриншот

Давайте разберем пример программы на обычной школьной задаче из учебника математики:

«Найдите площадь и периметр прямоугольника по двум сторонам — 2 и 3»

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

1) S=a*b (формула площади)

2) P=2*(a+b) (формула периметра)

В «Паскале» есть всего 6 математических знаков:

1) сумма +

2) разность —

3) умножение *

4) деление /

5) скобки ()

6) присваивание значения переменной :=

Значит и формулы в «Паскале» будут выглядеть так же.

С формулами разобрались, а как занести данные размеров сторон в программу для дальнейших подсчетов? очень просто, командой:

readln (a);

Вместо «a» может стоять любая буквенная переменная заданная вначале. Значит программа для этой задачи будет выглядеть вот таким образом:

Скриншот из программы

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

writeln (‘текст’);

Скриншот из программы

Простейшая программа составлена! Надо проверить работает ли она, для этого нажимаем на эту кнопку на панели:

Скриншот из программы

Читайте также:  Из чего лучше построить деревянный дом для постоянного проживания

После нажатия, наша программа немного меняет вид:

Скриншот из программы

Это нормально, значит что ваша программа работает!

Теперь перейдем в окно вывода, для этого нажмем на кнопку «Старт»:

Скриншот из программы

После этого у нас начинает мигать курсор в окне вывода:

Скриншот из программы

Вводим первое число ( 2 ), наживаем Enter, вводим второе число ( 3 ), нажимаем Enter. В окне вывода выходит это:

Скриншот из программы

Наша простейшая программа работает отлично! И конечно мы сейчас ее приукрасим:

Скриншот из программы

И соответсвенно вывод тоже изменился:

Скриншот из программы

Спасибо что дочитали эту статью до конца, надеюсь вы научились базовому программированию в Паскале. До скорых встреч!

Источник

Нарисовать дом — 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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
uses Graph, CRT;
 
var
  Gd, Gm : Integer;
 
type
  XY = record
    X : Integer;
    Y : Integer;
  end;
 
procedure LineXY(A, B : XY);
begin
   Line(A.X, A.Y, B.X, B.Y);
end;
 
procedure AddXY(A, B : XY; var Res : XY);
begin
  Res.X := A.X + B.X;
  Res.Y := A.Y + B.Y;
end;
 
procedure SubXY(A, B : XY; var Res : XY);
begin
  Res.X := A.X — B.X;
  Res.Y := A.Y — B.Y;
end;
 
procedure MulXY(A : XY; L : Integer; var Res : XY);
begin
  Res.X := A.X * L;
  Res.Y := A.Y * L;
end;
 
procedure CopyXY(A : XY; var Res : XY);
begin
  Res.X := A.X;
  Res.Y := A.Y;
end;
 
procedure DrawRect(Origin, Dir1, Dir2 : XY;
    X1, Y1, X2, Y2 : Integer; Fill, Draw : Boolean);
var
  a, b, c, d, e, f, g : XY;
  Points :  array[1 .. 5] of XY;
begin
  MulXY(Dir1, X1, a);
  MulXY(Dir1, X2, b);
  MulXY(Dir2, Y1, c);
  MulXY(Dir2, Y2, d);
  AddXY(Origin, a, e);
  AddXY(e, c, Points[1]);
  AddXY(e, d, Points[2]);
  AddXY(Origin, b, f);
  AddXY(f, d, Points[3]);
  AddXY(f, c, Points[4]);
  CopyXY(Points[1], Points[5]);
  if Fill then
    FillPoly(5, Points);
  if Draw then
    DrawPoly(5, Points);
end;
 
procedure DrawWall(Origin, Dir1, Dir2 : XY;
    L1, L2 : Integer; Oddity : Boolean);
{ Рисует кирпичную стену }
var
  i, j : Integer;
  a, b, c, d, e : XY;
  Poly : array[1 .. 5] of XY;
begin
  { Внешний контур }
  CopyXY(Origin, Poly[1]);
  MulXY(Dir1, L1, c);
  MulXY(Dir2, L2, d);
  AddXY(c, d, e);
  AddXY(Origin, c, Poly[2]);
  AddXY(Origin, e, Poly[3]);
  AddXY(Origin, d, Poly[4]);
  CopyXY(Origin, Poly[5]);
  FillPoly(5, Poly);
  DrawPoly(5, Poly);
  { Кирпичи }
  for i := 1 to L2 — 1 do
  begin
    { Line(Origin + Dir2 * i,
           Origin + Dir2 * i + Dir1 * L1) }
    MulXY(Dir2, i, a);
    AddXY(Origin, a, b);
    AddXY(b, c, d);
    LineXY(b, d);
  end;
  for i := 1 to L2 do
  begin
    MulXY(Dir2, i — 1, a);
    AddXY(Origin, a, b);
    MulXY(Dir2, i, a);
    AddXY(Origin, a, c);
    for j := 1 to L1 — 1 do
    begin
      if ((i mod 2) = 1) xor ((j mod 2) = 1) xor Oddity then
      begin
        { Line(Origin + Dir2 * (i — 1) + Dir1 * j,
               Origin + Dir2 * i       + Dir1 * j) }
        MulXY(Dir1, j, a);
        AddXY(b, a, d);
        AddXY(c, a, e);
        LineXY(d, e);
      end;
    end;
  end;
end;
 
type XYC = record
    X, Y, C : LongInt; { проективные координаты }
  end;
 
procedure XY2XYC(A : XY; var Res : XYC);
begin
  Res.X := A.X;
  Res.Y := A.Y;
  Res.C := 1;
end;
 
procedure XYC2XY(A : XYC; var Res : XY);
var
  ResX, ResY : LongInt;
begin
  ResX := A.X div A.C;
  ResY := A.Y div A.C;
  Res.X := ResX;
  Res.Y := ResY;
end;
 
procedure IncidXYC(A, B : XYC; var Res : XYC);
begin
  Res.X :=  A.Y * B.C — A.C * B.Y;
  Res.Y := -A.C * B.X + A.X * B.C;
  Res.C :=  A.X * B.Y — A.Y * B.X;
end;
 
procedure Intersect(a1, a2, b1, b2 : XY; var Res : XY);
{ Точка пересечения линий a1a2 и b1b2 }
var pa1, pa2, pb1, pb2, { проективные координаты точек a1, a2, b1 и b2 }
    pal, pbl, { проективные координаты линий a1a2 и b1b2 }
    pRes : XYC; { проективные координаты точки пересечения }
begin
  XY2XYC(a1, pa1); XY2XYC(a2, pa2); XY2XYC(b1, pb1); XY2XYC(b2, pb2);
  IncidXYC(pa1, pa2, pal);
  IncidXYC(pb1, pb2, pbl);
  IncidXYC(pal, pbl, pRes);
  XYC2XY(pRes, Res);
end;
 
procedure Cloud(X, Y : Integer);
const CloudImage : array[1 .. 7] of String =
(‘        .  .    .    .             ‘,
 ‘     .    .   .   .     .  .       ‘,
 ‘   .  .  .   .      .  .  .  .     ‘,
 ‘  .   . .  .  .  .    .   .   .  . ‘,
 ‘   .  .   .  .  .  . .  .   .  .   ‘,
 ‘     .   .   . . .  .    . .       ‘,
 ‘                                   ‘);
var
  i, j : Integer;
begin
  for i := 1 to 7 do
    for j := 1 to Length(CloudImage[1]) do
      if CloudImage[i, j] = ‘.’ then
        PutPixel(X + j — 1, Y + i — 1, LightGray);
end;
 
var
  a, b, c, d, e, f, g, h, i, j, k, l, m, n, o,
  p, q, r, s, t, u, v, w, x, y, z, a0, b0, c0 : XY;
  Roof : array[1 .. 5] of XY;
  Roof2 : array[1 .. 4] of XY;
  Shadow : array[1 .. 9] of XY;
begin
  Gd := VGA;
  Gm := VGAHi; { 640×480 }
  InitGraph(Gd, Gm, ‘X:BP’);
 
  { Небо }
  SetFillStyle(SolidFill, LightCyan);
  Bar(0, 0, 639, 479);
 
  { Облака }
  Cloud( 89,  91); Cloud( 90,  82); Cloud( 11,  91); Cloud( 72,  98);
  Cloud( 52,  27); Cloud( 42,  77); Cloud( 98,  58); Cloud( 48,  12);
  Cloud( 67,  62); Cloud(167,  34); Cloud( 62,  73); Cloud(363,  54);
  Cloud(122,  46); Cloud( 40,  46); Cloud( 27,  26); Cloud( 49,  23);
 
  { Трава }
  SetFillStyle(SolidFill, LightGreen);
  FillEllipse(320, 380, 500, 200);
 
  { Кирпичные стены }
  SetLineStyle(SolidLn, 0, NormWidth);
  SetColor(Black);
  SetFillStyle(SolidFill, Brown);
 
 
  a.X := 200;
  a.Y := 150;
  b.X := 10;
  b.Y := 0;
  c.X := 0;
  c.Y := 10;
  DrawWall(a, b, c, 20, 20, False);
  MulXY(b, 20, d);
  AddXY(a, d, e);
  f.X := 5;
  f.Y := -5;
  DrawWall(e, f, c, 20, 20, True);
 
  { Крыша }
  MulXY(b, 4, g);
  SubXY(a, g, h);
  MulXY(f, 4, i);
  SubXY(h, i, Roof[1]);
  AddXY(e, g, j);
  SubXY(j, i, Roof[2]);
  CopyXY(Roof[2], Roof2[1]);
  MulXY(f, 20 + 4, k);
  AddXY(e, k, l);
  AddXY(l, g, Roof2[2]);
  MulXY(f, 10, m);
  AddXY(a, m, n);
  MulXY(c, 9, o);
  SubXY(n, o, p);
  MulXY(b, 10 — 4, q);
  AddXY(p, q, Roof[4]);
  MulXY(b, 10 + 4, r);
  AddXY(p, r, Roof[3]);
  CopyXY(Roof[3], Roof2[3]);
 
  CopyXY(Roof[1], Roof[5]);
  CopyXY(Roof2[1], Roof2[4]);
 
  SetFillStyle(SolidFill, LightGray);
  FillPoly(5, Roof);
  DrawPoly(5, Roof);
  SetFillStyle(SolidFill, DarkGray);
  FillPoly(4, Roof2);
  DrawPoly(4, Roof2);
 
  { Тень }
  s.X := 8;
  s.Y := 3;
  MulXY(c, 20, t);
  MulXY(s, 20, u);
  AddXY(t, u, v);
  AddXY(a, t, Shadow[1]);
  AddXY(a, v, w);
  AddXY(Roof[1], v, Shadow[3]);
  MulXY(f, 20 + 4 + 4, x);
  AddXY(Shadow[3], x, y);
  Intersect(Shadow[1], w, Shadow[3], y, Shadow[2]);
  AddXY(Roof[2], v, Shadow[4]);
  AddXY(Roof2[2], v, Shadow[5]);
  AddXY(e, t, Shadow[8]);
  MulXY(f, 20, z);
  AddXY(Shadow[8], z, Shadow[7]);
  SubXY(Shadow[7], u, a0);
  Intersect(Shadow[5], y, Shadow[7], a0, Shadow[6]);
  CopyXY(Shadow[1], Shadow[9]);
 
  SetFillStyle(SolidFill, Green);
  FillPoly(9, Shadow);
 
  { Дверь }
 
  SetFillStyle(SolidFill, Red);
  DrawRect(e, f, c, 7, 8, 13, 20, True, True);
 
  { Окно }
  SetColor(White);
  SetFillStyle(SolidFill, Blue);
  DrawRect(a, b, c, 6, 6, 14, 14, True, True);
  DrawRect(a, b, c, 10, 6, 14, 14, True, True);
  DrawRect(a, b, c, 10, 6, 14, 9, True, True);
 
  { Табличка }
  SetColor(Blue);
  SetFillStyle(SolidFill, White);
  DrawRect(a, b, c, 1, 2, 19, 5, True, True);
 
  SetTextStyle(5, HorizDir, 1);
  OutTextXY(a.X + b.X * 1 + c.X * 1 + 3, a.Y + b.Y * 2 + c.Y * 2,
    ‘Дом-2: Перестройка’);
 
  while not KeyPressed do
    Delay(200);
 
  CloseGraph;
end.
Читайте также:  Яндекс как построить дом

Источник

Решение: Нарисовать дом — Pascal ✔

uses Graph, CRT;
 
var
  Gd, Gm : Integer;
 
type
  XY = record
    X : Integer;
    Y : Integer;
  end;
 
procedure LineXY(A, B : XY);
begin
   Line(A.X, A.Y, B.X, B.Y);
end;
 
procedure AddXY(A, B : XY; var Res : XY);
begin
  Res.X := A.X + B.X;
  Res.Y := A.Y + B.Y;
end;
 
procedure SubXY(A, B : XY; var Res : XY);
begin
  Res.X := A.X — B.X;
  Res.Y := A.Y — B.Y;
end;
 
procedure MulXY(A : XY; L : Integer; var Res : XY);
begin
  Res.X := A.X * L;
  Res.Y := A.Y * L;
end;
 
procedure CopyXY(A : XY; var Res : XY);
begin
  Res.X := A.X;
  Res.Y := A.Y;
end;
 
procedure DrawRect(Origin, Dir1, Dir2 : XY;
    X1, Y1, X2, Y2 : Integer; Fill, Draw : Boolean);
var
  a, b, c, d, e, f, g : XY;
  Points :  array[1 .. 5] of XY;
begin
  MulXY(Dir1, X1, a);
  MulXY(Dir1, X2, b);
  MulXY(Dir2, Y1, c);
  MulXY(Dir2, Y2, d);
  AddXY(Origin, a, e);
  AddXY(e, c, Points[1]);
  AddXY(e, d, Points[2]);
  AddXY(Origin, b, f);
  AddXY(f, d, Points[3]);
  AddXY(f, c, Points[4]);
  CopyXY(Points[1], Points[5]);
  if Fill then
    FillPoly(5, Points);
  if Draw then
    DrawPoly(5, Points);
end;
 
procedure DrawWall(Origin, Dir1, Dir2 : XY;
    L1, L2 : Integer; Oddity : Boolean);
{ Рисует кирпичную стену }
var
  i, j : Integer;
  a, b, c, d, e : XY;
  Poly : array[1 .. 5] of XY;
begin
  { Внешний контур }
  CopyXY(Origin, Poly[1]);
  MulXY(Dir1, L1, c);
  MulXY(Dir2, L2, d);
  AddXY(c, d, e);
  AddXY(Origin, c, Poly[2]);
  AddXY(Origin, e, Poly[3]);
  AddXY(Origin, d, Poly[4]);
  CopyXY(Origin, Poly[5]);
  FillPoly(5, Poly);
  DrawPoly(5, Poly);
  { Кирпичи }
  for i := 1 to L2 — 1 do
  begin
    { Line(Origin + Dir2 * i,
           Origin + Dir2 * i + Dir1 * L1) }
    MulXY(Dir2, i, a);
    AddXY(Origin, a, b);
    AddXY(b, c, d);
    LineXY(b, d);
  end;
  for i := 1 to L2 do
  begin
    MulXY(Dir2, i — 1, a);
    AddXY(Origin, a, b);
    MulXY(Dir2, i, a);
    AddXY(Origin, a, c);
    for j := 1 to L1 — 1 do
    begin
      if ((i mod 2) = 1) xor ((j mod 2) = 1) xor Oddity then
      begin
        { Line(Origin + Dir2 * (i — 1) + Dir1 * j,
               Origin + Dir2 * i       + Dir1 * j) }
        MulXY(Dir1, j, a);
        AddXY(b, a, d);
        AddXY(c, a, e);
        LineXY(d, e);
      end;
    end;
  end;
end;
 
type XYC = record
    X, Y, C : LongInt; { проективные координаты }
  end;
 
procedure XY2XYC(A : XY; var Res : XYC);
begin
  Res.X := A.X;
  Res.Y := A.Y;
  Res.C := 1;
end;
 
procedure XYC2XY(A : XYC; var Res : XY);
var
  ResX, ResY : LongInt;
begin
  ResX := A.X div A.C;
  ResY := A.Y div A.C;
  Res.X := ResX;
  Res.Y := ResY;
end;
 
procedure IncidXYC(A, B : XYC; var Res : XYC);
begin
  Res.X :=  A.Y * B.C — A.C * B.Y;
  Res.Y := -A.C * B.X + A.X * B.C;
  Res.C :=  A.X * B.Y — A.Y * B.X;
end;
 
procedure Intersect(a1, a2, b1, b2 : XY; var Res : XY);
{ Точка пересечения линий a1a2 и b1b2 }
var pa1, pa2, pb1, pb2, { проективные координаты точек a1, a2, b1 и b2 }
    pal, pbl, { проективные координаты линий a1a2 и b1b2 }
    pRes : XYC; { проективные координаты точки пересечения }
begin
  XY2XYC(a1, pa1); XY2XYC(a2, pa2); XY2XYC(b1, pb1); XY2XYC(b2, pb2);
  IncidXYC(pa1, pa2, pal);
  IncidXYC(pb1, pb2, pbl);
  IncidXYC(pal, pbl, pRes);
  XYC2XY(pRes, Res);
end;
 
procedure Cloud(X, Y : Integer);
const CloudImage : array[1 .. 7] of String =
(‘        .  .    .    .             ‘,
 ‘     .    .   .   .     .  .       ‘,
 ‘   .  .  .   .      .  .  .  .     ‘,
 ‘  .   . .  .  .  .    .   .   .  . ‘,
 ‘   .  .   .  .  .  . .  .   .  .   ‘,
 ‘     .   .   . . .  .    . .       ‘,
 ‘                                   ‘);
var
  i, j : Integer;
begin
  for i := 1 to 7 do
    for j := 1 to Length(CloudImage[1]) do
      if CloudImage[i, j] = ‘.’ then
        PutPixel(X + j — 1, Y + i — 1, LightGray);
end;
 
var
  a, b, c, d, e, f, g, h, i, j, k, l, m, n, o,
  p, q, r, s, t, u, v, w, x, y, z, a0, b0, c0 : XY;
  Roof : array[1 .. 5] of XY;
  Roof2 : array[1 .. 4] of XY;
  Shadow : array[1 .. 9] of XY;
begin
  Gd := VGA;
  Gm := VGAHi; { 640×480 }
  InitGraph(Gd, Gm, ‘X:BP’);
 
  { Небо }
  SetFillStyle(SolidFill, LightCyan);
  Bar(0, 0, 639, 479);
 
  { Облака }
  Cloud( 89,  91); Cloud( 90,  82); Cloud( 11,  91); Cloud( 72,  98);
  Cloud( 52,  27); Cloud( 42,  77); Cloud( 98,  58); Cloud( 48,  12);
  Cloud( 67,  62); Cloud(167,  34); Cloud( 62,  73); Cloud(363,  54);
  Cloud(122,  46); Cloud( 40,  46); Cloud( 27,  26); Cloud( 49,  23);
 
  { Трава }
  SetFillStyle(SolidFill, LightGreen);
  FillEllipse(320, 380, 500, 200);
 
  { Кирпичные стены }
  SetLineStyle(SolidLn, 0, NormWidth);
  SetColor(Black);
  SetFillStyle(SolidFill, Brown);
 
 
  a.X := 200;
  a.Y := 150;
  b.X := 10;
  b.Y := 0;
  c.X := 0;
  c.Y := 10;
  DrawWall(a, b, c, 20, 20, False);
  MulXY(b, 20, d);
  AddXY(a, d, e);
  f.X := 5;
  f.Y := -5;
  DrawWall(e, f, c, 20, 20, True);
 
  { Крыша }
  MulXY(b, 4, g);
  SubXY(a, g, h);
  MulXY(f, 4, i);
  SubXY(h, i, Roof[1]);
  AddXY(e, g, j);
  SubXY(j, i, Roof[2]);
  CopyXY(Roof[2], Roof2[1]);
  MulXY(f, 20 + 4, k);
  AddXY(e, k, l);
  AddXY(l, g, Roof2[2]);
  MulXY(f, 10, m);
  AddXY(a, m, n);
  MulXY(c, 9, o);
  SubXY(n, o, p);
  MulXY(b, 10 — 4, q);
  AddXY(p, q, Roof[4]);
  MulXY(b, 10 + 4, r);
  AddXY(p, r, Roof[3]);
  CopyXY(Roof[3], Roof2[3]);
 
  CopyXY(Roof[1], Roof[5]);
  CopyXY(Roof2[1], Roof2[4]);
 
  SetFillStyle(SolidFill, LightGray);
  FillPoly(5, Roof);
  DrawPoly(5, Roof);
  SetFillStyle(SolidFill, DarkGray);
  FillPoly(4, Roof2);
  DrawPoly(4, Roof2);
 
  { Тень }
  s.X := 8;
  s.Y := 3;
  MulXY(c, 20, t);
  MulXY(s, 20, u);
  AddXY(t, u, v);
  AddXY(a, t, Shadow[1]);
  AddXY(a, v, w);
  AddXY(Roof[1], v, Shadow[3]);
  MulXY(f, 20 + 4 + 4, x);
  AddXY(Shadow[3], x, y);
  Intersect(Shadow[1], w, Shadow[3], y, Shadow[2]);
  AddXY(Roof[2], v, Shadow[4]);
  AddXY(Roof2[2], v, Shadow[5]);
  AddXY(e, t, Shadow[8]);
  MulXY(f, 20, z);
  AddXY(Shadow[8], z, Shadow[7]);
  SubXY(Shadow[7], u, a0);
  Intersect(Shadow[5], y, Shadow[7], a0, Shadow[6]);
  CopyXY(Shadow[1], Shadow[9]);
 
  SetFillStyle(SolidFill, Green);
  FillPoly(9, Shadow);
 
  { Дверь }
 
  SetFillStyle(SolidFill, Red);
  DrawRect(e, f, c, 7, 8, 13, 20, True, True);
 
  { Окно }
  SetColor(White);
  SetFillStyle(SolidFill, Blue);
  DrawRect(a, b, c, 6, 6, 14, 14, True, True);
  DrawRect(a, b, c, 10, 6, 14, 14, True, True);
  DrawRect(a, b, c, 10, 6, 14, 9, True, True);
 
  { Табличка }
  SetColor(Blue);
  SetFillStyle(SolidFill, White);
  DrawRect(a, b, c, 1, 2, 19, 5, True, True);
 
  SetTextStyle(5, HorizDir, 1);
  OutTextXY(a.X + b.X * 1 + c.X * 1 + 3, a.Y + b.Y * 2 + c.Y * 2,
    ‘Дом-2: Перестройка’);
 
  while not KeyPressed do
    Delay(200);
 
  CloseGraph;
end.
Читайте также:  Как построить дом из простыней

Источник

Графика и анимация в Паскале

На занятии происходит знакомство с логическим типом Boolean в Паскале. Рассматривается алгоритм того, как находится минимальное и максимальное число в Паскале

Графика в Паскале

Для работы с графикой в pascal abc используется модуль GraphABC. Для его подключения используется следующий код:

uses GraphABC;
begin

end.

Система координат в Паскале соответствует экранной системе координат и выглядит следующим образом:

Система координат в паскале

Система координат

Управление цветом

Для того, чтобы использовать цвет, необходимо применить этот цвет к инструменту перо:

  • SetPenColor(color) — устанавливает цвет пера, задаваемый параметром color;
  • setBrushColor(color) — устанавливает цвет кисти, задаваемый параметром color;
  • либо для палитры RGB: SetPenColor(rgb(0-255, 0-255, 0-255));
  • или использовать для заливки:

  • FloodFill(x,y,color) — заливает область одного цвета цветом color, начиная с точки (x,y).

После чего можно использовать процедуры для рисования геометрических фигур.

Цвета в pascal abc:

clBlack – черный
clPurple – фиолетовый
clWhite – белый
clMaroon – темно-красный
clRed – красный
clNavy – темно-синий
clGreen – зеленый
clBrown – коричневый
clBlue – синий
clSkyBlue – голубой
clYellow – желтый
clCream – кремовый
clAqua – бирюзовый
clOlive – оливковый
clFuchsia – сиреневый
clTeal – сине-зеленый
clGray – темно-серый
clLime – ярко-зеленый
clMoneyGreen – цвет зеленых денег
clLtGray – светло-серый
clDkGray – темно-серый
clMedGray – серый
clSilver – серебряный

Точки, отрезки и ломаные

Для отображения точки в паскале используется процедура:

  • SetPixel(x,y,color) — Закрашивает один пиксел с координатами (x,y) цветом color
  • точки в паскале

    uses GraphABC;
    begin
    SetPixel(300,200,clred);
    end.

    Для рисования линии используется:

  • Line(x1,y1,x2,y2) — рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2)
  • паскаль линия

    uses GraphABC;
    begin
    SetPenColor(clgreen);
    line(100,50,500,250);
    end.

    Ломаные можно рисовать с помощью процедур MoveTo (x1, y1) и LineTo (x2, y2).
    Процедуры работают в паре: MoveTo передвигает курсор в определенную точку, а процедура LineTo рисует линию с этой точки до точки, определенной параметром данной процедуры.
    ломаные в паскале

    uses GraphABC;
    begin

    SetPenColor(clblue);
    MoveTo (x1, y1);
    LineTo (x2, y2);
    LineTo (x3, y3);
    LineTo (x4, y4);
    LineTo (x5, y5);
    end.

    Задание 0: При помощи операторов SetPenColor(), LineTo (x2, y2) и MoveTo (x1, y1) нарисовать квадрат и равносторонний треугольник.

    Для установки размеров графического окна используется процедура

  • SetWindowSize(ширина, высота)
  • или, например:

    SetWindowWidth(600);
    SetWindowHeight(400);

    Рисование фигур

    Прямоугольник в Паскале рисуется:

  • Rectangle(x1,y1,x2,y2) — рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2).
  • прямоугольник в паскале

    uses GraphABC;
    begin
    Rectangle(50,50,200,200);
    end.

    Фигуры с заливкой:

    Фигуры с заливкой

    uses GraphABC;
    begin
    Rectangle(50,50,200,200);
    FloodFill(100,100,clBlue);
    end.

    Треугольник рисуется процедурами:

    Line(x1,y1,x2,y2);
    LineTo(x,y);

    треугольник в паскале

    uses GraphABC;
    begin
    setpenwidth(20);
    setpencolor(clred);
    moveTo(300,100);
    lineTo(500,300);
    lineto(100,300);
    lineto(300,100);
    floodfill(300,200,clgreen);
    end.

    Окружность можно нарисовать с помощью процедуры:

  • Circle(x,y,r) — рисует окружность с центром в точке (x,y) и радиусом r.
  • круг в паскале

    uses GraphABC;
    begin
    Circle(500,200,100);
    FloodFill(500,200,clred);
    end.

    Дуга окружности

  • Arc(x,y,r,a1,a2) — Рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки).
  • Дуга окружности

    1
    2
    3
    4
    5
    uses GraphABC;
    Begin
    SetPenWidth(10);
    Arc(300,250,150,45,135);
    end.

    Задание 1: «Лягушка»
    задание по теме графика в паскале

    Задание 2: «Корона»
    задание по теме графика в pascal

    Функция random для использования окраски

  • SetPenColor(rgb(random(256), random(256), random(256))); — выбирает случайное число из 256-цветной палитры для красного, зеленого и синего.
  • Задание 3: Нарисовать горизонтальный ряд окружностей радиусом 10 на расстоянии 100 от верхнего края экрана и с такими горизонтальными координатами 50, 80, 110, 140, … , 290.

    * раскрасить круги случайным цветом

    Задание 4: «Круги на воде».
    Нарисуйте пару десятков концентрических окружностей, то есть окружностей разного радиуса, но имеющих общий центр.

    Задание 5:
    Воспроизвести изображение при помощи программы:
    графика паскаль abc.net

    Штриховка

    Нарисовать штриховку на Паскале можно, используя процедуры рисования прямоугольника и линии:
    алгоритм штриховки на паскале

    Программа будет выглядеть следующим образом:

    1_1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    uses graphABC;
    var i, x1, x2, y1, y2, N: integer;
    h, x: real;
    begin
    x1 := 100; y1 := 100;
    x2 := 300; y2 := 200;
    N := 10;
    Rectangle (x1, y1, x2, y2);
    h := (x2 — x1) / (N + 1);
    x := x1 + h;
    for i:=1 to N do begin
    Line(round(x), y1, round(x), y2);
    x := x + h;
    end;
    end.

    Задание 6:
    Нарисуйте шахматную доску.

    Анимация в Паскале

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

    Пример: Воспроизвести движение круга по горизонтали.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    uses GraphABC;
    var x:integer;
    begin
    x:=40;
    repeat
    SetPenColor(clWhite);
    Circle(x,100,10); {Рисуем белую окружность}
    SetPenColor(clBlack);
    Circle(x,100,10); {Рисуем черную окружность}
    x:=x+1 {Перемещаемся немного направо}
    until x>600;
    end.

    Задание 6: Выполнить анимацию движения квадрата по следующей траектории:
    Построить дом в паскале

    Источник