мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
pascal:graph [23/11/2011 09:55] ocapascal:graph [05/10/2018 12:39] (текущий) ybezrukov
Строка 1: Строка 1:
 ===== Графика в Паскале ===== ===== Графика в Паскале =====
-FIXME 
- 
-Пример работы с графикой в системе Borland (что тоже самое - Turbo) Pascal: 
- 
-<code pascal> 
-USES GRAPH 
-VAR H,k,l: INTEGER; 
-BEGIN 
- DetectGrahp(k,l); 
- InitGraph(k,l,'d:\tp7\bgi\'); 
- H:=GraphResult; 
- If h=0 then write('OK') elseWrite('Error'); 
-END. 
-</code> 
- 
  
 Пример работы с графикой в нашей системе. Пример работы с графикой в нашей системе.
Строка 29: Строка 14:
   initgraph(gd, gm, '');           // Открытие "графического окна"    initgraph(gd, gm, '');           // Открытие "графического окна" 
      
-{далее все, что Вы хотите нарисовать}+{далее все, что Вы хотите нарисовать, например:}
    
   setcolor(green);   setcolor(green);
Строка 42: Строка 27:
      
 end. end.
 +</code>
 +
 +<code pascal>
 +        Mx := GetMaxX div 2;
 + My := GetMaxY div 2;
 + for y := -my to my do
 + for x := -mx to mx do 
 + begin
 + n := 0;
 + c.x := x * 0.005;
 + c.y := y * 0.005;
 + z.x := 0;
 + z.y := 0;
 + while (sqr(z.x) + sqr(z.y) < max) and (n < iter) do 
 + begin
 + t := z;
 + z.x := sqr(t.x) - sqr(t.y) + c.x;
 + z.y := 2 * t.x * t.y+ c.y;
 + Inc(n);
 + if KeyPressed then 
 + Cancel := true;
 + end;
 + if n < iter then 
 + begin
 +        PutPixel(mx + x,my + y,16 - (n mod 16));
 + end;
 + if Cancel then 
 + exit;
 + end;
 </code> </code>
  
 ==== Примеры ==== ==== Примеры ====
  
-<code pascal | Определение размеров экрана для рисования рамки> +Среди примеров - часто возникающие задачи. 
-uses oglgraph;+ 
 +<code pascal | Определение размеров экрана для рисования рамки экрана> 
 + 
 +uses oglgraph;          { Подключаем нашу библиотеку }
  
 var  var 
Строка 59: Строка 76:
  
   maxx := getmaxx();     { Выясняем ширину экрана}   maxx := getmaxx();     { Выясняем ширину экрана}
-  maxy := getmaxy();     { Выясняем высоту экрана  - внимание! правильно работает  +  maxy := getmaxy();     { Выясняем высоту экрана}  
-                           только после вызова initgraph }+   
 +  {Внимание! Функции getmaxx и getmaxy правильно работают только после вызова initgraph }
  
   setcolor(blue);        { устанавливаем синий цвет для рисования линий }   setcolor(blue);        { устанавливаем синий цвет для рисования линий }
Строка 72: Строка 90:
 end. end.
 </code> </code>
 +
 +<code pascal | Изменение цвета экрана заливкой>
 +
 +uses oglgraph;
 +
 +var 
 +  gd, gm: smallint;
 +  color : integer;
 +  
 +begin
 +  gd := Detect;
 +  gm := DetectMode;
 +  initgraph(gd, gm, ''); 
 +
 +    color := white;                      {выбираем цвет с помощью описанной в библиотеке константы white}
 +    setBkColor(color);                   {устанавливаем "нужный" цвет фона - ничего не происходит}
 +    cleardevice;                         {"очищаем" экран нужным цветом - установленным цветом фона } 
 +  
 +    ...                                  {Можно что-то рисовать}
 +  
 +  repeat until graphkeypressed;        { Сохраняем рисунок на экране до нажатия кнопки} 
 +
 +  closegraph();           
 +end.
 +</code>
 +
 +Другой способ
 +
 +<code pascal | Изменение цвета экрана>
 +
 +    ...
 +  initgraph(gd, gm, ''); 
 +
 +    color := white;                      {выбираем цвет с помощью описанной в библиотеке константы white}
 +    setfillstyle(1, color);              {устанавливаем "нужный" цвет и способ "штриховки" при заливке - ничего не происходит}
 +    floodfill(0,0,red);                  {"заливаем" экран нужным цветом - установленным цветом заливки, 
 +                                         пока не наткнёмся на красный, которого нет } 
 +    ...                                  {Можно что-то рисовать}
 +  
 +</code>
 +
 +
  
 ==== Процедуры и функции ==== ==== Процедуры и функции ====
Строка 184: Строка 244:
  
  
 +==== Работа с клавиатурой ====
 +
 +В графическом режиме обработка событий клавиатура происходит очень похоже на текстовый режим, так как реализованы аналоги функций readkey и keypressed из модуля crt. В модуле oglgraph они называются graphreadkey и graphkeypressed. Функция graphkeypressed служит для определения события нажатия на клавиатуру, это логическая функция, которая возвращает два значения: истина или ложь. Обычно результатом ее работы будет всегда false, кроме того случая если нажата какая-нибудь клавиша на клавиатуре. В примерах выше это ее поведение используется для остановки выполнения программы перед закрытием графического режима:
 +
 +<code pascal> repeat until graphkeypressed;</code>
 +
 +Когда выполнение программы доходит до приведенной строки, запускается цикл repeat-until, который работает до тех пор, пока условие не станет истинным, что в нашем случае произойдет только при нажатии любой клавиши.
 +
 +Функция graphreadkey так же реагирует на нажатия, но в результате работы возвращает скан-код клавиши, т.е. уникальное целочисленное значение, которое соответствует коду клавиши, генерируемому контроллером клавиатуры.
 +
 +<code pascal> code := graphreadkey;</code>
 +
 +
 +Особенностью это функции является то, что она блокирует исполнение программы до того момента пока не будет нажата клавиша. Если же требуется реализовать работу с клавиатурой, которая бы не останавливала работу программы, то в этом случае нужно предварительно сделать проверку на нажатие клавиши с помощью graphkeypressed:
 +
 +<code pascal>
 +if graphkeypressed then
 +    code := graphreadkey; 
 +</code> 
 +
 +Напишем программу, которая опрашивает клавиатуру и выводит на экран коды клавиш:
 +
 +<code pascal>
 +uses oglgraph;
 +var
 +  gd, gm, code: smallint;
 +  
 +begin
 +  gd := Detect;
 +  gm := DetectMode;
 +  initgraph(gd, gm, '');
 +  
 +  while true do
 +  begin
 +     if graphkeypressed then
 +     begin
 +        code := graphreadkey; 
 +        writeln(code);
 +     end;   
 +  end;
 +  closegraph;
 +end.
 +
 +</code>