На предыдущих страницах мы говорили об точках в Паскале: изучили процедуры GetPixel (определить цвет данного пикселя) и PutPixel, SetPixel (задать данному пикселю определенный цвет – там мы строили линии и не только с помощью точек). Здесь рассмотрим одни из наиболее важных процедур в графике Паскаля – построение линий Line, LineTo и вспомогательная для последней MoveTo.
Так чем же отличаются Line и LineTo, и зачем нужна загадочная MoveTo?
✎Line(x1, y1, x2, y2) — Эта процедура соединяет отрезком точки (x1, y1) и (x2, y2).
Код PascalABC, PascalABC.Net
1
2
3
4
5
6
7
8
usesGraphABC; { Подключаем графический модуль }begin{ Проводим отрезок от точки с координатами (50, 80)
до точки с координатами (300, 400): }Line(50,80,300,400)end.
Код Turbo Pascal, Free Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uses
Graph; { Подключаем модуль }var
Gd, Gm:integer;
begin
Gd := Detect;
{ Инициализируем графический режим: }
InitGraph(Gd, Gm,'');
{ Отрезок от точки с координатами (50, 80)
до точки с координатами (300, 400): }
Line(50,80,300,400);
readlnend.
Теперь немного разукрасим отрезок и увеличим его толщину, так как в предыдущем примере по умолчанию цвет черный, а толщина линии 1 пиксель:
Код PascalABC, PascalABC.Net
1
2
3
4
5
6
7
8
9
10
11
usesGraphABC; //Подключаем модуль для рисования в графическом окнеbeginSetWindowTitle('Отрезок'); //Заголовок окнаSetPenWidth(3); //Толщина отрезка 3 пикселяSetPenColor(clRed); //Цвет отрезка - красный{ Проводим отрезок от точки с координатами (50, 80)
до точки с координатами (300, 400): }Line(50,80,300,400)end.
Ниже представлены примеры программ случайных появляющихся отрезков в PascalABC.Net и Turbo Pascal/Free Pascal:
uses
GraphABC; //Модуль для рисования в графическом окнеbegin
SetWindowCaption('Случайные отрезки');
var W := WindowWidth; //Ширина графического окнаvar H := WindowHeight; //Высота графического окна
randomize;
{ Следующий цикл будет бесконечным, поскольку
условие True в цикле While всегда истинно: }whiledobeginvar n := random(5,50); //количество отрезков от 5 до 50forvar i :=1to n dobegin
SetPenWidth(random(1,10)); //толщина отрезков
SetPenColor(ClRandom); //случайный цвет отрезка{ Координаты первой точки: }var x1 := random(50, W -50);
var y1 := random(50, H -50);
{ Координаты второй точки: }var x2 := random(50, W -50);
var y2 := random(50, H -50);
{ Рисуем отрезок от точки (x1, y1) до точки (x2, y2): }
Line(x1, y1, x2, y2)end;
sleep(2000); //задержка на 2 секунды
ClearWindow //очищаем окно белым цветомendend.
uses
Graph, Crt; { Подключаем модули }var
Gd, Gm, W, H, x1, y1, x2, y2, n, i, d:integer;
begin
Gd := Detect;
{ Инициализируем графический режим: }
InitGraph(Gd, Gm,'');
W := GetMaxX; { Ширина графического окна }
H := GetMaxY; { Высота графического окна }
SetLineStyle(0,0,1); { Стиль линий }
d :=50; { Отступ линий от краев окна }
randomize;
{ Следующий цикл будет бесконечным: }whiletruedobegin
n :=5+ random(46); { Количество отрезков от 5 до 50 }for i :=1to n dobegin
SetColor(Random(GetMaxColor)+1); { Случайный цвет отрезка }{ Координаты первой точки: }
x1 := d + random(W -2* d +1);
y1 := d + random(H -2* d +1);
{ Координаты второй точки: }
x2 := d + random(W -2* d +1);
y2 := d + random(H -2* d +1);
{ Рисуем отрезок от точки (x1, y1) до точки (x2, y2): }
Line(x1, y1, x2, y2)end;
delay(2000); { Приостановка на 2 секунды }
ClearDevice { Очищаем окно цветом фона или SetBkColor }end;
readln;
CloseGraph { Закрываем графику }end.
✎Line(x1, y1, x2, y2, C) – Проводит отрезок от точки (x1, y1) до точки (x2, y2), закрашивая отрезок цветом C. Есть только в PascalABC.Net. Толщина линии при этом равна 1 пиксель и её изменить нельзя.
Код PascalABC.Net
1
2
3
4
5
6
7
8
9
usesGraphABC;
beginrandomize;
{ Проводим отрезок от точки (100,150) до точки (400,300),
закрашенный случайным цветом clrandom: }Line(100,150,400,300,ClRandom)end.
✎MoveTo(x, y) – Устанавливает начальную точку (позицию) рисования в (x, y). Если эту процедуру не задействовать, то начальная точка по умолчанию принимается за (0, 0) – левый верхний угол окна. Процедура MoveTo используется совместно с LineTo (см. ниже).
✎LineTo(x, y) – Рисует отрезок от точки, в которой на данный момент находится конец отрезка (текущая позиция), до точки (x, y); начальная позиция задается с помощью MoveTo (см. выше), а новая позиция переходит в точку (x, y). Данная процедура задействуется при построении последовательной цепочки линий (отрезков) – когда конец каждой линии является одновременно началом следующей.
Код PascalABC.Net, PascalABC
1
2
3
4
5
6
7
8
9
10
11
12
usesGraphABC; //Подключаем модуль для рисования в графическом окнеbeginSetWindowTitle('Треугольник'); //Заголовок окнаSetPenWidth(3); //Толщина сторон треугольника 3 пикселяSetPenColor(clRed); //Цвет сторон - красныйMoveTo(100,50); //Ставим первую точку (100,50)LineTo(500,200); //Проводим отрезок к точке (500,200)LineTo(300,400); //Проводим отрезок к точке (300,400)LineTo(100,50)//Проводим отрезок к первоначальной точкеend.
А как нарисовать звезду в паскале? Ниже представлен пример программы для рисования звезды в PascalABC.Net с указанным количеством концов. Все комментарии с в коде:
uses
Graph; { Подключаем модуль }{ Рисует n-конечную звезду: }procedure myStar(n, x0, y0, r1, r2, pw:integer; C1, C2:word); { r1 > r2 }var
x, y, i, R:integer;
a, da:real;
begin
randomize;
a := pi * random; { Начальный угол поворота - случайный }
da := pi / n; { Шаг изменения градуса(в радианах): 360/(2n) }
SetColor(C1);
SetLineStyle(0,0, pw); { Стиль линий }for i :=0to2* n dobegin
a := a + da; { Увеличиваем угол }if odd(i)then R := r2 { Равен меньшему радиусу }else R := r1; { Равен большему радиусу }{ Преобразование координат: }
x := x0 + Round(R * cos(a));
y := y0 + Round(R * sin(a));
if i =0then MoveTo(x, y){ Устанавливаем начальную позицию }else LineTo(x, y){ Проводим отрезки }end;
SetFillStyle(1, C2); { Закрасим в цвет C1 }
FloodFill(x0, y0, C1){ Закрашиваем внутринность }end;
var
Gd, Gm, x0, y0, r1, r2, n, pw:integer;
C1, C2:word;
begin
Gd := Detect;
{ Инициализируем графический режим: }
InitGraph(Gd, Gm,'');
n :=7; { Количество концов(углов) звезды }{ Координаты центра звезды - по центру окна: }
x0 := GetMaxX div2; y0 := GetMaxY div2;
r1 :=200; { Больший радиус }
r2 :=80; { Меньший радиус }
pw :=3; { Толщина границы в пикселях }
C1 := Green; { Цвет границы звезды }
C2 := Yellow; { Цвет заливки звезды }{ Вызываем процедуру рисования звезды,
передавая все нужные параметры: }
myStar(n, x0, y0, r1, r2, pw, C1, C2);
readln;
CloseGraph { Закрываем графику }end.
Результат выполнения программы представлен на рисунке:
✎LineTo(x, y, C) — Рисует отрезок от точки, в которой на данный момент находится конец отрезка (текущая позиция), до точки (x, y) цветом C. Начальная позиция задается с помощью MoveTo, а новая позиция переходит в точку (x, y). Толщина линии при этом равна 1 пиксель.
Код PascalABC.Net
1
2
3
4
5
6
7
8
usesGraphABC;
beginSetPenWidth(10); { Толщина отрезка 10px не влияет на результат! }MoveTo(100,120); //начальная позиция рисования в точке (100,200)LineTo(400,300,ClRed)//рисуем отрезок к точке (400,300) красным цветомend.
LineTo(x, y) действует следующим образом. Пусть необходимо построить ломаную с вершинами в 10 точках (x0, y0), (x1, y1), (x2, y2), ..., (x9, y9). Для этого, естественно, можно использовать описанную выше процедуру Line(...) и построить следующую последовательность линий:
Но в таком случае точки (x1, y1), (x2, y2), ..., (x8, y8) будут строится два раза – в конце предыдущего и начале следующего отрезков. Здесь можно проще поступить: процедурой MoveTo(x0, y0) задаем начальную точку ломаной линии, а после 9 раз используем процедуру LineTo:
И проще выглядит и результат тот же. Наиболее частое использование процедуры LineTo - при построении графиков фукнций, особенно, если точек построения мало.
На этом все о линиях в паскале. А пока, если вам понадобится длительное хранение зерна, то вам не обойтись без сушильного шкафа от экан - он сохраненяет питательные вещества и соответствует стандарту ГОСТ.