Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi zentimetergenaues Zeichnen auf Monitor unmöglich? (https://www.delphipraxis.net/113395-zentimetergenaues-zeichnen-auf-monitor-unmoeglich.html)

taaktaak 7. Mai 2008 09:57


zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Moin, Moin.
Ich möchte auf einem Canvas (Monitor) Linien im exakten Horizontalabstand von 1cm zeichnen. Nix leichter als das - dachte ich. Dafür gibt's ja Funktionen, die dich die Anzahl der Pixel je Zentimeter berechnen lassen. Meine bisherigen Versuche scheitern aber dummerweise kläglich :x

Delphi-Quellcode:
procedure GetHorPixelsPerCM;
var DC          : HDC;
    HorPixCM_v1,
    HorPixCM_v2  : Integer;
begin
  DC:=GetDC(0);

  HorPixCM_v1:=Trunc(GetDeviceCaps(DC,LOGPIXELSX)/2.54);
  ShowMessage('pixel/cm'#13'Variante mit LogPixelsX'#13
              +IntToStr(HorPixCM_v1));

  HorPixCM_v2:=MulDiv(GetDeviceCaps(DC,HorzRes),10,GetDeviceCaps(DC,HorzSize));
  ShowMessage('pixel/cm'#13'Variante mit HorzRes+HorzSize'#13
              +IntToStr(HorPixCM_v2));

  ShowMessage('pixel/cm'#13'Variante mit Screen.PixelsPerInch (nur vertikal gültig)'#13
              +IntToStr(Trunc(Screen.PixelsPerInch/2.54)));

  ReleaseDC(0,DC);
end;
Die beiden ersten Varianten liefern z.B. auf meinem Notebook abweichende Angaben von 37 bzw. 35 Pixel/cm. Die dritte Variante (die lt. Delphihilfe für horizontale Auflösungen nicht verwendet werden sollte) liefert wieder ein Ergebnis von 37 Pixel/cm. Korrekt sind die Werte allerdings in keinem Fall - richtig wären 34 Pixel/cm. Für alle mir zugänglichen PC-Monitore werden ebenfalls falsche Ergebnisse ermittelt. Ursachenforschung ist bei der Variante 1 möglich: Der Wert für HorzSize (also die horizontale Breite in mm) wird in allen untersuchten Fällen falsch zurückgeliefert.

Fragen:
  • Ist meine Herangehensweise falsch?
  • Falls es mal einer der Leser nachprüfen möchte, finden sich Monitorkonfigurationen bei denen das Ergebnis korrekt ermittelt wird?
  • Gibt es eine alternative Lösung? Im Augenblick fällt mir nur eine Konfigurationsmöglichkeit ein, anhand derer der Anwender eine Kalibrierung vornehmen kann und das Programm dann mit einem zusätzlichen Korrekturfaktor arbeitet.

shmia 7. Mai 2008 10:04

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Zitat:

Zitat von taaktaak
Ist meine Herangehensweise falsch?

Ja, wenn du mit Pixel/Inch als Integerwert rechnest, werden immer Rundungsfehler auftreten.
Also wenn's 100% stimmen soll, dann muss der Benutzer die Breite und Höhe seines Monitor in Millimeter eingeben.
Die Auflösung kann du ja abfragen (Screen.Width, Screen.Height) und damit die Pixel/mm als Fliesskommazahl errechnen.

Corpsman 7. Mai 2008 10:10

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Bei mir war die Ausgabe

37
34
37


Ich habs nachgemessen

und 34 stimmt

folglich sind die 37 Werte Falsch ;)

getestet an einer GForce 8800GTS mit DualMonitorsystem ( Jeweils 19", 1280 x 1024 )

Ich mach das übrigens immer so das das ich mir vom User die Abmase ( meist da ich das ja nur beim Drucken brauche sind die schon bekannt ) geben lasse und rechne das dan mittels dreisatz von hand aus.

Solltest du das wirklich für Monitorausgabe benötigen ist das natürlich nicht mehr so praktisch ..

Vorallem da du ja die Auflösung beliebig ändern kannst.

SirThornberry 7. Mai 2008 10:16

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Es gibt nur beim Monitor nur die Variante den Benutzer die Breite eingeben zu lassen. Alles andere ist ungenau. Denn wenn jemand einen Röhrenmonitor hat kann er das Bild breiter, schmaler, höher etc. machen. Und diese Werte kannst du nunmal nicht auslesen.

Luckie 7. Mai 2008 10:40

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Kann auch den MapeMode mit MSDN-Library durchsuchenSetMapMode auf Millimeter umstellen.

SirThornberry 7. Mai 2008 10:49

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
was aber auch keine große Genautigkeit hat da dies nicht berücksichtigt wie man das Bild per Monitor gezerrt hat.

rotfc 7. Mai 2008 11:24

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Das geht nur, wenn die Bildschirmauflösung und die physikalische Höhe/Breite eines Pixels bereits vorher bekannt sind. Wobei ein "programmiertes Pixel" nichts mit der physischen Darstellung des Pixels auf dem Monitor zu tun hat.

Stell mal bei einem 17"-Monitor 640x480 ein. Dann kannst Du wieder von vorne anfangen ;-(

taaktaak 7. Mai 2008 16:34

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zunächst einmal Danke für die Hinweise und Anregungen!

Um das Thema für mich und andere die das vielleicht noch einmal lesen abzuschließen, hier eine kleine Zusammenzufassung:
  • Wie shmia zu Recht bemerkt, ist es ein recht grober Schnitzer, sofort zu Runden und mit Integern zu arbeiten. Natürlich führt das zu einem unnötigen Abweichungsfehler. Allerdings führt die exaktere Werteführung bei meiner Gerätekonfiguration zu einer noch größeren Abweichung vom Soll-Maß.
  • Die Verwendung von "LogPixelsX" und "Screen.PixelsPerInch" führt in jedem Fall zu den größten Abweichungen und ist daher grundsätzlich nicht die richtige Wahl.
  • Werden "HorzRes" und "HorzSize" verwendet, ist das Ergebnis recht genau. Im Falle von Corpsman sogar exakt passend. Aber verlassen kann man sich augenscheinlich nicht darauf.
  • Die von Luckie vorgeschlagene Verwendung von SetMapMode hat (in meinem Fall) die gleiche Genauigkeit wie "HorzRes" und "HorzSize". Es kann also im konkreten Einzelfall alternativ verwendet werden.
  • Ist eine absolute Genauigkeit erforderlich, bleibt, wie von mehreren angemerkt und von mir bereits vermutet, nur die Kalibrierung auf den verwendeten Monitor und interen Verwendung eines Kalibrierungsfaktors für alle Zeichenoperationen.
Wer die verschiedenen Möglichkeiten auf seinem Monitor ausprobieren möchte, kann das angehängte Mini-Programm verwenden (nur Source) :hi:

thomas2009 5. Feb 2009 10:13

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Was meinst Du mit "Die Balken haben immer 5 cm Breite" ?

Teekeks 5. Feb 2009 10:22

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Ich denke mal das die Balken immer exakt 5cm breit seien sollten.
Laut der eingesetzten Funktionen jedenfals...


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz