C#矢量绘图心得(一)--缩放功能

矢量缩放功能

       本人学习基于C#语言,利用GDI+的方式进行矢量绘图有一段时间了,所以我想把这段

时间以来的心得写出来跟大家分享一下,可能有些朋友也碰到过一些困惑,但愿本人的

心得能给他们一些思路,同时,更加欢迎喜欢矢量绘图的朋友一起来探讨GDI+绘图存在

的问题。

       矢量绘图涉及许多方面,这篇心得主要是写写关于矢量缩放的实现

以Shp数据为例:

      读取Shp数据的空间数据,即坐标集合,以经纬的形式存储,读完数据后,就要将数据绘

制在程序的窗体(在窗体上添加PICTUREBOX)范围。

(1)要算出数据集合的包围盒,即数据的范围---数据区域的左上角点的经纬度upleftPoint(minX,maxY),右下角

经纬度downrightPoint(maxX,minY),我们将经度方向作为GDI+绘图画板的X方向,纬度方向作为GDI+绘图画板的Y方向。

(2)计算出数据区域的经差Dx,纬差Dy,根据窗体的PictureBox的宽w和高h,

分别算出  Dx / w与Dy / h的比值,若前者大,则以Dx为标准,反之,以Dy为标准,这样做,是为了

保证让数据在初始化显示的时候最大限度显示出来

此外,初始化的时候我们把数据区域的中心处理窗体的PictureBox的中心midPoint((minX+maxX)/2,(minY+maxY)/2);

(3)计算窗体的左上角(0,0)点对应的经纬度,计算窗体的右下角(w,h)点对应的经纬度----关键

(初始化,以及放大,缩小,移动时都需要重新计算)

例如以Dy为例:纬差Dy的屏幕长度为h(不考虑投影),由此可以计算窗体左上角(minLat,maxLon)与右下角对应的经纬度(maxLat,minLon)

(细节计算不列出来,有需要可以留言再交流)

结果:(0,0)--->(minLat,maxLon),

             (w,h)---->  (maxLat,minLon),

此时:经差为deltaX,纬差为deltaY;

由此可以计算出数据区域中所有点在此状态下对应的屏幕坐标,利用GDI+绘制出来

(4)缩放实现

以放大为例:

若放大2倍,则需要重新计算窗体左上角以及右下角屏幕位置对应的经纬度坐标

放大前:

(0,0)--->(minLat,maxLon),

  (w,h)---->  (maxLat,minLon),

中心点对应的经纬度坐标为:midPoint

:经差为deltaX,纬差为deltaY;

放大后:

minLat=midPoint.X-deltaX/(2*2);

maxLon=midPoint.Y+deltaY/(2*2);

maxLat=midPoint.X+deltaX/(2*2);

minLon=midPoint.Y-deltaY/(2*2);

然后重新计算数据点对应的屏幕坐标绘制出来

缩小类似....

注:在绘制的过程中需要作一些处理来提高绘图效率,这个等有时间再来写一些相关的东西跟大家分享

 若要进一步交流可以加QQ(441224629),QQ群(581378927)

由于很少写这样的文章,有很多不足之处,望朋友们多多指点,纠正。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值