Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая паскаль.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
812.54 Кб
Скачать

2. Класс для реализации под dos

В базовом классе не был описан метод, позволяющий отрисовать объект на экране. Остальные методы класса полностью подходят для реализации объекта под DOS. Описание класса выглядит следующим образом:

TDosSquare=object(TKPSquare)

public

procedure Draw(ClientWidth,ClientHeight:integer);

end;

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

№ цвета

Цвет

RGB значение

№ цвета

Цвет

RGB значение

0

Чёрный

$000000

8

Серый

$555555

1

Синий

$AA0000

9

Яркосиний

$FF5555

2

Зелёный

$00AA00

10

Яркозелёный

$55FF55

3

Бирюзовый

$AAAA00

11

Яркобирюзовый

$FFFF55

4

Красный

$0000AA

12

Яркокрасный

$5555FF

5

Розовый

$AA00AA

13

Яркорозовый

$FF55FF

6

Коричневый

$00AAAA

14

Желтый

$55FFFF

7

Белый

$AAAAAA

15

ЯркоБелый

$FFFFFF

Соответственно преобразовывать цвет из 16-цветного в RGB будем через таблицу, а обратно – через поиск ближайшего цвета.

const rgbcolors:array[0..15] of longint = (

$000000,$AA0000,$00AA00,$AAAA00,$0000AA,$AA00AA,$00AAAA,$AAAAAA,

$555555,$FF5555,$00FF55,$FFFF55,$5555FF,$FF55FF,$55FFFF,$FFFFFF);

function GetEGAColor(rgb:longint):integer;

var i:integer;

minpos,mindist:integer;

testrgb,testdist:longint;

begin

mindist:=10000;

minpos:=0;

for i:=0 to 15 do begin

testrgb:=rgbcolors[i];

testdist:=

abs((rgb mod 256) - (testrgb mod 256))

+abs(((rgb div 256) mod 256) - ((testrgb div 256) mod 256))

+abs(((rgb div 65536) mod 256) - ((testrgb div 65536) mod 256));

if testdist<mindist then begin

mindist:=testdist;

minpos:=i;

end;

end;

GetEGAColor:=minpos;

end;

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

Для того, чтобы точка была квадратной, необходимо, чтобы разрешение по горизонтали и вертикали соответствовали отношению 4:3. Для режимов VGA это 640*480. Если используется другой режим, например 640*350, тогда необходимо все y координаты умножить на 350 и поделить на 480, чтобы изображение выглядело пропорциональным.

function convertsquareres(y:integer):integer;

var k:longint;

begin

k:=y;

k:=k*(getmaxy+1);

k:=k div 480;

convertmedtohigh:=k;

end;

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

procedure TDosSquare.Draw

(ClientLeft,ClientTop,ClientWidth,ClientHeight:integer);

var p:array[0..3] of pointtype;

i:integer;

begin

for i:=0 to 3 do begin

p[i].x:=GetVertexX(i)+ClientWidth div 2;

p[i].y:=convertsquareres(GetVertexY(i))+ClientHeight div 2;

end;

setviewport(ClientLeft, ClientTop, ClientLeft+ClientWidth, ClientTop+ClientHeight, true);

SetColor(GetEGAColor(LineColor));

SetLineStyle(0,0,3);

SetFillStyle(1,GetEGAColor(FillColor));

FillPoly(4,p);

if Diagonals then begin

MoveTo(p[0].X,p[0].Y);

LineTo(p[2].X,p[2].Y);

MoveTo(p[1].X,p[1].Y);

LineTo(p[3].X,p[3].Y);

end;

SetViewPort(0, 0, GetMaxX,GetMaxY, True)

end;