Настройка сетки графика по оси ординат
01.01.2007
{ **** UBPFD *********** by kladovka.net.ru **** >> Настройка оси Настройка сетки графика по оси ординат. Имеет смысл при передаче данных в другие пакеты, использующие графическое представление данных (например, в Excel). Зависимости: uses Chart, TeEngine, Math; Автор: lookin Copyright: lookin Дата: 25 декабря 2002 г. ********************************************** } //для использования в Delphi procedure CalcAxis(NChart: TChart); var step,ymx,ymn,rmx,rmn,raz: double; i,n,m,d: integer; begin with NChart do begin ymx:=-10000000000; ymn:=10000000000; m:=0; n:=0; for i:=0 to SeriesCount-1 do if Series[i].XValues.Count<>0 then begin if Series[i].YValues.MaxValue>ymx then ymx:=Series[i].YValues.MaxValue; if Series[i].YValues.MinValue<ymn then ymn:=Series[i].YValues.MinValue; end; rmx:=ymx; rmn:=ymn; while ymn<0 do begin ymn:=ymn+100; ymx:=ymx+100; Inc(m); end; raz:=ymx-ymn; while raz<100 do begin ymn:=ymn*10; ymx:=ymx*10; raz:=ymx-ymn; Inc(n); end; ymx:=Ceil(ymx); ymn:=Floor(ymn); d:=trunc(ymx) div 100; ymx:=(d+1)*100; d:=trunc(ymn) div 100; ymn:=d*100; raz:=ymx-ymn; step:=raz/5; ymx:=ymx/(Power(10,n))-m*100; ymn:=ymn/(Power(10,n))-m*100; step:=step/(Power(10,n)); d:=0; for i:=1 to 5 do if (d=0) and (ymn+step*i>rmx) then d:=i; if d<>0 then ymx:=ymn+step*d; d:=0; for i:=1 to 5 do if (d=0) and (ymn+step*i<rmn) then d:=i; if d<>0 then ymn:=ymn+step*d; with LeftAxis do begin Automatic:=false; Increment:=step; Minimum:=-100000000000; Maximum:=ymx; Minimum:=ymn; end; end; end;
//для использования в Excel в качестве макроса (Visual Basic)
Function SetAxisRange(CChart As Chart, ByRef AMax As Double, ByRef AMin As Double, ByRef AStep As Double) Dim Step, RMax, RMin, Max, Min, Raz As Double Dim I, J, N, M, d As Integer Max = -1000000 Min = 1000000 For I = 1 To CChart.SeriesCollection.Count ReDim VArray(UBound(CChart.SeriesCollection(I).Values)) VArray = CChart.SeriesCollection(I).Values For J = 1 To UBound(VArray) If VArray(J) > Max Then Max = VArray(J) If VArray(J) < Min Then Min = VArray(J) Next J Next I RMax = Max RMin = Min N = 0 M = 0 If Max <> Min Then While Min < 0 Min = Min + 100 Max = Max + 100 M = M + 1 Wend Raz = Max - Min While Raz < 100 Min = Min * 10 Max = Max * 10 Raz = Max - Min N = N + 1 Wend Max = Int(Max) + 1 Min = Int(Min) d = Max \ 100 Max = (d + 1) * 100 d = Min \ 100 Min = d * 100 Raz = Max - Min Step = Raz / 5 AStep = Step / (10 ^ N) AMin = Min / (10 ^ N) - M * 100 AMax = Max / (10 ^ N) - M * 100 d = 0 For I = 1 To 5 If d = 0 Then If (AMin + AStep * I) > RMax Then d = I End If Next I If d <> 0 Then AMax = AMin + AStep * d d = 0 For I = 1 To 5 If d = 0 Then If (AMin + AStep * I) < RMin Then d = I End If Next I If d <> 0 Then AMin = AMin + AStep * d End If End Function