Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Для визуализации результатов моделирования можно использовать возможности, которые предоставляет компонент TChart. Вид интерфейса вывода для приведенного ниже примера показан на рис. 12. Верхнюю часть формы занимает график (TChart), нижнюю – сетка (TStringGrid), поля для ввода значений параметров (TEdit) и кнопки управления (TButton) для запуска и прерывания расчета.
Рис. 12. Интерфейс вывода результатов
При визуальном анализе результатов хороший эффект достигается за счет того, что на одном графике размещают сразу несколько кривых. При этом в полной мере можно использовать когнитивные возможности компонента TChart – перемещать кривые внутри поля графика, увеличивать масштаб выделенной области графика. Если отдельно отображать графические и интегральные результаты расчетов, важно установить полное соответствие между ними. Пример реализован следующим образом: после каждого расчета динамически создается новая серия и добавляется на график, в сетку добавляется строка с интегральными характеристиками результатов расчета. Цвет кривой графика выбирается случайным способом, один из столбиков добавляемой в сетку строки окрашивается в цвет серии, чтобы визуально показать соответствие графических и интегральных результатов. Для сетки используется всплывающее меню, которое позволяет удалить отмеченную строку из сетки и соответствующую ей кривую из графика (рис. 13, 14). В этом примере для хранения графических результатов используется внутренняя память TChart. Коды этого примера можно использовать как основу для реализации любого алгоритма взаимодействия пользователя с программой.
Рис. 13. Удаление строки результатов расчета
Рис. 14. Интерфейс вывода после операции удаления
Для реализации нужно объявить две глобальные переменные:
var
MySr:TLineSeries;//объектная переменная: серия типа Line
NomSeries:integer;//счетчик серий
Фрагмент кода для создания новой серии после очередного расчета:
MySr:=TLineSeries.Create(self); //собственник – форма
MySr.ParentChart:=Chart2; //родительский компонент – график
MySr.Stairs:=true; //вид кривой – гистограмма
MySr.LinePen.Width:=2; //толщина кривой
MySr.SeriesColor:=RGB(trunc(random*255),
trunc(random*255),trunc(random*255)); //цвет кривой
NomSeries:=Chart2.SeriesCount; //счетчик кривых
for i:=0 to NeymList.Count-1 do //перебор элементов //разреженного массива, в нем сохраняли результаты расчета
begin
temp:=NeymList.Items[i];
Chart2.Series[NomSeries-1].AddXY(temp.x, temp.y);
end;
StringGrid2.Cells[0,NomSeries]:=' '; //цвет
StringGrid2.Cells[1,NomSeries]:=IntToStr(NomSeries); //номер
StringGrid2.Cells[2,NomSeries]:=FloatToStr(sigma); //Исх.дан.
StringGrid2.Cells[3,NomSeries]:=FloatToStr(mu); //Исх.данные
StringGrid2.Cells[4,NomSeries]:=IntTostr(Statistic); //Стат.
StringGrid2.Cells[5,NomSeries]:=FloatToStrF(MatO,ffFixed,6,4);
StringGrid2.Cells[6,NomSeries]:=FloatToStrF(Disp,ffFixed,6,4);
//В 4 столбик вывводим мат.ожидание,в 5 – дисперсию
StringGrid2.Col:=1; //устанавливаем фокус сетки на 2 столбик
StringGrid2.RowCount:=StringGrid2.RowCount+1;
Для того, чтобы в сетке показать цветом соответствие с графическими результатами, отображенными в виде кривых на графике, необходим обработчик события OnDrawCell «Отрисовка ячеек сетки»:
procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
MCol: longint absolute ACol; // номер текущего столбца
MRow: longint absolute ARow; // номер текущей строки
begin
with (Sender as TStringGrid) do
begin
Canvas.Font:= Font; // фонт формы
Canvas.Font.Color:= clBlack; // цвет текста в ячейке
if (gdFixed in State) then // если рисуется фикс.строка
Canvas.Brush.Color:=clBtnFace // цвет стандартный
else begin
if (gdFocused in State)or (gdSelected in State) then
// если рисуем выделенную ячейку или с фокусом
Canvas.Brush.Color:=clBtnFace// цвет стандартный
else // обычные ячейки
if (MRow<=Chart2.SeriesCount) then begin
// рисуем непустые строки
if (MCol=0) then // первый столбец – цветной
Canvas.Brush.Color:=Chart2.Series[MRow-1].SeriesColor
// цвет ячейки такой же как у соответствующей серии
else
Canvas.Brush.Color:=clWhite //остальные ячейки
end
else Canvas.Brush.Color:=clWhite; //ячейки пустых строк
end;
Canvas.FillRect(Rect); //залить цветом прямоугольник ячейки
Canvas.TextOut(Rect.Left+4,Rect.Top,Cells[MCol, MRow]);
//вывести в ячейку текст
end;
end;
В процедуре отрисовки ячеек сетки анализируем, отрисовка какой текущей ячейки сетки производится. Если это ячейка фиксированной строки, ячейка с фокусом или выделенная – рисуем ее серым цветом. Если ячейка принадлежит первому столбцу той строки, результаты которой представлены на графике, рисуем ее цветом серии графика, все остальные ячейки – белые. После отрисовки фона ячейки выводим текст. Процедура удаления строки сетки и соответствующей кривой графика:
procedure TForm1.Delete1Click(Sender: TObject);
var
i,MRow:integer;
begin
MRow:=StringGrid2.Row;
if MRow=0 then exit;
if Chart2.SeriesCount=0 then exit;
MySr:=Chart2.SeriesList.Items[MRow-1];//Присвоить указатель //на серию графика, номер которой выбирается по выделенной //строке сетки
Chart2.RemoveSeries(MySr); //Удалить серию из графика.
//Выполнение этого дествия инициирует перерисовку графика
if Chart2.SeriesCount=0 then
MySr.Free; //если нет серий – освободить память
//блок для удаления отмеченной строки из сетки
for i:=MRow to StringGrid2.RowCount-2 do
begin
StringGrid2.Rows[i]:=StringGrid2.Rows[i+1];
StringGrid2.Rows[i+1].Clear;
end;
end;
При закрытии формы нужно выполнить действия по освобождению памяти, если она распределена под объектную переменную типа TlineSeries, и очистить серии графика:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i:integer;
begin
if Chart2.SeriesCount>0 then MySr.Free;
for i:=0 to Chart2.SeriesCount-1 do
Chart2.Series[i].Clear;
end;
Дата публикования: 2014-11-03; Прочитано: 787 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!