Czy można zmierzyć jaką długość ma odcinek rysowany na Bmp?

0

Chodzi mi żeby długość była zwracana np w cm.

0

hmm, możesz musisz chyba znać coś takiego jak DPI (dots per inch) w swoim systemie. Standardowo windows XP ma 96 DPI co daje ok 38 pikseli na centymetr. Odpowiedzi swojej nie jestem pewien.

0

Nie pamiętam nazwy funckji ... GetDeviceCaps ... one zwracają rozdzielczość (w zależności od parametrów). Można sobie z tego przeliczyć m. in. to co chcesz.

0

Zadanie jest proste. Jeżeli podczas drukowania chcesz znać, jaka jest odległość w milimetrach między dwoma punktami np. 132 i 2186, leżącymi w tej samej osi, robisz coś takiego:

  1. Przekopiuj tuż za implementation funkcję widoczną poniżej.
function DPI_na_MM(cal:integer):single;
var
  a:integer;
  b:real;
begin
  a:=GetDeviceCaps(Printer.Handle,LogPixelSX);  // rozdzielczość
  b:=cal*25.4/a;

  Result:=b;
end; 
  1. Teraz pod dowolnym buttonem wrzuć coś takiego (pamiętaj o umieszczeniu Labela):
  with Printer,Printer.Canvas do
        Label1.Caption:=FormatFloat('0.00 mm', DPI_na_MM(2186-132)); 

Mam nadzieję, że pamiętasz o wpisaniu w sekcji uses modułu Printers. Jeżeli klikniesz na Button1 otrzymasz odpowiedź, jaka jest odległość między tymi dwoma punktami. U mnie mam wynik 86,95 mm. Ważne jest to, że powyższa funkcja uwzględnia rozdzielczość drukarki ale tylko w osi X. Gdybyś chciał mierzyć odległość między dwoma punktami leżącymi po przekątnej wydruku sprawa się komplikuje, bo trzeba stosować np. twierdzenie Pitagorasa no i uwzgledniać rozdzielczość drukarki w osi Y (zwykle obie rozdzielczości są takie same, więc nie komplikujmy i niech zostanie jedna). Np. dla dwóch punktów (132,376) i (2186,1777), procedura może tak wyglądać:

 
Label2.Caption:=FormatFloat('0.00 mm', DPI_na_MM(Round(Sqrt(Power((1777-376),2)+Power((2186-132),2)))));

Trochę skomplikowane, ale działa. Powinno wyjść 105,24 mm

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