Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Raster in Millimeter vs. Pixel zeichnen (https://www.delphipraxis.net/155752-raster-millimeter-vs-pixel-zeichnen.html)

Jazzman_Marburg 6. Nov 2010 13:14

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:
FBigUnits := 20;
...
2. In der Procedure CalcUnits berechne ich, wieviele der FBigUnits auf meine Zeichenfläche passen (getrennt für horizontal und vertikal):
Delphi-Quellcode:
FBigHorizontalUnits := FHeight DIV FBigUnit;
FBigVerticalUnits  := FWidth DIV FBigUnit;
3. In der Procedure DrawGrid zeichne ich anschließend die vertikalen und horizontalen Linien:
Delphi-Quellcode:
FOR i := 0 TO FBigVerticalUnits DO
BEGIN
  XPos := ROUND(i * FBigUnit);
  Canvas.MoveTo (XPos, 0);
  Canvas.LineTo (XPos, FHeight);
END;
Entsprechendes für die FBigHorizontalUnits.

So, jetzt möchte ich, dass nicht alle 20 Pixel eine Linie gezeichnet wird, sondern alle 20 Millimeter. Dazu habe ich bei DelphiAbout.com diese Procedure gefunden:
Delphi-Quellcode:
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;
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,
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

mkinzler 6. Nov 2010 13:18

AW: Raster in Millimeter vs. Pixel zeichnen
 
Das sind Faktoren mit den du die Koordinaten multiplizieren musst.

DeddyH 6. Nov 2010 13:55

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.

SirThornberry 6. Nov 2010 14:00

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.

DeddyH 6. Nov 2010 14:03

AW: Raster in Millimeter vs. Pixel zeichnen
 
Sowas hatte ich bereits befürchtet.

Jazzman_Marburg 6. Nov 2010 14:12

AW: Raster in Millimeter vs. Pixel zeichnen
 
Zitat:

Zitat von mkinzler (Beitrag 1060022)
Das sind Faktoren mit den du die Koordinaten multiplizieren musst.

Tschuldigung, aber ich muß nochmal nachfragen.
D.h die Multiplikation mit x und y muß hier erfolgen?

Delphi-Quellcode:
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;
Aber hier doch sicher auch?

Delphi-Quellcode:
FBigHorizontalUnits := FHeight DIV FBigUnit;
FBigVerticalUnits := FWidth DIV FBigUnit;
Jazzman


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