Sources
Delphi Russian Knowledge Base
DRKB - база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Настройка сетки графика по оси ординат

25.12.2002
lookin

//для использования в Delphi:

{ **** 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 
Previous page:
Преобразование выражения к Обратной Польской Нотации
Top:
DRKB
Next page:
Элементы спектрального анализа (Фурье, Хартман и т.д.)