坐标系
Windows系统有两个坐标系,一个是屏幕坐标系,一个是窗口坐标系,Visual Graph系统中也有两个坐标系,一个是视图坐标系,另外就是每个图形都有自己的坐标系,见下图:
屏幕坐标系的原点位于屏幕左上角,窗口坐标系的原点位于窗口左上角,它们都是横坐标轴向右,纵坐标轴向下。
视图坐标系的原点则是画面的度量基准点,每个点的坐标值都是相对于此点的,当画面滚动或缩放时,每个图形的视图坐标是不变的。视图坐标系的横坐标轴向右,当Coordinate=0时,纵坐标轴向下,当Coordinate=1时,纵坐标轴向上。
每个图形都有自己的坐标系,会随着图形的旋转而旋转,原点位于旋转中心处(XOrigin、YOrigin)。当图形旋转时,除了Angle改变,不会影响其他任何属性,甚至图形的左边坐标和上边坐标(left、top)也不发生变化。图形上面每个点的相对坐标实际上等于图形不旋转时相对父对象的坐标,因此,在写程序时,我们通常不用考虑图形的旋转,只考虑它不旋转情形就可以了,系统会自动实现坐标变换。
由于页面是元件,因而也是图形,所以它也有自己的坐标系,这个坐标系恰好就是视图坐标系!
1、图形坐标系上各点坐标的计算方法
假设图形d内某一点的坐标是(x,y),则该点相对于页面(父对象)的坐标值(x1,y1)计算公式是:
cst = cos( d.Angle * 3.14159265359 / 180 );
sst = sin( d.Angle * 3.14159265359 / 180 );
x1 = d.XOrigin + ( x - d.XOrigin ) * cst - ( y - d.YOrigin ) * sst;
y1 = d.YOrigin + ( x - d.XOrigin ) * sst + ( y - d.YOrigin ) * cst;
见下图:
Coordinate = 0 |
Coordinate = 1 |
---|
由此可知,旋转中心点(XOrigin,YOrigin)经变换后坐标值不变。
2.坐标变换公式
屏幕坐标点到窗口坐标点的变换函数是ScreenToClient,窗口坐标点到屏幕坐标点的变换函数是ClientToScreen。
系统给每一个图形提供了两个有用的坐标变换函数,它们是:ViewToClient和ClientToView。
前者是把一个图形坐标系内的点变换到窗口坐标系,后者是把一个窗口坐标系的点变换为图形坐标系的点。
巧妙地使用上面这两个函数,可以实现一个图形到另外一个图形的坐标变换。
如,图形d内的坐标点(x,y)转换到图形e内的坐标点(x2,y2),需要经过下面两步计算:
px = x
py = y
d.ViewToClient( px, py )
e.ClientToView( px, py )
x2 = px
y2 = py
假如当前页面是sheet1,下面的方法把视图逻辑坐标的原点变换到窗口坐标(x,y):
px = 0
py = 0
sheet1.ViewToClient( px, py )
x = px
y = py
下面的方法把窗口左上角(窗口坐标的原点)变换到视图坐标(x,y):
px = 0
py = 0
sheet1.ClientToView( px, py )
x = px
y = py
下面的方法把窗口右下角变换到视图坐标(x,y):
px = ClientWidth
py = ClientHeight
sheet1.ClientToView( px, py )
x = px
y = py
下面的方法把当前鼠标位置变换为视图坐标(x,y):
px = 0
py = 0
GetCursorPos( px, py )
ScreenToClient( px, py )
sheet1.ClientToView( px, py )
x = px
y = py