Как сделать радугу в паскаль

Добавил пользователь Алексей Ф.
Обновлено: 05.10.2024

Репутация: 2

Я нашёл этот код, но мне нужен перелив цветов от красного до синего (через зелёный, по спектру). А этот делает перелив от синего до красного и снова до синего.

type
rgb = record
r,
g,
b : byte
end;
paltype = array[0..255] of rgb;

procedure GradientPal (var pal: paltype);
var i: byte;
begin
For I := 0 To 255 Do
with pal[i] do
begin
r := Round (Abs (127.0 * sin ( I * Pi/256.0)));
g := Round (Abs (127.0 * sin ( I * Pi/128.0)));
b := Round (Abs (127.0 * cos ( I * Pi/256.0)))
end;
end;

Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.

Репутация: 2

Репутация: 2

если нужен фиолетовый, тогда на три части подели диапазон, а не на две, как у меня. но тогда к красному все вернется

Репутация: 3

Господа, раз уж речь зашла о спектрах, подскажите, пожалуйста, как вообще получить на экране плавный переход хотя бы от черного к белому, то есть от $000000 до $FFFFFF. Нет, вычислить это я могу. Но когда этими вычисленными по науке цветами рисуешь на canvas'e, получается жуткая зебра. Хорошо, оставим смешение цветов, возьмем от черного к красному, то есть от $000000 до $0000FF. Так опять ведь зебра выходит, если идти через 1. В полной мере ожиданиям соответсвуют только 8 цветов - чистые R,G,B, их смеси и черный цвет. А где мои 16 лет. то есть "16 миллионов цветов"? Как мне их расположить в человеческом порядке?

Репутация: 2

Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.

Репутация: 2

Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.

Репутация: 2

Бродяжник
по 255 градаций каждой компоненты - это и есть 24-битный цвет (256*256*256=16777216). какие нафиг полосы? ты наверное в 256-цветном режиме смотришь?

romtek
открой где-нибудь диалог выбора цвета и возьми оттуда несколько ключевых точек на нужные цвета, а потом проинтерполируй, наверное даже линейной хватит

Войти через uID

Анимация в Pascal ABC
Рисование шара
uses GraphABC;
var I,X,Y,D: integer;
begin
X:=20; Y:=30; D:=100;
ClearWindow;
SetBrushColor(clGreen);
Ellipse(X+I,Y,X+I+D,Y+D);
end.

Движение шара (без мерцания)
uses GraphABC;
var I,X,Y,D: integer;
begin
X:=20; Y:=30; D:=100;
LockDrawing;
for i:=1 to 500 do
begin
ClearWindow;
SetBrushColor(clGreen);
Ellipse(X+I,Y,X+I+D,Y+D);
Redraw;
Sleep(1);
end;
end.

LockDrawing
Блокирует вывод в графическое окно, осуществляя рисование только во внеэкранном буфере.
Redraw
Перерисовывает окна вывода при заблокированном выводе в графическое окно.

Столкновение двух шаров
( один шар движется, другой покоится)

uses GraphABC;
var I,X,Y,D,X1,X2: integer;
begin
X:=20; Y:=30; D:=70; X1:=350; X2:=500;
LockDrawing;
for I:=1 to X1-D do
// зеленый шар движется, красный стоит на месте
begin
ClearWindow;
SetBrushColor(clGreen);
Ellipse(X+I,Y,X+I+D,Y+D);
SetBrushColor(clRed);
Ellipse(X+X1,Y,X+X1+D,Y+D);
Redraw;
Sleep(5);
end;
for I:=X1 to X2 do
// зеленый шар стоит на месте, красный шар движется

begin
ClearWindow;
SetBrushColor(clGreen);
Ellipse(X+X1-D,Y,X+X1,Y+D);
SetBrushColor(clRed);
Ellipse(X+I,Y,X+I+D,Y+D);
Redraw;
Sleep(5);
end;
end.

1. Войдя в графический режим, определите ширину и высоту графического окна в пикселях. Выведите ее на экран, не выходя из графического режима.

2. Нарисуйте окружности радиусом 20 пикселов (а) в центре графического окна, (б) по углам окна.

3. С помощью процедур рисования линий нарисуйте квадрат со стороной 200 пикселов так, чтобы он отображался по центру окна.

4. Создайте процедуру, рисующую квадрат заданной величины по центру окна.

5. Отобразите в графическом окне 1000 точек (а) со случайными координатами, (б) со случайными координатами и лежащими внутри квадрата из предыдущей задачи.

Усложненный вариант: со случайными координатами, лежащими внутри заданной окружности.

6. Воспроизведите орнаменты, оформив рисование их отдельных элементов в виде процедур:

7. Нарисуйте домик, над которым светит солнышко.

Усложненный вариант: (а) Солнышко имеет лучики, (б) солнышко движется по небу: картинка рисуется процедурой, параметрами которой является координаты солнышка.

8. Воспроизведите рисунки, полученные с помощью поворотов треугольника и окружности:

9. Нарисуйте график функции . Параметрами процедуры должны быть интервал значений t, амплитуда a, частота и количество точек, выводимых на график.

1 комментарий

Солнышко движется по небу o_O

А еще, хорошо бы, оно при этом лучилось! Как-то так:

Я думал, что Паскаль не настолько развит :D

Здравствуйте! Не могли бы вы показать решение восьмого задания, где требуется воспроизвести рисунки с помощью окружности (про треугольники не надо). Заранее премного благодарен.

Не могу сделать задание 1, у меня выводятся только стандартные ширина и высота, что изменить?:
uses
GraphABC;
var
ww,wh: integer;
begin
ww:= WindowWidth;
wh:= WindowHeight;
write(ww,’ ‘,wh);
end

Так, в общем, все правильно. Создалось графическое окно, ширина и высота которого, действительно 640х480.

а как узнать ширину и высоту если растянуть окно?
а в задании 6 переплетающиеся круги рисовать кругами или дугами? Кругами пробовала, но они накладываются друг на друга.

Можно растянуть окно, нажать Enter и получить его текущие размеры.

В 6 — и, правда, накладываются. Надо использовать процедуру DrawCircle. Рисует только окружность без заливки.

задание 5б:

Был текст программы

6 задание так получилось, (не стала точно соблюдать все пропорции):

Был текст программы

а лучики у солнца надо процедурой Line рисовать? а как выполнять заливку?

По стилю реализации приходит в голову следующее:

1) Напрашивается разбиение программы на три части (круги и линии по краям, узор, круги в середине). Соответствующие части можно было бы поместить в отдельные процедуры или, хотя бы, отделить друг от друга пустыми строками. Нужно чтобы структура программы была очевидна сразу, а не становилась понятна после нескольких минут внимательного вглядывания.

2) Явное использование числовых констант, как, например, в

3) Помню, когда еще работал преподавателем, требовал от студентов делать количество шагов спиралек в узоре параметром процедуры. Как раз, чтобы всю спиральку отдельными line’ми не рисовали. Злой был.

Но, в целом, все очень неплохо.

>> а лучики у солнца надо процедурой Line рисовать? а как выполнять заливку?

Лучики — да, это линии.
Цвет заливки:

Процедура Circle как раз и рисовала тебе залитую окружность. Просто цвет заливки по умолчанию белый.
Вообще, за разнообразными графическими процедурами можно сходить в справку по F1, раздел Стандартные модули \ Модуль GraphABC \ GraphABC: графические примитивы

временно один комп в семье на троих, поэтому над солнышком зависла на несколько дней)) правда у меня домик стирается и чтобы солнце лучилось ничего не придумывается, и мерцает оно сильно, подскажите, пожалуйста, что-нибудь))

Был текст программы

забыла про знаки, в конце после r1:=20 до ClearWindow идет кусок:
Solnce(x2,y2,r1);
while x2 меньше 640 do
begin
Solnce(x2,y2,r1);
x2:=x2+1;
ClearWindow;
end;
while x2 больше 0 do
begin
Solnce(x2,y2,r1);
x2:=x2-1;

Рисование средствами PascalABC происходит очень медленно. Пока оно идет, картинка на экране успевает много раз обновиться. Отсюда мерцание. То есть, мы видим не окончательную картинку, а процесс ее рисования. Окончательную картинку в общем-то не видим — как только она построилась, мы ее тут же стираем и начинаем новый цикл рисования. Для борьбы с этим эффектом придумали двойную буферизацию. Идея в том, чтобы сначала построить картинку в памяти (не выводя на экран), а затем отобразить новый кадр на экране целиком, без промежуточных вариантов, где не хватает половины лучиков.

В PascalABC оказывается есть поддержка двойной буферизации. Для этого в начале программы вызываем процедуру

После этого все команды рисования будут создавать картинку в памяти (в так называемом вторичном буфере). Непосредственно на экране ничего рисоваться не будет. После того, как очередной кадр анимации полностью отрисован (то есть перед ClearWindow), нужно вызвать процедуру

которая, собственно, и вызовет перерисовку всей картины.

На счет, чтобы лучилось, это скорее математическое творчество. Надо придумать формулу для изменения длины лучиков. Подсказывать не хочу — пусть у тебя по-своему лучиться ))

спасибо за комментарии, к сожалению так и не придумала формулу для лучения((( С процедурой LockDrawing действительно картинка не мерцает. А вот частично задание 8 (с треугольниками решила не заморачиваться):

uses
GraphABC;
var
x,y,r,i,z,z1,k: integer;
a,b: real;

procedure BolshoiKrug(x1,y1,r1: integer);
begin
DrawCircle(x1,y1,r1);
end;

begin
x:= 320;
y:=240;
r:=200;
a:=1.26;
BolshoiKrug(x,y,r);
for k:=1 to 5 do
begin
b:=a;
z:=x+round(r div 2 *cos(a));
z1:=y-round(r div 2*sin(a));
b:=b+0.04;
for i:=1 to 9 do
begin
z:=x+round(r div 2 *cos(b));
z1:=y-round(r div 2*sin(b));
DrawCircle(z,z1,r div 2);
b:=b+0.04;
end;
a:=a+1.26;
end;
end.

1) По возможности следует избегать явного использования числовых констант. Мысль стоящая, например, за операцией

по крайней мере, сходу не очевидна. Стоило бы ввести параметр для числа групп окружностей и выразить эту прибавку через него. Например,

2) Присваивание в начале

есть не что иное как задание угла поворота всей конструкции. Однако при повороте на 1.26 радиан картинка как раз не изменится. То есть это то же самое, что

во внешнем цикле бессмысленны, так как присвоенные значения нигде не используются.

4) Напрашивается замена

во внешнем цикле одной операцией. Впрочем, после такой замены становится очевидным, что прибавление 0.04 к b эквивалентно прибавлению его же к начальному значению a. То есть это просто еще один способ повернуть всю конструкцию теперь уже на 0.04 радиана. Думаю, этого не следует делать вовсе.

Ну, а в целом — да, задача решена.

program N13_6;
uses
GraphABC;
const
r = 17;
x0 = 5;
ww = WindowWidth-1;
y0 = 5;
wh = WindowHeight-1;
var
x, y:integer;

procedure Rectangle1(x, y:integer);
begin
x:=x0+2; y:=y0+2; MoveTo(x, y);
x:=ww-10; y:=y0+2; LineTo(x, y);
x:=ww-10; y:=wh-4; LineTo(x, y);
x:=x0+2; y:=wh-4; LineTo(x, y);
x:=x0+2; y:=y0+2; LineTo(x, y);
end;

procedure Rectangle2(x, y:integer);
begin
x:=x0+round(2.5*r); y:=y0+round(2.5*r); MoveTo(x, y);
x:=ww-round(3.1*r); y:=y0+round(2.5*r); LineTo(x, y);
x:=ww-round(3.1*r); y:=wh-round(2.7*r); LineTo(x, y);
x:=x0+round(2.5*r); y:=wh-round(2.7*r); LineTo(x, y);
x:=x0+round(2.5*r); y:=y0+round(2.5*r); LineTo(x, y);
end;

procedure Circle(x, y, r:integer);
begin
DrawCircle(x, y, r);
end;

procedure PerimetrCircle(x, y, r:integer);
var
i:integer;
begin
x:=r+10; y:=r+10;
for i:=1 to 34 do
begin
x:=x+r;
Circle(x, y, r);
end;

for i:=1 to 25 do
begin
y:=y+r;
Circle(x, y, r);
end;

for i:=1 to 34 do
begin
x:=x-r;
Circle(x, y, r);
end;

for i:=1 to 25 do
begin
y:=y-r;
Circle(x, y, r);
end;
end;

procedure BigCircle(x, y, r:integer);
var
i, x1, y1, r1, r2, r3:integer;
begin
r1:=67;
r2:=60;
r3:=7;
x1:=trunc(1.95*r1);
y1:=wh-3*r1;
for i:=1 to 6 do
begin
Circle(x1, y1, r1);
Circle(x1, y1, r2);
Circle(x1, y1, r3);
x1:=x1+r1+r3;
end;
end;

begin
Rectangle1(x, y);
Rectangle2(x, y);
PerimetrCircle(x, y, r);
Meandr(x, y);
BigCircle(x, y, r);
end.

program N13_7b;
uses
GraphABC;
var
a: integer;
Procedure Dom (x,y: integer); //левый нижний угол дома
var
P:array of Point;
P1:array of Point;
P2:array of Point;
P3:array of Point;
begin

SetLength(P,4); //количество вершин многоугольника массива P
SetPenWidth(3);
SetPenColor(clBlue);
SetBrushColor(clYellow);
p[0].x:=x; p[0].y:=y;
p[1].x:=x; p[1].y:=y-250;
p[2].x:=x+200; p[2].y:=y-250;
p[3].x:=x+200; p[3].y:=y;
Polygon(P);


SetLength(P1,3);
SetPenWidth(3);
SetPenColor(clBlue);
SetBrushColor(clBrown);
p1[0].x:=x+100; p1[0].y:=y-400;
p1[1].x:=x; p1[1].y:=y-250;
p1[2].x:=x+200; p1[2].y:=y-250;
Polygon(P1);


SetLength(P2,4);
SetPenWidth(1);
SetPenColor(clBlue);
SetBrushColor(clBrown);
p2[0].x:=x+15; p2[0].y:=y;
p2[1].x:=x+15; p2[1].y:=y-160;
p2[2].x:=x+85; p2[2].y:=y-160;
p2[3].x:=x+85; p2[3].y:=y;
Polygon(P2);

for i:= 1 to n div 2 -1 do
begin
x1:= x+round(r1*cos(a));
y1:= y+round(r1*sin(a));
x2:= x+round(r2*cos(a));
y2:= y+round(r2*sin(a));
a:=a+a1;
MoveTo(x1,y1);
LineTo(x2,y2);
z:=z+1;
x1:= x+round(r1*cos(a));
y1:= y+round(r1*sin(a));
x2:= x+round(r3*cos(a));
y2:= y+round(r3*sin(a));
a:=a+a1;
MoveTo(x1,y1);
LineTo(x2,y2);
end;
end;
begin
Dom(50,470);
repeat
a:=350;
repeat
Solnce (a,120);//центр солнца
sleep(100);
ClearWindow;
Dom(50,470);
a:=a+5;
until a>=750;
until false;
end.

В современных компьютерах изображения на экране строятся в виде растров, и всегда прямоугольных.

Пример растра и изображения, построенного на нем:

Пример растра и изображения

На рисунке вы видите сильно увеличенную картинку, на самом же деле элементарные точки, из которых состоит изображение, или пиксели, должны быть очень маленькими, чтобы глаз воспринимал картинку как единое целое. Пиксель ( Pixel ) – сокращение от Picture Element (элемент рисунка).

Экраны цветных мониторов состоят из прямоугольной решетки точек (пикселей), светящихся разным цветом. Каждый цветной пиксель образован тремя более мелкими по площади участками красного, зеленого и синего цветов. При свечении этих участков с разной интенсивностью цвета смешиваются, создавая элементы изображения различных оттенков и яркости.

Важной характеристикой растра является его расширение, т.е. количество точек (пикселей) на единицу длины. Чем это число выше, тем более мелкими являются сами пиксели, и, соответственно, более плотно они располагаются на плоскости, что и приводит к тому, что мы воспринимаем их как единое, цельное изображение. Из года в год разрешающая способность мониторов, принтеров, сканеров и т.п. растет.

Итак, на растровом устройстве отображения любая фигура состоит из множества точек пикселей. Естественно, положение каждой точки изображения задано координатами X и Y . Координаты – целые числа, они задают номера колонки и строки растра и не зависят от физического размера экрана. Оси координат направлены следующим образом: горизонтальная ось X направлена слева направо; вертикальная ось Y направлена сверху вниз; верхний левый угол имеет координаты (0,0).

Очевидно, что запись изображения требует хранения информации о положении множества точек, для каждой из которых должен быть задан цвет. Цветное изображение получается смешиванием трех основных цветов – красного, зеленого и синего. Такая модель представления цвета называется моделью RGB ( Red - Green - Blue ). Управляя интенсивностью компонентов, можно получить различные оттенки и степени интенсивности цвета. В частности, для получения градаций серого надо взять интенсивности трех основных цветов равными друг другу.

В современных SVGA мониторах предусмотрено, как правило, по 2 6=64 уровня интенсивности каждого из основных цветов, таким образом, в целом можно получить (2 6) 3=262144 цвета. Для представления большего числа цветов необходим больший объем памяти. Один бит может кодировать два цвета: 1 – белый, 0 – черный. Два бита могут хранить 2 2=4 цветовых комбинации, 4 бита – 16, 8 бит – 256, 16 бит – 65536, 32 бита – 4294967296.

Важное понятие в машинной графике – графический примитив – совокупность пикселей, определяющая некоторую геометрическую фигуру. Наиболее распространенные примитивы – это точка, линия, прямоугольник, закрашенный прямоугольник, окружность и эллипс.

Растровые изображения обладают одним очень существенным недостатком: их трудно увеличивать или уменьшать, т.е. масштабировать. При уменьшении растрового изображения несколько соседних точек преобразуются в одну, поэтому теряется разборчивость мелких деталей. При увеличении – увеличивается размер каждой точки, поэтому появляется ступенчатый эффект. Кроме того растровые изображения занимают много места в памяти.

Чтобы избежать указанных проблем, изобрели так называемый векторный способ кодирования изображений.

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

Формирование изображения на экране

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

Участок оперативной памяти компьютера, где хранится информация об изображении, появляющемся на экране, называется видеопамятью. Иногда эту область называют видеобуфером. Видеопамять занимает определенную область в адресном пространстве оперативной памяти компьютера, следовательно, видеопамять имеет ограниченный размер.

Видеопамять и похожа, и в то же время не похожа на RAM . Обычная память соединена с центральным процессором специальным устройством, которое называется шина данных. Не останавливаясь подробнее на конструкции шины данных, скажем лишь, что это просто пакет проводов, количество которых кратно двум. Можно сказать, что чем больше проводов в пакете, тем быстрее происходит обмен данными между процессором и памятью. Современные Pentium -машины имеют 32-разрядную шину, т.е. процессор может сразу читать 4 байта из памяти (и столько же в нее записывать). Разрядность шины данных – одно из самых узких мест в конструкции компьютера.

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

Электронная схема, сканирующая видеобуфер и преобразующая двоичные числа в видеосигнал, называется адаптером видеодисплея или просто видеоадаптером.

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

Движение луча по экрану происходит с огромной скоростью. Чтобы изображение, которое воспринимает человек, не было мерцающим, весь цикл – от первой до последней строки – должен быть закончен за 1/60 секунды (или еще быстрее). Следовательно, за секунду происходит не менее 60 проходов луча по всему экрану, строка за строкой. Такая схема формирования изображения называется растром. После того, как луч доходит до последней точки последней строки (до правого нижнего угла экрана), он мгновенно по диагонали переносится в начало первой строки экрана (левый верхний угол), и процесс повторяется.

Формирование цветного изображения осуществляется не одним, а тремя электронными лучами (красным, зеленым и синим), перемещающимся по экрану одновременно. Три луча подсвечивают сразу три элемента экрана, расположенных на очень незначительном угловом расстоянии друг от друга, поэтому человеческий глаз воспринимает эти три элемента как одну точку. Благодаря различной интенсивности свечения каждой из трех точек и эффекту аддитивного смешения трех цветов такая составная точка может иметь любой цветовой оттенок. Качество изображения тем выше, чем меньше расстояние между двумя отдельными точками. В современных мониторах расстояние между точками не превышает 0.25–0.26 мм.

Вернемся к видеоадаптеру. Помимо всего прочего, он должен подавать специальные синхронизирующие сигналы электронной пушке для правильного формирования изображения на экране. Первый синхронизирующий сигнал – V -сигнал – подается для начала сканирования экрана; второй сигнал – H -сигнал – для начала сканирования очередной строки. Кроме того, видеоадаптер должен управлять интенсивностью сканирующего луча. Интенсивность луча может меняться при прохождении каждой растровой точки, а значит можно произвольно менять и интенсивность свечения точки.

Существует два принципиально разных способа указания интенсивности свечения пикселя.

Первый применяется в так называемых цифровых мониторах. В этом случае для каждой точки монитору подается информация об ее интенсивности в виде двоичного числа. Используя аддитивную модель, передавая два бита для каждого цвета (красный, зеленый и синий), из которых формируется цвет точки, можно получить 64 цвета (4*4*4). Однако при увеличении количества цветов нужно увеличивать и количество битов для каждого цвета (т.е. количество проводов для каждого цвета).

Поэтому конструкторы мониторов, в конце концов, отказались от цифровой схемы и пришли к аналоговой. При этой схеме сигналы V и H остаются по-прежнему цифровыми, а сигналы о трех составляющих цвета становятся аналоговыми и поступают по трем проводам. На каждом проводе поддерживается напряжение от 0 до 1 вольта с плавным переходом из одного состояния в другое. Ноль вольт на проводе указывает на отсутствие свечения, 1 вольт – на максимальное свечение. При такой схеме каждый из трех цветов условно может принимать бесконечное число оттенков. Следовательно, таким образом можно задавать десятки миллионов цветов.

Работа с графикой в Паскале

Инициализация графического режима. Множество графических процедур и функций среды программирования Pascal собраны в модуле Graph . Для подключения библиотеки графических функций и процедур необходимо подключить модуль к вашей программе строкой

Формирование изображения на экране

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

Участок оперативной памяти компьютера, где хранится информация об изображении, появляющемся на экране, называется видеопамятью. Иногда эту область называют видеобуфером. Видеопамять занимает определенную область в адресном пространстве оперативной памяти компьютера, следовательно, видеопамять имеет ограниченный размер.

Видеопамять и похожа, и в то же время не похожа на RAM . Обычная память соединена с центральным процессором специальным устройством, которое называется шина данных. Не останавливаясь подробнее на конструкции шины данных, скажем лишь, что это просто пакет проводов, количество которых кратно двум. Можно сказать, что чем больше проводов в пакете, тем быстрее происходит обмен данными между процессором и памятью. Современные Pentium -машины имеют 32-разрядную шину, т.е. процессор может сразу читать 4 байта из памяти (и столько же в нее записывать). Разрядность шины данных – одно из самых узких мест в конструкции компьютера.

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

Электронная схема, сканирующая видеобуфер и преобразующая двоичные числа в видеосигнал, называется адаптером видеодисплея или просто видеоадаптером.

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

Движение луча по экрану происходит с огромной скоростью. Чтобы изображение, которое воспринимает человек, не было мерцающим, весь цикл – от первой до последней строки – должен быть закончен за 1/60 секунды (или еще быстрее). Следовательно, за секунду происходит не менее 60 проходов луча по всему экрану, строка за строкой. Такая схема формирования изображения называется растром. После того, как луч доходит до последней точки последней строки (до правого нижнего угла экрана), он мгновенно по диагонали переносится в начало первой строки экрана (левый верхний угол), и процесс повторяется.

Формирование цветного изображения осуществляется не одним, а тремя электронными лучами (красным, зеленым и синим), перемещающимся по экрану одновременно. Три луча подсвечивают сразу три элемента экрана, расположенных на очень незначительном угловом расстоянии друг от друга, поэтому человеческий глаз воспринимает эти три элемента как одну точку. Благодаря различной интенсивности свечения каждой из трех точек и эффекту аддитивного смешения трех цветов такая составная точка может иметь любой цветовой оттенок. Качество изображения тем выше, чем меньше расстояние между двумя отдельными точками. В современных мониторах расстояние между точками не превышает 0.25–0.26 мм.

Вернемся к видеоадаптеру. Помимо всего прочего, он должен подавать специальные синхронизирующие сигналы электронной пушке для правильного формирования изображения на экране. Первый синхронизирующий сигнал – V -сигнал – подается для начала сканирования экрана; второй сигнал – H -сигнал – для начала сканирования очередной строки. Кроме того, видеоадаптер должен управлять интенсивностью сканирующего луча. Интенсивность луча может меняться при прохождении каждой растровой точки, а значит можно произвольно менять и интенсивность свечения точки.

Существует два принципиально разных способа указания интенсивности свечения пикселя.

Первый применяется в так называемых цифровых мониторах. В этом случае для каждой точки монитору подается информация об ее интенсивности в виде двоичного числа. Используя аддитивную модель, передавая два бита для каждого цвета (красный, зеленый и синий), из которых формируется цвет точки, можно получить 64 цвета (4*4*4). Однако при увеличении количества цветов нужно увеличивать и количество битов для каждого цвета (т.е. количество проводов для каждого цвета).

Поэтому конструкторы мониторов, в конце концов, отказались от цифровой схемы и пришли к аналоговой. При этой схеме сигналы V и H остаются по-прежнему цифровыми, а сигналы о трех составляющих цвета становятся аналоговыми и поступают по трем проводам. На каждом проводе поддерживается напряжение от 0 до 1 вольта с плавным переходом из одного состояния в другое. Ноль вольт на проводе указывает на отсутствие свечения, 1 вольт – на максимальное свечение. При такой схеме каждый из трех цветов условно может принимать бесконечное число оттенков. Следовательно, таким образом можно задавать десятки миллионов цветов.

Инициализация графического режима. Множество графических процедур и функций среды программирования Pascal собраны в модуле Graph . Для подключения библиотеки графических функций и процедур необходимо подключить модуль к вашей программе строкой

Взаимодействие программы и видеосистемы в графических режимах обеспечивают драйверы. Драйверы собраны в файлах, имеющих расширение BGI : CGA . BGI , EGAVGA . BGI , HERC . BGI , IBM 8514. BGI , ATT . BGI , PC 3270. BGI и др. Драйвер – это специальная программа, осуществляющая управление тем или иным техническим средством ПК. Графический драйвер управляет графическим адаптером в графическом режиме.

Графические возможности конкретного адаптера определяются разрешением экрана, т.е. общим количеством пикселей, а также количеством цветов. Кроме того, многие адаптеры могут работать с несколькими графическими страницами.

Для инициализации графического режима используется процедура:

Где Driver – переменная типа integer , определяющая тип графического драйвера; Mode – переменная того же типа, задающая режим работы графического адаптера; Path – выражение типа string , содержащее путь доступа к файлу драйвера.

Читайте также: