![]() |
Raster in Millimeter vs. Pixel zeichnen
Hallo Gemeinde,
mal wieder mit einem Brett vor dem Kopf unterwegs -- hoffe es findet sich ein Experte, der es mir kurzeitig entfernen hilft. Ich zeichne ein Grid (Raster) so wie man es aus einem kariertem Rechenheft kennt. Bei einer Voreinstellung von 20 Pixeln wird also jede 20 Pixel eine vertikale bzw. eine horizontale Linie gemalt -- woraus also das Raster entsteht. Nun möchte ich dieses Raster auf Millimeter-Einheiten umstellen, und tue mich damit schwer. Mein Algorithmus sieht z.Z. so aus: 1. Voreinstellung (irgendeine beliebige Größe)
Delphi-Quellcode:
2. In der Procedure CalcUnits berechne ich, wieviele der FBigUnits auf meine Zeichenfläche passen (getrennt für horizontal und vertikal):
FBigUnits := 20;
...
Delphi-Quellcode:
3. In der Procedure DrawGrid zeichne ich anschließend die vertikalen und horizontalen Linien:
FBigHorizontalUnits := FHeight DIV FBigUnit;
FBigVerticalUnits := FWidth DIV FBigUnit;
Delphi-Quellcode:
Entsprechendes für die FBigHorizontalUnits.
FOR i := 0 TO FBigVerticalUnits DO
BEGIN XPos := ROUND(i * FBigUnit); Canvas.MoveTo (XPos, 0); Canvas.LineTo (XPos, FHeight); END; So, jetzt möchte ich, dass nicht alle 20 Pixel eine Linie gezeichnet wird, sondern alle 20 Millimeter. Dazu habe ich bei ![]()
Delphi-Quellcode:
Aber ich stehe auf dem Schlauch, wie dies jetzt in meinen o.g. Algorithmus passen soll. Sieht ja schon ziemlich danach aus, als ob sie geeigent wäre,
procedure PixelsPerMM(canvas: TCanvas; var x, y: single) ;
var H:HDC; hres,vres, hsiz,vsiz:integer; begin H:=canvas.handle; hres := GetDeviceCaps(H,HORZRES) ; {display width in pixels} vres := GetDeviceCaps(H,VERTRES) ; {display height in pixels} hsiz := GetDeviceCaps(H,HORZSIZE) ; {display width in mm} vsiz := GetDeviceCaps(H,VERTSIZE) ; {display height in mm} x := hres/hsiz; y := vres/vsiz; end; nur weiss ich nicht, was ich mit den x und y nach dem Aufruf von PixelPerMM anfange... Jemand eine Idee, wie ich mein Raster auf Millimeter umgestellt bekomme? Lieben Dank & Gruß Jazzman |
AW: Raster in Millimeter vs. Pixel zeichnen
Das sind Faktoren mit den du die Koordinaten multiplizieren musst.
|
AW: Raster in Millimeter vs. Pixel zeichnen
Wäre es nicht einfacher, mit SetMapMode auf 1/10 Milimeter umzustellen? Leider habe ich nie nachgemessen, ob das bei Monitoren zuverlässig funkioniert, bei Druckern tut es jedenfals.
|
AW: Raster in Millimeter vs. Pixel zeichnen
Bei Monitoren funktioniert das nicht. Erst recht nicht bei Röhrenmonitoren wo man das Bild beliebig zerren kann.
|
AW: Raster in Millimeter vs. Pixel zeichnen
Sowas hatte ich bereits befürchtet.
|
AW: Raster in Millimeter vs. Pixel zeichnen
Zitat:
D.h die Multiplikation mit x und y muß hier erfolgen?
Delphi-Quellcode:
Aber hier doch sicher auch?
FOR i := 0 TO FBigVerticalUnits DO
BEGIN XPos := ROUND(i * FBigUnit * x); // Das gleiche für YPos => * y Canvas.MoveTo (XPos, 0); Canvas.LineTo (XPos, FHeight); END;
Delphi-Quellcode:
Jazzman
FBigHorizontalUnits := FHeight DIV FBigUnit;
FBigVerticalUnits := FWidth DIV FBigUnit; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz