Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекції для 3ОТ1.doc
Скачиваний:
10
Добавлен:
21.02.2016
Размер:
16.31 Mб
Скачать

Контрольні питання

  1. Надати характеристику поняття программа

  2. Навести характеристику етапів розробки програм

  3. Надати характеристику етапу Специфікація

  4. Надати характеристику етапу Розробка алгоритму

  5. Надати характеристику етапу Кодування

  6. Надати характеристику етапу Відладка

  7. Надати характеристику етапу Тестування

  8. Надати характеристику етапу Створення довідкової системи

  9. Надати характеристику етапу Створеня установчого диску

АУДИТОРНЕ ЗАНЯТТЯ

ЗМІСТОВИЙ МОДУЛЬ 6: ПРОГРАМУВАННЯ З ГРАФАМИ. ВІЗУАЛЬНІ КОМПОНЕНТИ. БАЗИ ДАНИХ

ТЕМА 6.1: ГРАФИ

Лекція №34 – Побудова графів

План заняття

  1. Характеристика поняття графу

  2. Огляд структури графів Делфі

Граф определяется как последовательность вершин и дуг-ориентированный (ребер-неориентированный), в статье рассматривается ориентированный ациклический граф, основанный на графе сценариев в кампаниях hi. Если ориентированный граф не имеет циклов то его можно разложить по уровням- сначала выделяем вершины, в которые не входит ни одно ребро, они формируют уровень 0, далее уровень1- вершины, в которые идут дуги из уровня 0, уровень 2 состоит из вершин, в которые идут дуги из уровня 1. Такой граф можно задать и другими способами не по уровнями, но для рисования думаю так удобнее.

Итоговая структура для графа, в вершине хранится целое число, однако смело можете задать свое содержимое

const LevelCM=5;ViLCM=20;LineCM=100;

type

TVertex=class

num:integer;

end;

TLine=class

level,num1,num2:integer;

end;

Здесь 1 указатель номера уровня и два указателя вершины в уровне. Это исходит из предположения того что любая дуга связывает вершины только соседних уровней. Данной предположение касается только hi, и если появляется связь между несоседними вершинами можно ввести промежуточную вершину, имеющую смысл автоматически проходимого сценария кампании.

То есть level- минимальный уровень, другой уровень-level+1.

TGraf=class

LevelC,LineC:integer;

ViLC:array[0..LevelCM-1]of integer;

Vs:array[0..LevelCM-1,0..ViLCM-1]of TVertex;

Ls:array[0..LineCM-1]of TLine;

constructor Create;

destructor Free;

...

procedure ColorizeDraw(var c1bmp:tbitmap;num1,num2:integer);

… И еще много функций по добавлению вершин, ребер, выводу, прорисовке, рассмотрим главную.

end;

Таким образом можно использовать такую схему, j- номер вершины среди вершин данного уровня(как у программиста она отсчитывается с нуля).i- номер уровня вершины. Эти обозначения помогают решить проблему рисования графа. Пусть у нас есть карта например 400 на 200, задача перевести координаты в графе в координаты на карте, для этого используется формула:

y:=Round((i+1)*200/(LevelC+1) ); (LevelC- количество уровней)

x:=Round((j+1)*400/(ViLC[i]+1) ); (ViLC[i]- количество вершин на определенном уровне)

в итоге нужно нарисовать вершины и ребра. Вершина рисуется квадратом диаметра 20, дуга- линией толщиной 3 с круговым наконечником (я решил не рисовать стрелочки умноженные на матрицу поворота)

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

Итоговая зарисовка:

В c1bmp:tbitmap получаем граф, num1 num2-координаты последнего из пройденных сценариев, если их нет то -1. Не забудем при создании формы инициализировать

c1bmp:=Tbitmap.Create;

c1bmp.width:=400;

c1bmp.height:=200;

procedure TGraf.ColorizeDraw(varC1Bmp:TBitMap;num1,num2:integer);

var i,j,x,y,x2,y2:integer;

begin

//очищаем

C1Bmp.Canvas.Font.Name:='Times New Roman';

C1Bmp.Canvas.Brush.Color:=clWhite;

C1Bmp.Canvas.Pen.Color:=clBlack;

C1Bmp.Canvas.Pen.Width:=1;

C1Bmp.Canvas.FillRect(Rect(0,0,399,199));

//рисуем вершины

for i:=0 to LevelC-1 do

for j:=0 to ViLC[i]-1 do

begin

y:=Round((i+1)* (200{-20*LevelC})/(LevelC+1) );

x:=Round((j+1)* (400{-40*ViLC[i]})/(ViLC[i]+1) );

if num1=-1 then

begin

if (i=0) then C1Bmp.Canvas.Brush.Color:=clGreen

else C1Bmp.Canvas.Brush.Color:=clRed;

end else

begin

if (i=num1)and(j=num2) then C1Bmp.Canvas.Brush.Color:=clYellow

else if (i=num1+1)and(FindLine(num1,num2,j)<>-1)

then C1Bmp.Canvas.Brush.Color:=clGreen

else C1Bmp.Canvas.Brush.Color:=clRed;

end;

C1Bmp.Canvas.Rectangle(Rect(x,y,x+30,y+30));

C1Bmp.Canvas.TextOut(x+3,y+3,IntToStr(Vs[i,j].num));

end; //рисуем ребра

C1Bmp.Canvas.Pen.Color:=clBlue;

C1Bmp.Canvas.Pen.Width:=3;

C1Bmp.Canvas.Brush.Color:=clBlue;

for i:=0 to LineC-1 do

begin

y:=Round((Ls[i].level+1)* (200{-20*LevelC})/(LevelC+1))+15;

x:=Round((Ls[i].num1+1)*(400{-40*ViLC[i]})/(ViLC[Ls[i].level]+1))+15;

y2:=Round((Ls[i].level+2)* (200{-20*LevelC})/(LevelC+1))+15;

x2:=Round((Ls[i].num2+1))(400{-40*ViLC[i]})/(ViLC[Ls[i].level+1]+1))+15;

C1Bmp.Canvas.Pen.Width:=3;

C1Bmp.Canvas.MoveTo(x,y);

C1Bmp.Canvas.LineTo(x2,y2);

C1Bmp.Canvas.Ellipse(x2-2,y2-2,x2+2,y2+2);

end;

end;

Вот теперь в c1bmp хранится рисунок вашего графа, его можно поместить на канву

r:=Rect(0,0,400,200);

Canvas.CopyRect(r,c1Bmp.canvas,r) или Canvas.Draw(0,0,c1bmp)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]