Linia o okr. dlugosci

0

Jak narysowac na Canvasie linie, od X w prawo, o okreslonej dlugosci, np. sqrt(5) (pierwiastek z 5) w cm??

0

Ma być to linia pozioma w prawo? Jeżeli tak, to w pierwszej kolejności musisz wiedzieć, ile pikseli przypada na 1 cm. Następnie musisz zajrzeć do helpa (MoveTo, LineTo - najprościej). W innym przypadku (linia ukośna) musisz wyliczyć współrzędne wektora początek -> koniec, np. z twierdzenia pitagorasa, albo z funkcji tryg. (zależy, jak masz podany kąt nachylenia - czy w stopniach, czy masz podane np. o ileś w prawo i o tylę w górę, żeby było 5cm przykładowo).

0

Ale LineTo ma w parametrach Integer, a sqrt to extended. Chodzi mi o jak najdoklaniejsza dlugosc linii. A rysowanie trojkatem pitagorejskim jest troche bardziej skomplikowane... Trza liczbe rozbic na 2, i trojkat o przyprostaktnych z tych rozbitych, np. sqrt(5) = sqr(4) sqr(1). Teraz trojkat o przypr. 4 i 1, a przecipr. to sqrt(5). Troeto zagmatwane, achzi mi o jak najczytelniejszy kod i jak najprostszy program...

0

Nie możesz narysować linii, która będzie miała 23,45 piksla długości. Dlatego teżw LineTo i MoveTo parametrami są integer. Przy rysowaniu możesz zaokrąglić do jednego piksla, dokładniej i tak nie będziesz miał.

0

Nie istnieje algorytm pozwalający to obliczyć.

Bo co będziesz się pytał użytkownik ilo calowy ma monitor i jak ustawiony ekran itd, dodając do tego rozdzielczość ekranu ????

0

dobry numer jest zrobiony w corelu tzn jestnarysowana linijka, a user dopasowuje kiedy ta na ekranie bedzie się zgadzać z rzeczywistą

0

No nie wiem... Spójrzcie chociażby na Worda. Tam macie w przybliżeniu prawidłową linijkę, mimo, że Word nie pyta się o rozmiar ekranu. Myślę, że takie właściwości mogą być zapisane gdzieś w rejestrze, w ramach ustawień monitora (jest tam zapisany model, a każdy model ma jakieś konkretne właciwości). Nie wiem, czy się nie mylę, bo nigdy się tym nie zajmowałem, ale tak czy inaczej: z całą pewnością nie można narysować linii o długości 24,53 pikselka...

0

Trzeba sie pobawic funkcja getDeviceCaps - API (szczegoly SDK)
Jesli chodzi o drukarke to mozna pobrac i przeliczyc na DPI ew. ilosc pix/cm uzywajac:

   mPozPX:=getdevicecaps(printer.handle,PHYSICALOFFSETX);
   mPionPX:=getdevicecaps(printer.handle,PHYSICALOFFSETY);
   wStronyPX:= getdevicecaps(printer.handle,PHYSICALWIDTH );
   hStronyPX:= getdevicecaps(printer.handle,PHYSICALHEIGHT );
   wStronyCM:=(wStrony/100)-(wStrony/100)*((mPozPX*2)/wStronyPX);
   hStronyCM:=(hStrony/100)-(hStrony/100)*((mPionPX*2)/hStronyPX);

dla monitora wywoluje sie ta fukcje z parametrami :
HORZSIZE Width, in millimeters, of the physical screen.
VERTSIZE Height, in millimeters, of the physical screen.
HORZRES Width, in pixels, of the screen.
VERTRES Height, in raster lines, of the screen.
LOGPIXELSX Number of pixels per logical inch along the screen width.
LOGPIXELSY

0

Ale nie chodi o narysowanie linii 24,76 piksela, 24,76 centymetra, a to jest wieciej pixeli. Tylko jak wyliczyc ile pixeli to 24,76 centymetra...

0

Pobierasz
LOGPIXELSX
LOGPIXELSY
Aby określić, ile pikseli przypada na cal (załóżmy, że px i py).
Zamieniasz centymentry na cale i mnożysz przez te pobrane wartości
WPikselachX := ZamienNaCale(WartoscWCentymentrachX)*px;
Ponieważ tylko poziomej potrzebujesz to tylko x jest potrzebne :)

0

A moze by tak jakis kodzik, nie bardzo moge sie polapac. Mam wylaczany mozg po geografii :-(

0

Ja bym polecił funkcję SetMapMode.
Informacje w MSDN-ie albo http://www.jack1024.piwko.pl/downloads/docs/api/Coordinate%20Spaces%20and%20Transformations.pdf.

Poniżej masz procedurę rysującą na canvasie linię o długości Sqrt(5) cm.

procedure TFormMain.Button1Click(Sender: TObject);

  function CM(x: integer): integer;
  begin
    Result := 100 * x;
  end;

begin
  with Canvas do
  begin
    SetMapMode(Handle, MM_LOMETRIC);
    Pen.Color := clBlue;
    Pen.Width := 10;
    MoveTo(0, 0);
    LineTo(CM(Round(sqrt(5))), 0);
  end;
end;

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