Как рисовать линии в окне

На предыдущих страницах мы говорили об точках в Паскале: изучили процедуры 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 uses GraphABC; { Подключаем графический модуль } 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); readln end.

Теперь немного разукрасим отрезок и увеличим его толщину, так как в предыдущем примере по умолчанию цвет черный, а толщина линии 1 пиксель:

Код PascalABC, PascalABC.Net

1 2 3 4 5 6 7 8 9 10 11 uses GraphABC; //Подключаем модуль для рисования в графическом окне begin SetWindowTitle('Отрезок'); //Заголовок окна SetPenWidth(3); //Толщина отрезка 3 пикселя SetPenColor(clRed); //Цвет отрезка - красный { Проводим отрезок от точки с координатами (50, 80) до точки с координатами (300, 400): } Line(50, 80, 300, 400) end.

Ниже представлены примеры программ случайных появляющихся отрезков в PascalABC.Net и Turbo Pascal/Free Pascal:


Код PascalABC.Net

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 uses GraphABC; //Модуль для рисования в графическом окне begin SetWindowCaption('Случайные отрезки'); var W := WindowWidth; //Ширина графического окна var H := WindowHeight; //Высота графического окна randomize; { Следующий цикл будет бесконечным, поскольку условие True в цикле While всегда истинно: } while do begin var n := random(5, 50); //количество отрезков от 5 до 50 for var i := 1 to n do begin 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 //очищаем окно белым цветом end end.

Код Turbo Pascal, Free 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 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; { Следующий цикл будет бесконечным: } while true do begin n := 5 + random(46); { Количество отрезков от 5 до 50 } for i := 1 to n do begin 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 uses GraphABC; begin randomize; { Проводим отрезок от точки (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 uses GraphABC; //Подключаем модуль для рисования в графическом окне begin SetWindowTitle('Треугольник'); //Заголовок окна 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 с указанным количеством концов. Все комментарии с в коде:


Код PascalABC.Net

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 uses GraphABC; //Рисует n-конечную звезду procedure myStar(n, x0, y0, r1, r2, pw: integer; C1, C2: Color); //r1 > r2 var x, y, линии i, R: integer; a, da: real; begin a := pi random; //Начальный угол поворота - случайный da := pi / n; //Интервал изменения градуса(в радианах): 360/(2n) SetPenColor(C1); SetPenWidth(pw); for i := 0 to 2 n do begin //sleep(1000); //Задержка на 1 сек.(можно удалить) 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 = 0 then MoveTo(x, y) //Устанавливаем начальную позицию else LineTo(x, y) //Проводим отрезки end; FloodFill(x0, y0, C2) //Закрашиваем внутринность звезды цветом C end; var x0, y0, r1, r2, n, pw: integer; C1, C2: Color; begin n := 7; //Количество концов(углов) звезды { Координаты центра звезды - по центру окна: } x0 := WindowWidth div 2; y0 := WindowHeight div 2; r1 := 200; //Больший радиус r2 := 80; //Меньший радиус pw := 3; //Толщина границы в пикселях C1 := clGreen; //Цвет границы звезды C2 := clYellow; //Цвет заливки звезды { Вызываем процедуру рисования звезды, передавая все нужные параметры: } myStar(n, x0, y0, r1, r2, pw, C1, C2) end.

Результат выполнения программы представлен на рисунке:

Звезда в Pascal


Код Turbo Pascal, Free 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 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 := 0 to 2 n do begin 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 = 0 then 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 div 2; y0 := GetMaxY div 2; r1 := 200; { Больший радиус } r2 := 80; { Меньший радиус } pw := 3; { Толщина границы в пикселях } C1 := Green; { Цвет границы звезды } C2 := Yellow; { Цвет заливки звезды } { Вызываем процедуру рисования звезды, передавая все нужные параметры: } myStar(n, x0, y0, r1, r2, pw, C1, C2); readln; CloseGraph { Закрываем графику } end.

Результат выполнения программы представлен на рисунке:

Звезда в Pascal

✎ LineTo(x, y, C) — Рисует отрезок от точки, в которой на данный момент находится конец отрезка (текущая позиция), до точки (x, y) цветом C. Начальная позиция задается с помощью MoveTo, а новая позиция переходит в точку (x, y). Толщина линии при этом равна 1 пиксель.

Код PascalABC.Net

1 2 3 4 5 6 7 8 uses GraphABC; begin SetPenWidth(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(...) и построить следующую последовательность линий:

1) Line(x0, y0, x1, y1); 2) Line(x1, y1, x2, y2); 3) Line(x2, y2, x3, y3);...; 9) Line(x8, y8, x9, y9).

Но в таком случае точки (x1, y1), (x2, y2),..., (x8, y8) будут строится два раза – в конце предыдущего и начале следующего отрезков. Здесь можно проще поступить: процедурой MoveTo(x0, y0) задаем начальную точку ломаной линии, а после 9 раз используем процедуру LineTo:

 1) LineTo(x1, y1); 2) LineTo(x2, y2); 3) LineTo(x3, y3);... 9) LineTo(x9, y9).

И проще выглядит и результат тот же. Наиболее частое использование процедуры LineTo - при построении графиков фукнций, особенно, если точек построения мало.

На этом все о линиях в паскале. А пока, если вам понадобится длительное хранение зерна, то вам не обойтись без сушильного шкафа от экан - он сохраненяет питательные вещества и соответствует стандарту ГОСТ.

← Назад

Вперед →



Рекомендуем посмотреть ещё:


Закрыть ... [X]

Как нарисовать линию в ворде: основные способы Рисовать всех птиц

Рисование линии - Служба поддержки Office Www. ПЕРВЫЕ ШАГИ. ru : Шаг 10 - Рисуем в окне Рисование линий в прозрачном окне WASM Как поэтапно рисовать окно на стене Как нарисовать стеклянное окно Графический редактор Paint

Похожие новости