在画布中使用十进制值绘制图像

ika*_*eat 0 delphi drawing rounding

我试图绘制一个源自X,Y值列表的图像,这些值代表一条线的起点和终点.它们以英寸为单位,因此它们目前被格式化为小数.

我遇到的问题是绘图.该MoveToLineTo命令需要一个整数双.如果我使用Round(float)数学运算,你会看到下面的输出.舍入产生相同的起点和终点,因此不绘制任何内容.

如何从十进制X,Y点列表中绘制我的形状?

调试输入值的代码(小数):

LineStartVal: -88.988857, 36.265838
LineEndVal: -89.094923, 36.371904
LineStartVal: -89.094923, 36.371904
LineEndVal: -95.000423, 36.371904
LineStartVal: -95.000423, 36.371904
LineEndVal: -95.000423, 32.828604
LineStartVal: -95.000423, 32.828604
LineEndVal: -99.134273, 32.828604
Run Code Online (Sandbox Code Playgroud)

舍入后输出点的调试代码:

MoveTo: -89, 36
LineTo: -89, 36
MoveTo: -89, 36
LineTo: -95, 36
MoveTo: -95, 36
LineTo: -95, 33
MoveTo: -95, 33
LineTo: -99, 33
Run Code Online (Sandbox Code Playgroud)

绘图代码片段:

//Function used to to get start and stop points
LSNLineObj.GetEndPoints(X1,Y1,X2,Y2);


//OutputMemo.Text := OutputMemo.Text + #13#10 + 'LineStartVal: ' + FloatToStrF(X1, ffGeneral, 8, 4) + ', ' + FloatToStrF(Y1, ffGeneral, 8, 4);
//OutputMemo.Text := OutputMemo.Text + #13#10 + 'LineEndVal: ' + FloatToStrF(X2, ffGeneral, 8, 4) + ', ' + FloatToStrF(Y2, ffGeneral, 8, 4);

X1int := Round(X1); X2int := Round(X2);
Y1int := Round(Y1); Y2int := Round(Y2);

PartImage.Canvas.MoveTo(X1int,X2int);

OutputMemo.Text := OutputMemo.Text + #13#10 + 'MoveTo: ' + IntToStr(X1int) + ', ' + IntToStr(Y1int);

PartImage.Canvas.LineTo(X2int,Y2int);

OutputMemo.Text := OutputMemo.Text + #13#10 + 'LineTo: ' + IntToStr(X2int) + ', ' + IntToStr(Y2int);
Run Code Online (Sandbox Code Playgroud)

And*_*and 7

你有两个坐标系:第一,你有'坐标'的'逻辑'系统-88.988857, 36.265838.其次,你有屏幕.你需要在这两者之间进行转换.你应该写函数

function LogToScreen(LogPoint: TRealVector): TPoint;
function ScreenToLog(Point: TPoint): TRealVector;
Run Code Online (Sandbox Code Playgroud)

哪里TRealVector是包含两个双打的记录.写这两个函数只需要小学数学.

举例来说,你可以让屏幕上的矩形0..800,并0..600对应于逻辑值-110..-8030..40.

提示:使用上面的值,

function LogToScreen(LogPoint: TRealVector): TPoint;
begin
  result.X := round(800 * (LogPoint.X - (-110)) / ((-80) - (-110)));
  result.Y := round(600 * (LogPoint.Y - 30) / (40 - 30)); // or rev. orientation
end;
Run Code Online (Sandbox Code Playgroud)