C#窗体应用之坐标系打点操作

0前言

说的话:这几天做了一个工具,是要接受串口传来的坐标(x,y),接着在电脑上打印出对应的点,同时包含系列画板操作(滚条滚动,画板缩放,重设原点,轨迹缓存)。原本以为已经得到了位置信息,在画板上打印会很简单,毕竟打点函数是现成的,结果完全不是这么回事。
比如:画板坐标和传上来的坐标其实是两个坐标系,不可同日而语。
打点是打出来了,但缩放定位操作又很别扭。。。
经过一系列的整理,思路才逐渐清晰,这篇博客主要讲诉下关于两个坐标系的对应,以及实现原理,对照着代码看效果更佳哦!
C#窗体应用之坐标系打点操作

1画板坐标与实际坐标

1.1

在讲这个之前,先来说明一下为什么要专门提到,这很重要,首先在画板上打点,始终是在画板坐标上打点,打点区域表示画板的区域,x和y的区间是[0-panel.size],均为正值,且大小固定,当我们要画的点在画板外时,很多人都能想到可以利用滚条的值来实现。
为此,画板和真实左边之间必定有一个映射关系,如下图:

C#窗体应用之坐标系打点操作
因此假设实际坐标系(x,y)的区间为 x.min<x<x.max;y.min<y<y.max;
滚条移动一次对应坐标偏移一格,初始值为0,区间便设为(x.min,x.max);
画板坐标与实际时间坐标的关系便为:
panel.x=x+ScrollBar1.Value+panel1.Size.X/2
panel.y=y+ScrollBar2.Value+panel1.Size.Y/2

2利用滚条定位坐标

不妨可以从上图中看出,此时横竖滚条的值即为画板中心所代表的真实坐标的x,y,因此需要定位坐标时仅需要修改滚条的值并刷新画板即可完成对应点的定位

3放大与缩小

对于放大与缩小,要明确画板的坐标系是不会变的,变得只是画板与真实坐标之间的对应关系,因此给出变化后的公式如下:
panel.x=(x+ScrollBar1.Value)*n+panel1.Size.X/2
panel.y= (y+ScrollBar2.Value)*n+panel1.Size.Y/2
在这里注意放大后由于对应关系的转变,滚条的最值也应该相应变化,因此在定位时又要考虑滚条变化后对值的影响(我是直接在位时,自动将倍数设为1,所以省去了一步)

4代码

ps:代码包括位置点的保存读取,串口数据接受,原点的重新设置等等操作,不过画板的核心在于双坐标系以及中心点的定位。