Классы штампов. Хотели как лучше, а получилось как всегда. Обычно начинающие программисты рисуют графические изображения.
Например, для рисования трех квадратов на равных расстояниях по горизонтали пишут следующий код: uses Graph. ABC; begin Rectangle(3.
Rectangle(8. 5,3. Rectangle(1. 40,3. Конечно, такой код плох - лучше попытаться сделать то же самое с помощью цикла: uses Graph.
В этом разделе находится множество решенных заданий по графике паскаля в среде PascalABC, PascalABC.Net, Turbo Pascal, Free Pascal.
Для работы с графикой в PascalABC необходимо подключить модуль. Рубрика: Язык программирования Паскаль Найти данную презентацию в формате Power Point вы можете на сайте http://www.ppt4all.com/. Рассматривается графический режим в паскале с использованием среды программирования pascal abc, примеры того, как нарисовать различные . PascalМодуль GraphABC Урок 1 1; 2. Подключение дополнительных библиотек Для работы в графическом . Графические возможности. Модуль GraphABC: Модуль GraphABC предназначен для создания графических и анимационных программ.
- Uses GraphABC; const x0 = 30; y0 = 30; w = 50; // размер квадрата step = 55; // шаг между квадратами n = 10; begin for var i:=0 to n-1 do.
- Графика Pascal ABC: Процедура рисования треугольника - Pascal ABC. Просмотров 3316. Метки нет (Все .
Теперь пришло время использовать эти знания в построении графиков функций в паскале. Следует сразу заметить, что построение графика функции .
ABC; beginforvar i: =0to. Rectangle(3. 0+i*5. Уже лучше, но опять в коде - . Сделаем их именованными: uses Graph.
ABC; const x. 0 =3. Rectangle(x. 0+i*step,y.
В результате получим следующее изображение: Ну вот, всё замечательно. Программа хорошая, и на этом статью можно и закончить. Только запись x. 0+i*step,y.
И что же нам предлагают? А как же классы штампов?
Может, есть какой- то интересный способ? Позволяющий сделать код рисования более очевидным? Да. Такой способ есть. Для того чтобы его понять, давайте посмотрим на рисунок по- другому. Мы рисуем первый квадрат - его координаты определить нетрудно. После этого каждый следующий квадрат надо рисовать, сдвигая предыдущий вправо на расстояние на 5 пикселей больше ширины квадрата. Как же такое реализовать?
Идея проста: надо вначале запомнить все параметры одного изображения в некоторой составной переменной. В качестве такой составной переменной будем использовать объект некоторого класса. В конструкторе этого класса мы будем инициализировать параметры нашего объекта, а в методе Stamp - рисовать объект с сохраненными параметрами. Это напоминает следующее действие: мы вначале выбираем штамп с заданными параметрами, позиционируем его в нужном месте и - штампуем.
В результате получается отпечаток - наше изображение. Этот способ хорош тем, что достаточно изменить некоторые (не все) параметры и снова вызвать метод Stamp. Например, если изменить только координаты объекта, то после вызова stamp он . В конструкторе мы лишь запоминаем эти параметры, а в методе Stamp - рисуем прямоугольник нужного размера в указанной позиции. Чтобы нарисовать еще 9 квадратов, будем изменять x- координату исходного объекта в цикле на величину, равную ширине квадрата + 5, после чего снова штамповать объект. Вот как выглядит основная программа: beginvar r : =new Rectangle. Stamp(3. 0,3. 0,5.
Stamp; forvar i: =1to. Stamp; end; end. Класс- штамп шахматной доски. Разовьем эту идею дальше для рисования шахматной доски 8 на 8 клеток. Для этого создадим класс штампа одного ряда шахматной доски, рисующий 8 клеток. Для рисования будем использовать предыдущий штамп: type Row. Rectangles. Stamp =class x,y,w,h,n: integer; constructor(xx,yy,ww,hh,nn: integer); begin x : = xx; y : = yy; w : = ww; h : = hh; n : = nn; end; procedure Stamp; beginvar r : =new Rectangle.
Stamp(x,y,w,h); r. Stamp; forvar i: =1to n- 1dobegin r. Stamp; end; end; end; Основная программа снова будет простой: const n=8; beginvar r : =new Row.
Rectangles. Stamp(3. Stamp; forvar i: =1to n- 1dobegin r. Stamp; end; end. Результат: Методы увеличения и уменьшения для штампа прямоугольника. Продолжим наши исследования. Доработаем класс Rectangle. Stamp, добавив в него метод Move. On перемещения объекта на вектор dx,dy, а также методы Increase.
From. Center и Decrease. From. Center, увеличивающие и уменьшающие размер прямоугольника, оставляя на месте его центр: type Rectangle. Stamp =class x,y,w,h: integer; constructor(xx,yy,ww,hh: integer); begin x : = xx; y : = yy; w : = ww; h : = hh; end; procedure Stamp; begin Rectangle(x,y,x+w,y+h); end; procedure Increase. From. Center(dw: integer); begin w += dw*2; h += dw*2; x - = dw; y - = dw; end; procedure Decrease. From. Center(dw: integer); begin Increase. From. Center(- dw); end; end; Тогда следующая простая программаbeginvar r : =new Rectangle. Stamp(1. 00,1. 00,3.
Stamp; while r. w> 2dobegin r. Decrease. From. Center(4); r. Stamp; end; end. выводит ряд уменьшающихся квадратов с общим центром: Опять- таки, следует обратить особое внимание на короткую и интуитивно понятную основную программу. Программа Для Записи Клавиатуры далее.
Штамп текста. Создадим также текстовый штамп - он потребуется нам в дальнейшем: type Text. Stamp =class x,y,pt: integer; Text: string; constructor(xx,yy,ppt: integer; t: string); begin x : = xx; y : = yy; pt : = ppt; Text : = t; end; procedure Stamp; begin Font. Size: = pt; Text. Out(x,y,text); end; procedure Move. On(dx,dy: integer); begin x += dx; y += dy; end; end; Здесь pt - это размер шрифта в пунктах, а метод Move. On используется для перемещения координат объекта на заданный вектор.
Основная программа, выводящая две фразы одну под другой, имеет вид: beginvar txt : =new Text. Stamp(2. 00,2. 00,1. Привет!'); txt. Stamp; txt. Move. On(0,4. 0); txt. Text: ='До свидания!'; txt. Stamp; end. Результат: Группировка штампов. Гистограмма. Следующая идея - объединить несколько простых штампов для создания более сложного.
Например, для создания гистограммы необходимо выводить прямоугольник заданной высоты и подписывать его снизу числом, совпадающим с высотой прямоугольника. Для вывода гистограммы в цвете немного модифицируем методы Stamp для прямоугольника- штампа: procedure Stamp; begin Brush. Color: = cl. Random; Rectangle(x,y,x+w,y+h); end; и для текста- штампа: procedure Stamp; begin Font. Size: = pt; Brush. Color: = cl. White; Text. Out(x,y,text); end; После этого создадим штамп прямоугольника с текстовой подписью внизу: type Rect.
With. Text. Stamp =class rs: Rectangle. Stamp; ts: Text. Stamp; constructor(x,y,w,h: integer; t: string); begin rs : =new Rectangle. Stamp(x,y,w,- h); ts : =new Text. Stamp(x,y+3,1. 0,t); end; procedure Draw; begin rs.
Stamp; ts. Stamp; end; procedure Move. On(dx,dy: integer); begin rs.
Move. On(dx,dy); ts. Move. On(dx,dy); end; procedure Set. Height(h: integer); begin rs. Set. Text(t: string); begin ts. Text: = t; end; end; Здесь вспомогательные штампы прямоугольника и текста описаны как поля основного штампа, конструируются в конструкторе основного штампа, и выполнение всех операций оновной штамп переадресует им. В частности, метод Stamp класса Rect.
With. Text. Stamp вызывает методы Stamp штампа- прямоугольника и штампа- текста. Создание мозаики. Продолжим наши исследования. Создадим более сложный штамп креста: type Cross. Stamp =class x,y,w: integer; constructor(xx,yy,ww: integer); begin x : = xx; y : = yy; w : = ww; end; procedure Stamp; begin Move. To(x,y); Line. To(x+w,y); Line.
To(x+w,y+w); Line. To(x+2*w,y+w); Line. To(x+2*w,y); Line. To(x+3*w,y); Line.
To(x+3*w,y- w); Line. To(x+2*w,y- w); Line.
To(x+2*w,y- 2*w); Line. To(x+w,y- 2*w); Line. To(x+w,y- w); Line. To(x,y- w); Line. To(x,y); end; procedure Move. On(dx,dy: integer); begin x += dx; y += dy; end; end; Добавим в этот класс метод Move.
On. Rel, сдвигающий крест на величину, пропорциональную его щирине: procedure Move. On. Rel(a,b: integer); begin Move. On(a*w,b*w); end; Для получения одного ряда мозаики составим следующую программу: beginvar r : =new Cross. Stamp(1. 00,1. 50,2. Stamp; r. Move. On.
Rel(2,1); end; end. Результат: При построении следующего ряда возникает неприятная проблема: следующий ряд крестов необходимо начинать с креста, получаемого смещением исходного креста- штампа до изменения его координат. Но в результате выполнения цикла координаты исходного креста изменились. Клонирование штампа. Решение проблемы может быть следующим: создадим клон исходного креста- штампа еще до его перемещения.
Для клонирования добавим в класс креста- штампа следующий метод: function Clone(): Cross. Stamp; begin Result : =new Cross.