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 }
这里可以展示一下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完成绘制 |
局部刷新 | ||
移动画布 绘制中移动 移动图形 |
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2012-07-26 ArcEngine唯一值着色再开发!