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

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
pascal:graph [13/11/2015 14:24] 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                         // Реакция на ошибку запуска графики  
- begin 
-   writeln('Error - ', h); 
-   writeln('Press ENTER for EXIT!');  // Ожидание  
-   readln;  
-   halt;                               // Выход из программы 
- end 
- else ... ;                            // Здесь - код для работы с графикой  
- 
- ...                                   // "Неграфическое" окончание программы (если есть) 
- 
-END. 
-</code> 
- 
  
 Пример работы с графикой в нашей системе. Пример работы с графикой в нашей системе.
Строка 57: Строка 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>
  
Строка 92: Строка 91:
 </code> </code>
  
-<code pascal | Изменение цвета экрана>+<code pascal | Изменение цвета экрана заливкой>
  
 uses oglgraph; uses oglgraph;
Строка 245: Строка 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>