Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

TChart для визуализации результатов моделирования



Для визуализации результатов моделирования можно использовать возможности, которые предоставляет компонент 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.011 с)...