Другие языки программирования и технологии

Как масштабировать графики в делфи, нужно, чтоб он постоянно строился, а менялся лишь масштаб по времени...

Доброго времени суток.

Не знаю, помогу чем-нить или нет, но я как-то рисовал так.

procedure TSFAWindow.DrawCurve;
const
CurvName : array[1..4] of String = ('S-компонента','P-компонента','Среднее','');
var
i, j, Mask : Integer;
begin
i := 1;
Mask := i;
GetRelXY;
while Result[ i ] <> nil do begin
with PaintBox1.Canvas do begin
Pen.Color := SFAColors[ i+2]; // установим цвет кривой
if (Mask and CurrMask) <> 0 then begin // пока есть данные
CalcXY(Result[ i ], 0); // найдем начало кривой
MoveTo(X+PlotLeft, Y+PlotTop); // установим позицию пера
for j:=1 to Result[ i ].Count-1 do begin // для всех точек
CalcXY(Result[ i ], j); // считаем положение
LineTo(X+PlotLeft, Y+PlotTop); // проводим линию
end;
Font.Color := SFAColors[ i+2]; // цвет типа кривой
TextOut(PlotLeft + (i-1)* 120, PlotBottom + 25, CurvName[ i ]);
end;
end;
Inc(i); // переход к следующему графику
Mask := Mask Shl 1;
end;
end;

procedure TSFAWindow.GetRelXY;
begin
xRel := (PlotRight - PlotLeft)/(CurrBorder.xMax - CurrBorder.xMin);
yRel := (PlotBottom - PlotTop)/(CurrBorder.yMax-CurrBorder.yMin);
end;

Plotхххх - границы области рисования, CurrBorder - запись с минимальными и максимальными значениями аргумента и функции.

procedure TSFAWindow.CalcXY(C: TCurveData; Index : Integer);
var
P : TCurvePoint;
begin
P := C[Index];
x := Round((P.Arg - CurrBorder.xMin)*xRel);
y := Round((-P.Func[Integer(ActiveInterior)] + CurrBorder.yMax)*yRel);
end;

Последний метод определяет экранные координаты для LineTo. Правда, это для статической кривой. Если же она должна меняться со временем, то, скорее всего, потребуется постоянный пересчет xRel и yRel, которые являются, по-сути, масштабными коэффициентами по осям.

Удачи!

PS Возможно не все будет очевидным, но код рабочий, взят из проекта.

Указанные методы вызываются из

procedure TSFAWindow.ShowGraphicsResults;
begin
if Result[1] = nil then Exit; // нет данных для отображения
CurrMask := 1; // отбразим пропускание
if Result[2] <> nil then CurrMask := 3; // отображать пропускание, отражение и среднее
SetFullBorder; // установим полные границы графика
CalcPrecision; // вычислим точность отображения оцифровки осей

DrawGrid;
DrawCurve;
end;

Здесь Result - массив результатов.
Ержан Кусаинов
Ержан Кусаинов
59 612
Лучший ответ
Там вообще-то для графиков есть компонент Tchart.