[delphi]Skala logarytmiczna

0

Dzień dobry, chciałem zrobić skale logarytmiczna, ,zaczałem tak ale nie wiem jak robic podziałki na osiach

var
podzX : integer ;
podzY : integer ;
i : integer ;
pom, k : integer; //do rysowania skali dla logarytmu
begin
  podzX := Round(Image1.Width / 6) ;
  podzY := Round(Image1.Height / 6) ;

  Image1.Canvas.MoveTo(Image1.Width - 421 , Image1.Height - 20);
  Image1.Canvas.LIneTo(20, 20 );

  Image1.Canvas.MoveTo(Image1.Width - 421 , Image1.Height - 20);
  Image1.Canvas.LIneTo(420, Image1.Height - 20 );

          //osOX
 for i := 1 to 6 do begin
 Image1.Canvas.MoveTo((Image1.Width - 421) + podzX *i , Image1.Height - 25);
 Image1.Canvas.LIneTo((Image1.Width - 421) + podzX *i, Image1.Height - 15 );
       end;
          //osY
  for i := 1 to 6 do begin
 Image1.Canvas.MoveTo(Image1.Width - 426 , ((Image1.Height - 20)-podzY*i));//Image1.Height - 20);
  Image1.Canvas.LIneTo(Image1.Width - 416 ,((Image1.Height - 20)-podzY*i));// (Image1.Height - 20)+podzY*i );
   end;
  //opis osi OY
  for i := 1 to 6 do begin
  Image1.Canvas.TextOut( Image1.Width - 440 , Image1.Height - 33-podzY*i*2,FloatTOSTR(power(10,i))) ;
   end;
   // opis Ox

   for i := 1 to 6 do begin
  Image1.Canvas.TextOut((Image1.Width - 421) + podzX *i*2, Image1.Height - 15 ,FloatTOSTR(power(10,i))) ;

   end;

  //tworzenie do skali


  //rysowanie osi logarytm Os Oy
          //os opornosci

    for i := 1 to 6 do begin
    for k := 1 to 100 do begin
 Image1.Canvas.MoveTo(Image1.Width - 426 , ((Image1.Height - 20)-Round(log10(k))*i*8));//Image1.Height - 20);
  Image1.Canvas.LIneTo(Image1.Width - 416 ,((Image1.Height - 20)-Round(log10(k))*i*8));// (Image1.Height - 20)+podzY*i );
   end;




end;
end;

end.
0

Zakładając, że skala zaczyna Ci się od 1, a kończy na 10, to kolejne punkty podziałki są:
2: logN(2) * N
3: logN(3) * N
...
9: logN(9) * N

gdzie N jest podstawą logarytmu. Mnożysz przez N, żeby liczby z zakresu (0..1) przeskalowac na rysowany przedział (oczywiście musisz to potem odnieśc do pixeli.

BTW - używaj stałych symbolicznych lub wręcz zmiennych, to przy zmianie rozmiarów formy mniej będziesz miał kłopotow. Wyrażenie:

Image1.Width - 421 , Image1.Height - 20

powinno wyglądac

const
  FREE_X = 421;
  FREE_Y = 20;
{
ewentualnie, jeśli chciałbyś żeby wykres wyglądał ładnie niezależnie od rozmiarów formy
var
  free_x: integer;
  free_y: integer;
a potem sobie dynamicznie obliczasz free_x i free_y, np w OnResize
}


Image1.Width - FREE_X , Image1.Height - FREE_Y

albo coś w tym stylu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1