Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы ИС.doc
Скачиваний:
15
Добавлен:
17.02.2016
Размер:
1.95 Mб
Скачать
    1. Форма отчета: Сохраните проект со своей работой и покажите преподавателю.

    2. Выводы: Студенты должны научиться строить модели различной природы.

    3. Вопросы к защите лабораторной работы

  1. К какой библиотеки относится имидж ScanObject?

  2. К какой библиотеке относится имидж Lamp?

  1. Лабораторная работа 13

    1. Тема: Методы расчета полей. Механизм сообщений.

    2. Цель: Краткое знакомство с работой сообщений в среде Stratum.

    3. Общие сведения:

Сообщение посылается всем объектам с указанным именем или всем объектам указанного класса. Объект, отправляющий сообщение, называется источником сообщения, объекты, его получающие - приемниками сообщения.

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

Отправка сообщения объекту или группе объектов осуществляется функцией: SendMessage(STRING ObjectName,STRING ClassName, [STRING VarName1, FLOAT VarName2...])

ObjectName

Задает имя объекта (объектов), получающего сообщение. Пустая строка, если данный параметр не специфицирован.

ClassName*

Задает имя класса объекта (объектов), получающего сообщение. Пустая строка, если данный параметр не специфицирован.

VarName1

Имя связываемой переменной в объекте-отправителе сообщения.

VarName2

Имя связываемой переменной в объекте-получателе сообщения.

* Если заданно только имя класса, то посылается сообщение всем имиджам данного класса.

    1. Порядок выполнения лабораторной работы:

Задание 1. Построение схемы

Будем рассчитывать напряженность поля в заданных точках. Поле создается системой точечных зарядов. Напряженность поля в заданной точке рассчитывается по формуле:

 , где k - коэффициент, Qi - величина i заряда, Ri - расстояние от заряда до точки. Создадим имиджи : заряда, точки и служебного имиджа, сбрасывающего сумму зарядов.

Имидж заряда имеет следующий текст: FLOAT OrgX,OrgY,Q SendMessage("","Item", "OrgX","_OrgX", "OrgY","_OrgY", "Q","_Q", "Q","flag") Функция SendMessage на каждом шаге рассылает всем имиджам с именем Item информацию о своих координатах (OrgX, OrgY) и заряде Q. Передача ненулевого заряда Q в служебную переменную flag говорит о том, что пришла информация от заряда. Необходимо задать начальное значение заряда, например 1.

Служебный имидж: FLOAT Flag Flag:=-1 SendMessage("","Item","Flag","flag")

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

Имидж точки поля c именем Item :

HANDLE hSpace COLORREF Color ,oldColor FLOAT _enable // имидж выключен и работает только при приходе сообщения if(flag>=0) // пришло сообщение от заряда E := E + _Q/((OrgX-_OrgX)*(OrgX-_OrgX)+(OrgY-_OrgY)*(OrgY-_OrgY)) else // Визуализация a:=min(~E*10000,1) Color:=RGB(255*~a,0,(1-~a)*255) // Расчет цвета E:=0 // Обнуления напряженности if(not(HSpace)) hSpace := GetWindowSpace("Main Window")// Получение дескриптора окна if(~hSpace) HBrush := CreateBrush2d(~hSpace,0,0,~Color,#0,13) // Создание кисти HObject := CreatePolyLine2d(~hSpace,#0,~HBrush, OrgX,OrgY, OrgX+32,OrgY, OrgX+32,OrgY+32, OrgX,OrgY+32, OrgX,OrgY)// Создание прямоугольника (в одну строку) endif endif // Устанавливаем новый цвет if ((~Color!=oldColor) && SetBrushColor2d(~hSpace,~hBrush,~Color)) oldColor:=~Color endif endif

Созданный проект может иметь следующий вид:

    1. Форма отчета: Сохраните проект со своей работой и покажите преподавателю.

    2. Выводы: В результате выполнения лабораторной работы студенты должны понять и освоить процедуры отправки сообщений в изучаемой среде.

    3. Вопросы к защите лабораторной работы

  1. С помощью какой функции осуществляется отправка сообщения объекту или группе объектов?

  2. Ограничено ли число объектов которым возможно отправить сообщение в изучаемой среде?

  1. Лабораторная работа 14

    1. Тема: Работа с двухмерной графикой.

    2. Цель: Изготовление простой головоломки.

    3. Общие сведения:

    4. Смотри предыдущие работы.

    5. Порядок выполнения лабораторной работы:

Задание 1. Построение схемы

Идея головоломки - определить недостающую фигуру среди уже известных.

Создайте новый проект и нарисуйте макет головоломки, он может выглядеть так:

Выделите ключевую фигуру и замаскируйте ее среди подобных:

Для удобства объедините в группу оставшиеся слева фигуры (для этого выделите их, и нажмите правую кнопку мышки):

Теперь создадим модель, обслуживающую головоломку.

Для создания отдельного окна добавьте на схему объект LGSpace (библиотека Unit). Сделаем автоматическую настройку координат окна по графическому объекту. Нарисуйте обрамляющий прямоугольник. В его свойствах укажите имя - frame. Затем в объекте LGSpace установите для переменной ObjectName значение - frame.

Теперь размер окна будет равным размерам этого прямоугольника. Для того чтобы изменить Z-порядок прямоугольника (поместить его под другими графическими объектами), щелните на нем правой кнопкой мышки и выберите команду Z-order - Downward. Или просто выберите объект и нажмите кнопки Ctrl-PgDown.

Для того чтобы пользователь мог перетаскивать объекты, добавьте объект DragObjects (библиотека Graph2d). Для того чтобы ограничить возможность перетаскивания, установите у всех стационарных графических объектов флаг Nonselectable object.

Примечание. После того как Вы установите этот флаг, объекты будут недоступны, и если вы захотите получить к ним снова доступ, используйте команду Format - Page properties - закладка Flags - Allow choosing unchoosable objects. Выполните редактирование и переключите флаг обратно.

Теперь будем определять правильность выбора пользователя. Создайте новый объект и поместите в него следующую модель:

HANDLE hcobj if (check) // if user press the "CHECK" button if (hcobj == #14) // checking descriptor current key object r := MessageBox("Correct !","",0) else r := MessageBox("Incorrect !","",0) endif check := 0 // reseting the "CHECK" button endif

Примечание. Определить дескриптор ключевого объекта можно, щелкнув на нем правой кнопкой мышки и выбрав Properties - закладка Info. Смотрите пункт HANDLE, в моем примере он получился равным 14. У вас может быть другим, исправьте значение в тексте!

Добавьте кнопку WinButton (библиотека Unit) и установите у ее переменной Text значение "Check".

Примечание. Поскольку кнопка относится к классу Windows объектов у вас могут возникнуть сложности с ее выбором. Выполните команду Format - Page properties - закладка Flags - Disable child windows. Выполните редактирование кнопки. Не забудьте отключить флаг обратно, иначе кнопка не будет работать!

Соедините связью переменные pressed (WinButton) и check (новый объект).

Добавьте объект ScanObject (библиотека Graph2d). Установите в нем значения переменных x,y равными середине ключевого поля нашей головоломки. Определить их можно в StatusLine, установив курсор мышки в нужную позицию.

 В моем примере это 190,220.

Соедините связью переменные HObject (ScanObject) и hcobj (новый объект).

Пример готов, проверьте его работоспособность.