ЗАДАНИЕ XIV
Тема: Методы расчета полей.
Механизм сообщений. Цель: Краткое знакомство с работой сообщений в среде Stratum. |
Перед началом работы необходимо:
владение основными приемами работы в MS Windows; |
владение основными приемами работы в Stratum 2000. |
Основные сведения о сообщениях
Сообщение посылается всем объектам с
указанным именем или всем объектам указанного
класса. Объект, отправляющий сообщение,
называется источником сообщения, объекты, его
получающие - приемниками сообщения.
При этом происходит копирование
указанных переменных объекта источника
сообщения в объект приемник, затем обработка
модели объекта и копирование переменных обратно
в объект источник. Если объектов приемников
сообщений несколько, данная процедура
повторяется.
Отправка сообщения объекту или группе объектов
осуществляется функцией:
SendMessage(STRING ObjectName,STRING ClassName, [STRING
VarName1, FLOAT VarName2...])
ObjectName | Задает имя объекта (объектов), получающего сообщение. Пустая строка, если данный параметр не специфицирован. |
ClassName* | Задает имя класса объекта (объектов), получающего сообщение. Пустая строка, если данный параметр не специфицирован. |
VarName1 | Имя связываемой переменной в объекте-отправителе сообщения. |
VarName2 | Имя связываемой переменной в объекте-получателе сообщения. |
* Если заданно только имя класса, то посылается сообщение всем имиджам данного класса.
Задание 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 в этом имидже
на каждом шаге говорит о том, что необходимо
отобразить накопленную информацию и сбросить
накопленную напряженность поля. Данный имидж
должен стоять на схеме самым первым в порядке
вычисления. Для этого воспользуйтесь
редактированием порядка вычислений.
Имидж точки поля с именем 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
Созданный проект может иметь следующий вид: