Estos son los parámetros de la función que creí necesarios para mis cálculos:
- HORZSIZE Anchura, en milímetros, de la pantalla física.
- VERTSIZE Altura, en milímetros, de la pantalla física.
- HORZRES Anchura, en pixels, de la pantalla.
- VERTRES Altura, en líneas, de la pantalla.
Este método no da el resultado que buscaba, pero si otro interesante: la medida de la distancia real entre dos puntos de pantalla en mm.
img:TImage // contiene al bitmap
// Relación horizontal y vertical entre pixels y mm
function TCmdCalcEscala.PixelHorizToMM(deltaX: Double): Double;
var
hdcDesk:HDC;
Begin
hdcDesk:= img.Bitmap.Canvas.Handle; //
Antes hdcDesk:= img.Canvas.Handle;
try
result:= deltaX * (GetDeviceCaps(hdcDesk, HORZSIZE) /
GetDeviceCaps(hdcDesk,HORZRES));
finally
ReleaseDC(hdcDesk, hdcDesk);
end;
End;>
// Relación vertical entre pixels y mm
function TCmdCalcEscala.PixelVertiToMM(deltaY: Double): Double;
var
hdcDesk:HDC;
Begin
hdcDesk:= img.Bitmap.Canvas.Handle;
try
result:= deltaY * (GetDeviceCaps(hdcDesk, VERTSIZE) /
GetDeviceCaps(hdcDesk,VERTRES));
finally
ReleaseDC(hdcDesk, hdcDesk);
end;
End;
function TCmdCalcEscala.distancia(X,Y:Double): Double;
Begin
// X distancia horizontal, Y distancia vertical
result:=Abs(Sqrt(Sqr(x) + Sqr(y)));
End;
function TCmdCalcEscala.deltaPixels(X,Y:Double):Double;
Begin
result := Abs(X - Y);
End;
Ahi obtengo el factor escala que será aplicado a todas las medidas posteriores, para las medidas de los puntos en pantalla, creo que puede ser un resultado interesante.
//Calcula la relación entre pixels y mm.
procedure TCmdCalcEscala.ejecutar(Pto1:TPuntoVisual;Pto2:TPuntoVisual);
Var
distXpixel,distYpixel:Double;
distXmm,distYmm:Double;
Begin
distXpixel := deltaPixels(pto1.x,pto2.x); // Distancia horizontal
distYpixel := deltaPixels(pto1.y,pto2.y); // Distancia vertical
//Paso a mm esas distancias
distXmm := PixelHorizToMM(distXpixel);
distYmm := PixelVertiToMM(distYpixel);
//DistPixel, Distmm, FactorEscala son
propiedades de TCmdCalcEscala
DistPixels := distancia(distXpixel,distYpixel);
Distmm := distancia(distXmm,distYmm);
FactorEscala := Distmm/DistPixels;
End;
No verifiqué si depende de la resolución, pero es de esperar que asi sea ya que los pixeles por pulgada están en proporción a la letra de la fuente.
Nota: el handler es el Canvas del objeto imagen TImage, pero podría ser la pantalla, y para ello usamos la función API GetDC , nos devuelve el handler al dispositivo para el área de cliente de la ventana especificada.
No hay comentarios.:
Publicar un comentario