Смекни!
smekni.com

Структура данных программного комплекса Q-дерево (стр. 3 из 4)

· Процедура является методом класса TMainForm

· Параметры

- входной параметр – объект, сгенерировавший событие (тип TObject)

· Словесный алгоритм

Процедура устанавливает границы главного квадранта и выделенной области, начальные координаты для текущей и выбранной точек.

2.2.5.5ПроцедураShapeViewMouseDown

· Процедура предназначена для получения начальных координат указателя мыши перед началом перетаскивания выделяющего окна

· Процедура является методом класса TMainForm

· Параметры

- входной параметр – объект, сгенерировавший событие (тип TObject);

- входной параметр – индикатор нажатой кнопки мыши (тип TMouseButton);

- входной параметр – индикатор нажатой клавиши (тип TShiftState);

- входные параметры – координаты указателя мыши (тип integer)

· Словесный алгоритм

Координаты указателя записываются в глобальные переменные X0 и Y0. Индикатору перетаскивания drag присваивается true.

2.1.5.6 Процедура ShapeViewMouseUp

· Процедура предназначена для установки значения соответствующего индикатора при окончании перетаскивания окна выделения

· Процедура является методом класса TMainForm

· Параметры

- входной параметр – объект, сгенерировавший событие (тип TObject);

- входной параметр – индикатор нажатой кнопки мыши (тип TMouseButton);

- входной параметр – индикатор нажатой клавиши (тип TShiftState);

- входные параметры – координаты указателя мыши (тип integer)

· Словесный алгоритм

Индикатору перетаскивания drag присваивается false.

2.1.5.7 ПроцедураShapeViewMouseMove

· Процедура предназначена для перемещения окна выделения по малой карте и вывода на карту изображений точек из выделенной области

· Процедура является методом класса TMainForm

· Параметры

- входной параметр – объект, сгенерировавший событие (тип TObject);

- входной параметр – индикатор нажатой клавиши (тип TShiftState)

- входные параметры – координаты указателя мыши (тип integer)

· Предусловия

Индикатор перетаскивания должен быть равен true.

· Локальные переменные

- newLeft, newTop – новые координаты окна выделения (тип integer)

· Словесный алгоритм

Процедура вычисляет новые координаты окна выделения и области просмотра с использованием глобальных переменных X0 и Y0; затем осуществляет поиск и вывод на карту изображений точек из новой области с помощью процедуры DrawRegion.

2.1.5.8ПроцедураMaxImageMouseMove

· Процедура предназначена для отображения координат выделяемых точек в строке состояния и выделения их изображений на карте

· Процедура является методом класса TMainForm

· Параметры

- входной параметр – объект, сгенерировавший событие (тип TObject);

- входной параметр – индикатор нажатой клавиши (тип TShiftState);

- входные параметры – координаты указателя мыши (тип integer)

· Локальные переменные

- Point – выделенная точка (тип TPoint);

- Rect – область поиска точки в дереве (тип TRect);

- str – строка с координатами выбранной точки (тип string);

- List – список точек, найденных в области вблизи указателя мыши

· Словесный алгоритм

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

2.1.5.9 Процедура MaxImageClick

· Процедура предназначена для добавления точки в дерево и «запоминания» координат выбранной точки

· Процедура является методом класса TMainForm

· Параметры

- входной параметр – объект, сгенерировавший событие (тип TObject)

· Локальные переменные

- Point – новая либо выбранная точка (тип TPoint);

- str – строка с координатами выбранной точки (тип string);

- i, j – координаты точки относительно окна просмотра (тип integer)

· Словесный алгоритм

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

2.1.5.10ПроцедураButtonDeleteClick

· Процедура предназначена для удаления выбранной точки из дерева

· Процедура является методом класса TMainForm

· Параметры

- входной параметр – объект, сгенерировавший событие (тип TObject)

· Словесный алгоритм

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

2.1.5.11ПроцедураButtonClearClick

· Процедура предназначена для удаления всех точек из дерева

· Процедура является методом класса TMainForm

· Параметры

- входной параметр – объект, сгенерировавший событие (тип TObject)

· Словесный алгоритм

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

2.1.5.12ПроцедураFormKeyDown

· Процедура осуществляет перемещение окна выделения при нажатии клавиш

· Процедура является методом класса TMainForm

· Параметры

- входной параметр – объект, сгенерировавший событие (тип TObject);

- выходной параметр – индикатор нажатой клавиши (тип word);

- входной параметр – индикатор нажатой клавиши (тип TShiftState)

· Локальные константы

– dif = 4 – число пикселей, на которое перемещается окно выделения

· Словесный алгоритм

Подпрограмма вызывает перемещающую окно выделения процедуру ShapeViewMouseMove, передавая ей разные параметры в зависимости от нажатой клавиши.


Заключение

Разработанный программный продукт обеспечивает выполнение всех требований, предъявленных к нему в техническом задании.

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


Список используемых источников

1 Сухарев М.В. Основы Delphi. Профессиональный подход – СПб.: Наука и Техника, 2004.

2 Кэнту М. Delphi 7: для профессионалов – СПб.: Питер, 2004.


Приложение

Текст программы

program Qtree;

usesForms,

UnitMainForm in 'UnitMainForm.pas' {MainForm},

UnitModel in 'UnitModel.pas';

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TMainForm, MainForm);

Application.Run;

end.

unit UnitModel;

interface

uses Classes;

constM = 3; //число точек в листе

type

//Тип узла дерева-----------------------------------

TNodeKind = (nkBranch, nkLeaf);

TPoint = record

X: real;

Y: real;

end;

TRect = record

X1, Y1, X2, Y2: real;

end;

//Массив для хранения точек в листе-----------------

TArrayOfPoints = array[1..M] of TPoint;

//Узел дерева---------------------------------------

PNode = ^TNode;

TNode = packed record

case Kind: TNodeKind of

nkBranch: (SZ, SV, YZ, YV: PNode);

nkLeaf: (Points: TArrayOfPoints;

PointsCount: integer);

end;

function InsertPoint(var Node: PNode; Bounds: TRect; Point: TPoint): boolean;

procedure DeletePoint(var Node: PNode; Bounds: TRect; Point: TPoint);

procedure ClearTree(var Node: PNode);

function Find(Node: PNode; const Bounds, Rect: TRect): TList;

implementation

//Установка характеристик нового листа =======================================

procedure SetProperties(var ChildNode: PNode);

begin

New(ChildNode);

ChildNode^.Kind:= nkLeaf;

ChildNode^.PointsCount:= 0; //в массиве нет точек

end;

//Копирование точек из листа в дополнительный массив =========================

procedure CopyPoints(Node: PNode; var DopArray: TArrayOfPoints; var i: integer);

var j: integer;

begin

for j:=1 to Node^.PointsCount do

begin

DopArray[i]:= Node^.Points[j];

inc(i);

end;

end;

//ВСТАВКА ТОЧКИ В ДЕРЕВО =====================================================

function InsertPoint(var Node: PNode; Bounds: TRect; Point: TPoint): boolean;

var CurNode: PNode; //текущий квадрант

DopArray: TArrayOfPoints; //дополнительныймассив (когдаделимузел)

i: integer;

midX, midY: real;

NewBounds: TRect;

begin

if Node = nil then

begin

New(Node);

Node^.Kind:= nkLeaf;

Node^.PointsCount:= 0;

end;

CurNode:= Node;

Result:= true;

with Bounds do

begin

while CurNode^.Kind = nkBranch do //если ветвь, то смотрим, куда идти

begin

midX:= (X2 - X1)/2 + X1;

midY:= (Y2 - Y1)/2 + Y1;

if Point.X < midX then

if Point.Y < midY then

begin

CurNode:= CurNode^.SZ;

X2:= midX;

Y2:= midY;

end

else

begin

CurNode:= CurNode^.YZ;

Y1:= midY;

X2:= midX;

end

else

if Point.Y < midY then

begin

CurNode:= CurNode^.SV;

X1:= midX;

Y2:= midY;

end

else

begin

CurNode:= CurNode^.YV;

X1:= midX;

Y1:= midY;

end;

end;

midX:= (X2 - X1)/2 + X1;

midY:= (Y2 - Y1)/2 + Y1;

end;

//Собственно вставка----------------------------------------------------------

//Проверить, есть ли место в массиве точек и нет ли уже там новой:

for i:=1 to CurNode^.PointsCount do

if (CurNode^.Points[i].X = Point.X)and(CurNode^.Points[i].Y = Point.Y) then

begin

Result:= false;

Exit;

end;

//Если массив не заполнен, вставляем точку...

if CurNode^.PointsCount < M then

begin

CurNode^.Points[CurNode^.PointsCount + 1]:= Point;

CurNode^.PointsCount:= CurNode^.PointsCount + 1;

end

else

begin

//...иначе делим лист на 4 новых:

DopArray:= CurNode^.Points;

CurNode^.Kind:= nkBranch;

SetProperties(CurNode^.SZ);

SetProperties(CurNode^.SV);

SetProperties(CurNode^.YZ);

SetProperties(CurNode^.YV);

//Распределение точек по узлам

fori:=1 toMdo

with Bounds do

if DopArray[i].X < midX then

if DopArray[i].Y < midY then

begin

NewBounds.X1:= X1;

NewBounds.X2:= (X2 - X1)/2 + X1;

NewBounds.Y1:= Y1;

NewBounds.Y2:= (Y2 - Y1)/2 + Y1;

InsertPoint(CurNode^.SZ, NewBounds, DopArray[i]);

end

else

begin

NewBounds.X1:= X1;

NewBounds.X2:= (X2 - X1)/2 + X1;

NewBounds.Y1:= (Y2 - Y1)/2 + Y1;

NewBounds.Y2:= Y2;

InsertPoint(CurNode^.YZ, NewBounds, DopArray[i]);

end

else

if DopArray[i].Y < midY then

begin

NewBounds.X1:= (X2 - X1)/2 + X1;

NewBounds.X2:= X2;

NewBounds.Y1:= Y1;

NewBounds.Y2:= (Y2 - Y1)/2 + Y1;

InsertPoint(CurNode^.SV, NewBounds, DopArray[i]);

end

else

begin

NewBounds.X1:= (X2 - X1)/2 + X1;

NewBounds.X2:= X2;

NewBounds.Y1:= (Y2 - Y1)/2 + Y1;