- •Методические указания по выполнению курсовоЙ Работы
- •210601 Радиоэлектронные системы и устройства
- •Исходные данные к курсовой работе
- •Задание на курсовую работу
- •Объем курсовой работы
- •Выполнение курсовой работы
- •Защита курсовой работы
- •Методические указания по выполнению курсовой работы Порядок выполнения работы
- •1. Анализ объекта редактирования
- •2. Проектирование интерфейса программы.
- •3. Разработка ядра программы
- •Пример курсовой работы.
- •1. Анализ объекта редактирования Параметры редактирования
- •Формат файла.
- •Ini файл
- •Отображение на экране
- •Связанное с объектом действие.
- •2. Разработка интерфейса программы.
- •3. Разработка ядра программы
- •1. Базовый класс.
- •2. Класс для реализации под dos
- •3. Класс для реализации под Windows
- •Разработка алгоритма программы.
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;
