Построить дом в паскале
Работа с графикой в 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.
Программа, рисующая фигурку:
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″
Открываем ярлык «Паскаль» и видим это:
Скриншот программы
Скриншот программы
Что же мы на нем видим:
- Строка ввода программы — сюда мы будем писать код
- Строка ввода данных — сюда будем вводить переменные данные
- Панель управления — проверка программы на ошибки, запуск программы…
Как же строится основа программы (это то, без чего программа не будет работать, это неизменная часть кода):
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 ✔
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. Для его подключения используется следующий код:
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 – серебряный
Точки, отрезки и ломаные
Для отображения точки в паскале используется процедура:
begin
SetPixel(300,200,clred);
end.
Для рисования линии используется:
begin
SetPenColor(clgreen);
line(100,50,500,250);
end.
Ломаные можно рисовать с помощью процедур MoveTo (x1, y1) и LineTo (x2, y2).
Процедуры работают в паре: MoveTo передвигает курсор в определенную точку, а процедура LineTo рисует линию с этой точки до точки, определенной параметром данной процедуры.
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) нарисовать квадрат и равносторонний треугольник.
Для установки размеров графического окна используется процедура
или, например:
SetWindowHeight(400);
Рисование фигур
Прямоугольник в Паскале рисуется:
begin
Rectangle(50,50,200,200);
end.
Фигуры с заливкой:
begin
Rectangle(50,50,200,200);
FloodFill(100,100,clBlue);
end.
Треугольник рисуется процедурами:
Line(x1,y1,x2,y2);
LineTo(x,y);
begin
setpenwidth(20);
setpencolor(clred);
moveTo(300,100);
lineTo(500,300);
lineto(100,300);
lineto(300,100);
floodfill(300,200,clgreen);
end.
Окружность можно нарисовать с помощью процедуры:
begin
Circle(500,200,100);
FloodFill(500,200,clred);
end.
Дуга окружности
1 2 3 4 5 | uses GraphABC; Begin SetPenWidth(10); Arc(300,250,150,45,135); end. |
Задание 1: «Лягушка»
Задание 2: «Корона»
Функция random для использования окраски
Задание 3: Нарисовать горизонтальный ряд окружностей радиусом 10 на расстоянии 100 от верхнего края экрана и с такими горизонтальными координатами 50, 80, 110, 140, … , 290.
* раскрасить круги случайным цветом
Задание 4: «Круги на воде».
Нарисуйте пару десятков концентрических окружностей, то есть окружностей разного радиуса, но имеющих общий центр.
Задание 5:
Воспроизвести изображение при помощи программы:
Штриховка
Нарисовать штриховку на Паскале можно, используя процедуры рисования прямоугольника и линии:
Программа будет выглядеть следующим образом:
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: Выполнить анимацию движения квадрата по следующей траектории:
Источник