Программа которая строит графики на паскале
На экране современного компьютера можно получить не только последовательности букв, цифр и других символов, но и разнообразные рисунки, схемы и т.д. Для этого в языке Программирования включаются специальные средства — графические процед уры. Количество пикселей (светящихся точек ) на экране зависит от типа графического адаптера(видеокарты) и для распространенного адаптера VGA составляет 1024×768.
Так как же осуществляется построение графиков функций?
Допустим требуется построить график функции у=sin(x). Кроме кривой, изображающей график этой функции, на экране должны быть высвечены координатные оси Ох и Оу.
В рассматриваемых задачах необходимо нарисовать на экране график заданной функции, например:y=Sin(x) , xI[xmin, xmax].
Трудность заключается в том, что значения xmin, xmax, уmin, уmax могут быть отрицательными, дробными, очень большими или очень маленькими, а точки экрана нумеруются целыми положительными числами по горизонтальной оси от 0 до 1279, по вертикальной оси от 0 до 967, и эта ось направлена вниз.
Задача решается в два этапа:
1) выясняются пределы изменения х и у заданной функции (для этого
надо провести анализ функции)
2) рисуется график функции с пересчетом координат (х, у) каждой
точки графика в экранные координаты (i, j).
Выбор пределов изменения аргумента и заданной функции
Задаём интервал изменения х: от хmin до хmax и распечатываем значения функции с таким шагом h (по х), чтобы в таблице было 10 – 20 строчек, например, так:
Построение графика
Решение этой задачи удобно проводить в следующем порядке:
Определим границы значений аргумента в декартовых координатах, в пределах которых будет строиться график X [Xmin, Xmax].
Для данной области значений аргумента определим предельные значения функции: Y
[Ymin, Ymax]. Эти значения необязательно должны быть точными. Они могут быть оценочными снизу и сверху соответственно.
Зададим границы графического окна в графических координатах, в пределах которого будет рисоваться график: [Xgmin, Xgmax] – по горизонтали, [Ygmin, Ygmax] – по вертикали.
Учесть, что Ygmin > Ygmax, поскольку в графических координатах вертикальная ось направлена вниз.
Таким образом, имеем две системы координат [x, y] – математическая или декартова система координат и [xg, yg] – экранная система координат.
Получим формулы связи между этими системами.
Нетрудно получить формулу, связывающую экранные и математические координаты:
(*)
Здесь квадратные скобки означают округление до целого значения (функция Round).
Построение графика функции может производиться либо точечным методом, либо кусочно-линейным. При первом способе график строится как последовательность точек, расположенных максимально близко. Производится «попикселевый» перебор значений аргумента xg в интервале [Xgmin , Xgmax] с выставлением точек с соответствующими координатами Yg.
При кусочно-линейном методе задается шаг ΔX и рассчитывается последовательность значений (Xi , Yi):

Данный расчет производится в декартовой системе координат.
График строится в виде отрезков прямых, проведенных через точки (Хi, Yi), (Xi+1, Уi+1).
Точечный метод построения графика
Составим программу построения графика функции у = cos(x) для х
[0; 2π], используя точечный метод.
Из условия задачи следует, что Xmin = 0, Хтax= 2π. В этих пределах функция cos х меняется от -1 до 1. Поэтому Ymin = -1, Ymax = 1.
Выберем следующие границы графического окна:
Xgmin=10; Xgmax=400; Ygmin= 300; Ygmax=40.
График строится в виде последовательности точек с математическими координатами
Xi = Xmin + i ∙ h; Yi =cos(Xi); i = 0, . 390.
Шаг h выбирается минимально возможным, соответствующим шагу графической сетки:

Приведенные выше формулы перевода декартовых координат в экранные примут вид:

Вместе с графиком функции строятся оси координат. Строить их будем с помощью команды рисования линии line. Ось X имеет координату Yg= 170, ось Y — координату Xg = 10.
График функции в Паскале
Построение графиков функции на Паскале осуществляется в пошаговом режиме. Чтобы построить график функции в pascal необходимо организовать цикл, в котором сначала нужно просчитать значение функции, а затем, в соответствии с этим значением, отобразить точку с координатами PutPixel(x,y), где x — значение аргумента, y — значение вычисленной функции. Таким образом, построение графиков в pascal предусматривает создание некоторой подпрограммы с необходимым выражением для вычисления ее значения.
Чтобы построить в среде Turbo Pascal график функции необходимо руководствоваться следующими принципами.
Особенности построения графиков в pascal
Необходимо отображать как промежуточные, так и окончательные результаты расчетов.
При построении графика функции в Паскале необходимо полученные результаты перевести в экранные координаты графического режима.
Следует учесть тот факт, что координаты y имеют приращение сверху вниз, а не наоборот, как это обычно принято.
Для корректного масштабирования средствами pascal график строится на некотором отрезке с пределами расчета.
График фукнции Паскаль может интерпретировать по-разному в соответствии с тем или иным графическим режимом.
Универсальный график функции в pascal — Предусматривает задание любой функции в тексте программы
График расходящейся синусоидальной функции — Рисование расходящейся колебательной функции
Построение в графика функции в pascal — Построение кривой заданной уравнением: x*10^-1; y*10^-1
Гипербола и парабола — Построение графиков функций в pascal путем отображения части из них
Графики функций и их модули — Построение трех графиков функций: f=x*cos(x); f=2*arctan(t); f=2*a*sqr(sin(t)) и их модулей
Графики колебательных функций — Синус, расходящийся синус, парабола и другие
Учебник по программированию.
В данной главе мы изучим принципы работы с графикой. Для этих целей в PascalABC.NET специально был создан модуль GraphABC. Так же стоит сказать, что изучение программирования под операционную систему DOS у нас закончилось, и мы начнём создавать программы под операционную систему Windows.
§20. Модуль GraphABC.
Создадим новую программу, ничего не выполняющую, и подключим к ней модуль GraphABC. Сделать это можно с помощью шаблона – наберите gr и нажмите «Shift+Пробел». Получим следующий код:
Теперь после запуска такой программы мы увидим не консольное приложение, а обычное Windows-овское окно:

В этом и заключается преимущество PascalABC.NET (в смысле обучения) над другими интегрированными средами разработки. Нам нет необходимости писать код для создания окна, достаточно просто подключить модуль GraphABC к программе, и окно будет появляться автоматически. В таком случае мы можем сосредоточиться на изучении именно графики, а не проходить параллельно курс программирования под операционную систему Windows.
Внимательно посмотрите на окно. Вверху окна вы увидите четыре стандартных кнопки – одна слева и три справа. При нажатии левой кнопки появляется меню с командами:

О назначении трёх правых вы наверняка знаете не хуже меня – это свернуть, развернуть и закрыть.
По краям окна находится синяя окантовка или бордюр. Большая часть окна заполнена белым цветом – это клиентская часть. Именно в этой части окна мы и будем выводить наши графические рисунки.
Любое цифровое изображение формируется с помощью точек, которые называются пикселями. Они достаточно малы по сравнению с самим изображением, поэтому мы их не видим. Каждая точка в зависимости от изображения имеет свой цвет. Все вместе пиксели разных цветов и формируют понятное нам изображение.
Вся клиентская часть нашего окна поделена на точки (пиксели), которые имеют свои собственные координаты. Отчёт точек начинается с верхнего левого угла. Для того, что бы было понятно можно условно провести с лева на право ось Х, и с верху в низ ось У. Наглядно это демонстрирует следующий рисунок, на котором изображена буква Т:

На рисунке закрашенными в чёрный цвет являются пиксели со следующими координатами: (2;2), (3;2), (4;2), (5;2), (6;2), (4;3), (4;4), (4;5), (4;6). Здесь можно провести следующую аналогию: в консольном окне символы тоже имеют свои координаты, только там не оси Х и Y, а порядковый номер символа в строчке и номер строчки соответственно.
Здесь же стоит отметить, что если вы не сделали ни каких инициализирующих действий, то размер клиентской части нашего окна по умолчанию будет иметь размер 640х480 точек.
В данной главе изучение модуля GraphABC начнём с так называемых графических примитивов. К ним относятся следующие элементы: текст, точка, отрезок (линия), круг, окружность, дуга, прямоугольник, прямоугольник со скруглёнными краями и эллипс. Остальные возможности этого модуля будут приведены в виде обзора в 32 параграфе.
Текст. Текст рисуется с помощью следующей процедуры:
procedure TextOut (x,y: integer; s: string); – выводит строку s в прямоугольник с координатами левого верхнего угла (x,y). Пример:
TextOut( 10 , 10 , ‘Привет всем!’ );

Шрифт текста, который рисуется с помощью данной процедуры можно менять следующими подпрограммами:
procedure SetFontSize (size: integer); – устанавливает размер шрифта в пунктах.
function FontSize : integer; – возвращает размер шрифта в пунктах.
procedure SetFontName (name: string); – устанавливает имя шрифта.
function FontName : string; – возвращает имя шрифта.
procedure SetFontColor (c: Color); – устанавливает цвет шрифта. О цветах поговорим отдельно в следующем подразделе.
function FontColor : Color; – возвращает цвет шрифта.
procedure SetFontStyle (fs: integer); – устанавливает стиль шрифта.
function FontStyle : integer; – возвращает стиль шрифта.
В модуле GraphABC определены следующие константы для установки стилей шрифта:
- fsNormal – обычный;
- fsBold – жирный;
- fsItalic – наклонный;
- fsBoldItalic – жирный наклонный;
- fsUnderline – подчеркнутый;
- fsBoldUnderline – жирный подчеркнутый;
- fsItalicUnderline – наклонный подчеркнутый;
- fsBoldItalicUnderline – жирный наклонный подчеркнутый.
function TextWidth (s: string): integer; – возвращает ширину строки s в пикселях при текущих настройках шрифта.
function TextHeight (s: string): integer; – возвращает высоту строки s в пикселях при текущих настройках шрифта.
var x,y, //Координаты для вывода текста
xTemp,yTemp: byte ; //Координаты для вывода второй строки
SetFontName( ‘Times New Roman’ );
//Выводим первую строку
TextOut(x,y, ‘Привет всем!’ );
//Формируем координату для второй строки
xTemp:=x+Round(TextWidth( ‘Привет всем!’ )/ 2 )-
Round(TextWidth( ‘Дорогие друзья!’ )/ 2 );
//Выводим вторую строку
TextOut(xTemp,yTemp, ‘Дорогие друзья!’ );

Обратите внимание, что при формировании координат для второй строки, была использована функция Round, округляющая вещественное число до ближайшего целого. Дело в том, что координаты пикселей могут иметь только целые значения.
Так же обратите внимание на то, что в данном примере мы вывели первую строку, используя координаты x,y. Координаты для второй строки были рассчитаны относительно этих же координат. В таком случае можно менять координаты x и y, и при этом строки относительно друг друга своё положение не изменят. Так же можно менять размер и стиль шрифта. Например, если сделаем x=10,y=20, размер шрифта равным 10 и стиль шрифта fsBold, то получим следующий результат :

Здесь координаты x,y являются абсолютными, а xTem, yTemp – относительными. Очень часто заранее неизвестно, где будет находиться тот или иной элемент изображения. Поэтому необходимо во время выполнения программы вычислять его координаты относительно какого-либо другого элемента. Отсюда и название – относительные координаты.
Цвета. Всего в модуле GraphABC определено 141 константа для установки цвета. Все они начинаются с префикса cl, поэтому, набрав этот префикс, вам всплывёт подсказка, в которой вы увидите весь список доступных цветов. Для этого должна быть включена подсказка по нажатию клавиш. Об этом речь шла в 16-ом параграфе. Так же про цвета вы можете узнать в справке в пункте: «Стандартные модули -> Модуль GraphABC -> GraphABC: цветовые константы».
Плюсом к вышесказанному о цветах предлагаю написать небольшую программку, которая будет выводить цвет и его название:
var mC: array [ 1..141 ] of Color;
mC[ 1 ]:=clAquamarine;
mC[ 140 ]:=clYellow;
mC[ 141 ]:=clYellowGreen ;
for var i:= 1 to 141 do
Rectangle(x,y,x+ 100 ,y+ 10 );
TextOut(x,y+ 10 ,mC[i].Name);
if x> 1200 then begin x:= 5 ; y:=y+ 35 end ;

В целях экономии бумаги, заполнение всего массива цветов приводить не стал. Если будете сами набирать данную программу, то можете скопировать константы из справки.
Так же стоит сказать, что тип Color – структурированный тип запись. Поэтому он имеет поле Name, в котором содержится имя цвета. Для того, что бы использовать этот цвет в программе к этому имени необходимо добавить префикс cl.
В предыдущем абзаце было сказано, что тип Color – тип запись. Это не совсем верно. В дальнейшем, когда будем изучать ООП, мы узнаем что такое на самом деле тип Color. На данном этапе предлагаю воспринимать его, как тип запись.
Точка. Для того, что бы нарисовать или стереть точку имеется следующая процедура:
procedure SetPixel (x,y: integer; c: Color); – закрашивает пиксель с координатами (x,y) цветом c.
Если необходимо стереть точку, то на её месте можно нарисовать точку цвета окружающего фона. Для того что бы узнать цвет окружающего фона есть процедура, которая позволяет узнать цвет точки в определённом месте:
function GetPixel (x,y: integer): Color; – возвращает цвет пикселя с координатами (x,y).
С помощью процедуры SetPixel удобно рисовать графики всевозможных функций. Например, следующий код демонстрирует вывод синусоидальной функции на экран:
for var i:= 1 to 640 do
SetPixel(i,Round(Sin(i/ 8 )* 10*(-1) + 20 ),clBlack);

Здесь хочу заострить ваше внимание на следующем нюансе: для формирования координаты Y, написано следующее выражение:
Sin(i/ 8 )* 10*(-1) + 20
Поделив i на 8, мы увеличили период, т.е. растянули график по оси Х. Помножив на 10, мы увеличили амплитуду. Т.е. растянули график по оси У. Т.к. обычно ось Y всегда направлена снизу вверх, то пользователю будет нелепо видеть, что синусоидальная функция вначале убывает, а потом возрастает. Поэтому нам необходимо было помножить получившееся значение на -1 для того что бы перевернуть график. Добавив 20, мы сместили график в низ на 20 пикселей. При этом мы получили довольно красивую картинку.
Без этих манипуляций, т.е. просто написав Round(sin(i)), мы бы получили не работающую программу т.к. получили бы отрицательные значения по оси Y, а т.к. пикселей с отрицательными координатами нет, то программа во время выполнения закрылась бы с ошибкой. Но даже если мы добавим 20 и тем самым сместим график вниз, то всё равно получится не со всем то, что бы хотел увидеть пользователь:

К чему все эти рассуждения. Дело в том, что при выводе результатов каких либо вычислений на экран, вам придётся заботиться о том, что бы они были удобными для восприятия пользователем.
Отрезок. Самая простая процедура для рисования отрезка – это:
procedure Line (x1,y1,x2,y2: integer; c: Color); – рисует отрезок от точки (x1,y1) до точки (x2,y2) цветом c. Думаю, что здесь всё понятно, никаких дополнительных пояснений не требуется.
Есть ещё одна процедура:
procedure LineTo (x,y: integer; c: Color); – рисует отрезок от текущей позиции до точки (x,y) цветом c. Текущая позиция при этом переносится в точку (x,y) . Здесь стоит остановиться на том, что такое текущая позиция. Так же как и при работе с типизированными файлами существует некая переменная, которая хранит в себе координаты текущей позиции. Текущую позицию можно изменить с помощью следующей процедуры:
procedure MoveTo (x,y: integer); – устанавливает текущую позицию рисования в точку (x,y).
С помощью процедуры LineTo удобно рисовать непрерывную ломаную линию:
for var i:= 1 to 64 do
LineTo(i* 10 ,Random( 1 , 29 ),clBlack);
for var i:= 1 to 64 do
LineTo(i* 10 ,Random( 30 , 59 ),clBlack);

При вызове процедур Line и LineTo цвет в качестве параметра можно не указывать. Тогда рисование линии будет происходить цветом, который установлен в свойствах пера. Здесь стоит отметить, что рисование линий и контуров других примитивов происходит как бы пером, поэтому цвет, толщина линии и стиль линии зависят от того как настроено перо.
Подпрограммы для настройки пера.
procedure SetPenColor (c: Color); – устанавливает цвет пера.
function PenColor : Color; – возвращает цвет пера.
procedure SetPenWidth (Width: integer); – устанавливает ширину пера в пикселях.
function PenWidth : integer; – возвращает ширину пера в пикселях.
procedure SetPenStyle (style: DashStyle ); – устанавливает стиль пера.
function PenStyle : DashStyle; – возвращает стиль пера.
Стили пера бывают следующие:
- psSolid – сплошное перо;
- psClear – прозрачное перо;
- psDash – штриховое перо;
- psDot – пунктирное перо;
- psDashDot – штрихпунктирное перо;
- psDashDotDot – альтернативное штрихпунктирное перо.
Далее пример, в котором настроенное перо рисует штриховую линию коричневого цвета, шириной в 3 пикселя:
for var i:= 1 to 32 do
LineTo(i* 20 ,Random( 1 , 29 ));

В данном параграфе мы познакомились с модулем GraphABC. Научились выводить в графическое окно текст и линию. А так же научились закрашивать пиксель определённым цветом и настраивать перо.
1. Начертить графики следующих функций, в диапазоне значений параметра
от 0 до 12: а)
; б)
; б)
.
2. Перечертить на экран чертёж, представленный на рисунке в относительных координатах. Так же масштаб рисунка должен задаваться константой, при этом при смене масштаба рисунок должен сохранять пропорции. Размеры и выносные линии чертить не надо.

const m= 20 ; //Массштаб — 20 пикселей это одно реальное значение
var rX,rY: real ; //реальные значения параметров функции
//Чертим оси координат
Line( 20 , 100 , 285 , 100 );
Line( 30 , 20 , 30 , 110 );
//Стрелочки ось X
Line( 285 , 100 , 278 , 97 ); Line( 285 , 100 , 278 , 103 );
//Стрелочки ось Y
Line( 30 , 20 , 27 , 27 ); Line( 30 , 20 , 33 , 27 );
for var i:= 1 to 12 do
Line(temp, 90 ,temp, 110 );
TextOut(temp- 5 , 115 ,IntToStr(i));
for var i:= 1 to 3 do
var temp:= 100 -i*m;
Line( 25 ,temp, 35 ,temp);
TextOut( 15 ,temp- 8 ,IntToStr(i));
for var i:= 30 to 12 *m+ 30 do
SetPixel(i,Round(-m*rY+ 100 ),clRed);

В пунктах b и c код программы остаётся тот же, за исключением 32-ой строчки: