DIY自己的GIS程序(1)——起航

  一个GIS系统最重要的功能是绘制图形和关联属性,这里研究二维点线面的绘制过程:

  对于一个绘图系统设计,图形的绘制涉及两个重要的方面。

  • 1.一个是绘制或者重新绘制,重绘过程出现在下面情况:

  a 界面初始化的时候(全部刷新)

  b 窗体大小变化的时候(全部刷新)

  c 编辑图形的过程中,增加、删除、修改(移动图形和移动节点)。这里需要思考是整个画布刷新还是局部刷新。如果画布没有发生变化就应该保持画布上已有的东西,通过缓存图片的方式,局部刷新变化的(新绘制、修改)的部分。否则会出现整个画布闪烁现象。

  所谓局部刷新就是只对变化的部分刷新。这里的一种解决方法是,获取缓存图片受影响范围,在此范围重新绘制图形。

  方法一:dc.DrawImage(m_staticImage, r, r, GraphicsUnit.Pixel);

  方法二: 

 1 int x = Math.Min((int)m_start_x,(int)e.X);
 2             int y = Math.Min((int)m_start_y,(int)e.Y);
 3             int w = Math.Abs((int)(e.X-m_start_x));
 4             int h = Math.Abs((int)(e.Y-m_start_y));
 5 
 6             Rectangle clip_rect = new Rectangle(x-6,y-6,w+12,h+12);
 7 
 8             switch(m_draw_mode)
 9             {
10 
11                 case DrawingMode.Line:
12                 {
13                     
14                     Invalidate(clip_rect);
15                     Update();
16                     graph.DrawLine(pen,(int)m_start_x,
17                         (int)m_start_y,
18                         (int)e.X,
19                         (int)e.Y);
20                 }
21                     break;
22             
23                 case DrawingMode.Rectangle:
24                 {                    
25                     Invalidate(clip_rect);
26                     Update();        
27                     graph.DrawRectangle(pen,x,y,w,h);    
28                 }
29                     break;
30 
31                 case DrawingMode.Polygon:
32                 {
33             
34                     
35                     if(m_current_polygon.Count>1)
36                     {                        
37                         Invalidate(clip_rect);
38                         Update();
39                         m_current_polygon[m_current_polygon.Count-1] = new PointF(e.X,e.Y);
40                     
41                         Point[] points = new Point[m_current_polygon.Count];
42                         for(int i=0; i<m_current_polygon.Count; i++)
43                         {
44                             int x1 = (int)((PointF)m_current_polygon[i]).X;
45                             int y1 = (int)((PointF)m_current_polygon[i]).Y;
46                             points[i] = new Point(x1,y1);
47                         }
48                         graph.DrawLines(pen,points);    
49                     }
50                 }
51                     break;
52             }
View Code

  这里可以展示一下ArcGIS中的图片,左图为移动,右图为编辑节点。可以看出蓝色部分为缓存的图片,右图更加明显,由蓝色部分移动到下方后又往回移动,下方的为缓存图片的显示。同样,移动画笔,放大,缩小都是采用缓存图片来绘制,提升用户体验的效果。


  d 选中图形后。(局部刷新)

  e 画布移动的过程中。(整体刷新,最好能够界面保持技术,局部刷新)

  • 2.另一个是编辑,编辑过程涉及大量的鼠标事件、键盘事件MouseDown、MouseMove、MouseUp
    MouseDown MouseMove MouseUp   DoubleClick
点             绘制点。完成单点绘制      
线

绘制点

n=1

n>1

局部刷新,绘制新增的线段   完成绘制

绘点

n=1绘点

n=2绘线

n>2绘制面

局部刷新   完成绘制
矩形

绘制点

n=1

局部刷新

绘制矩形

绘制矩形  
圆弧

n=1

n=2

n=3 完成绘制

     

中点-半径

n=1

n=2 完成绘制

三点

n=1

n=2

n=3完成绘制

局部刷新    

移动画布

绘制中移动

移动图形

                                              

 

原文地址:https://www.cnblogs.com/yhlx125/p/3181606.html