• 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完成绘制

    局部刷新    

    移动画布

    绘制中移动

    移动图形

                                                  

     

  • 相关阅读:
    [PHP] thinkphp5 单入口多个模块绑定和路由开关
    [高并发]幂等性、最终一致性
    [高并发]Beanstalkd消息中间件使用
    [高并发]Redis 集群搭建步骤
    [PHP] laravel5.5 搭建流程
    [PHP] 破Laravel白屏问题
    talk 64
    linux
    yum
    linux修改时区
  • 原文地址:https://www.cnblogs.com/yhlx125/p/3181606.html
Copyright © 2020-2023  润新知