AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi zentimetergenaues Zeichnen auf Monitor unmöglich?
Thema durchsuchen
Ansicht
Themen-Optionen

zentimetergenaues Zeichnen auf Monitor unmöglich?

Ein Thema von taaktaak · begonnen am 7. Mai 2008 · letzter Beitrag vom 6. Feb 2009
Antwort Antwort
Seite 1 von 3  1 23      
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.993 Beiträge
 
Delphi 7 Professional
 
#1

zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 7. Mai 2008, 10:57
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

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.
Ralph
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 7. Mai 2008, 11:04
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#3

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 7. Mai 2008, 11:10
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.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 7. Mai 2008, 11:16
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 7. Mai 2008, 11:40
Kann auch den MapeMode mit MSDN-Library durchsuchenSetMapMode auf Millimeter umstellen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 7. Mai 2008, 11:49
was aber auch keine große Genautigkeit hat da dies nicht berücksichtigt wie man das Bild per Monitor gezerrt hat.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
rotfc
(Gast)

n/a Beiträge
 
#7

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 7. Mai 2008, 12:24
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 ;-(
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.993 Beiträge
 
Delphi 7 Professional
 
#8

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 7. Mai 2008, 17:34
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)
Angehängte Dateien
Dateityp: zip test_337.zip (2,8 KB, 27x aufgerufen)
Ralph
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#9

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 5. Feb 2009, 11:13
Was meinst Du mit "Die Balken haben immer 5 cm Breite" ?
Miniaturansicht angehängter Grafiken
aufloesung_595.jpg  
  Mit Zitat antworten Zitat
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#10

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 5. Feb 2009, 11:22
Ich denke mal das die Balken immer exakt 5cm breit seien sollten.
Laut der eingesetzten Funktionen jedenfals...
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 Uhr.
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