使用DELPHI的Canvas绘制复杂的图形(形同电脑主板与主板上的芯片),即在画布上画出约二千个大小不等的矩形或直线,现在速度基本上是没有问题,但算法上不知如何解决:1、如何从这组数据中找出图形中坐标原点所在屏幕上的坐标位置;
2、因为所给的原始数据都是以X轴向右,Y轴向上的坐标(即原点在左下角),但屏幕画图是从右上角向右和向下画,所以所有的坐标都要以X轴做个镜向,不知道有什么具体的算法;
3、放大、缩小、旋转以后又如何控制。 有这方面经验的朋友请给点意见或相关的算法,不甚感激,如果你很忙,那就请你给个思路也行。多谢了各位!!对了,我的邮箱是[email protected],如果有源码,可直接发给我!
2、因为所给的原始数据都是以X轴向右,Y轴向上的坐标(即原点在左下角),但屏幕画图是从右上角向右和向下画,所以所有的坐标都要以X轴做个镜向,不知道有什么具体的算法;
3、放大、缩小、旋转以后又如何控制。 有这方面经验的朋友请给点意见或相关的算法,不甚感激,如果你很忙,那就请你给个思路也行。多谢了各位!!对了,我的邮箱是[email protected],如果有源码,可直接发给我!
var
minx, miny, maxx, maxy : Integer;
org : TPoint; //原点在屏幕上的位置
hz, vz, z : Double; //缩放比例
i : Integer;
begin
minx := 0;
miny := 0;
maxx := 0;
maxy := 0;
for i := 0 to RectCount - 1 do
begin
minx := min(Rect[i].Left, minx);
miny := min(Rect[i].Top, miny);
maxx := max(Rect[i].Right, maxx);
maxy := max(Rect[i].Bottom, maxy);
end; hz := ClientWidth / (maxx - minx); //横向的缩放
vz := ClientHeight / (maxy - miny); //纵向的缩放
z := min(hz, vz); //统一缩放比例
org.x := Round(ClientWidth * ((0 - minx) / (maxx - minx)));
org.y := Round(ClientHeight * ((maxx - 0) / (maxy - miny)));
end;此时你在屏幕上画矩形的时候就应该用换算过的坐标:
ScreenRect := Rect(org.x + MyRect.Left * z, org.y - MyRect.Top * z, org.x + MyRect.Right * z, org.y - MyRect.Bottom * z);假如你在屏幕上的p点按了一下放大(或缩小),相对当前的放大/缩小倍率为rz:
z1 := z * rz;
org1.x := Round(p.x - (p.x - org.x) * rz);
org1.y := Round(p.y - (p.y - org.y) * rz);上面的代码都没有测试过,只是作个提示吧。