计算机图形学(1)地图绘制
目录
3.6 编程实例 - 地图绘制
3.6.1 地图绘制方法
3.6.2 基于OpenGL的地图绘制
3.6.3 代码
3.6 编程实例 - 地图绘制
显示漂亮的地图是地理信息系统软件的基本功能。事实上,借助基本图元的绘制函数,可以很容易地编写一个可以显示地图的程序。在地里信息系统中,地图数据可以分为两类,一类是矢量数据,它是以点、线、多边形三种图元形式表示地图的图形数据,比如行政区、湖泊可以用多边形表示,河流、道路用折线表示。另一类叫做栅格数据,它是以点阵形式表示的图像数据。利用计算机图形学的知识和编程技术,不难将这两种数据绘制出来。
3.6.1 地图绘制方法
以河南省为例,可以用多边形表示县级行政区边界的形状,即每个县表示为一个多边形,如果这个省包括多个岛,则每个岛屿也是独立的多边形,而每个多边形是由组成它边界顶点序列表示的。假定图形数据用经纬网坐标系表达。
显示这样的各县地图的步骤如下:
(1)读入数据。把每个多边形的边界顶点序列从磁盘中读入存放在一个点数组中,再把所有表示多边形的点数组指针存放进一个容器对象中,该容器可以是数组、链表或任何动态数据结构。多边形和折线可分别用两个容器存放。
地图中每个岛屿与省份多边形的数据在文本文件中的存储方式为,先在一行中用一个数表示多边形的顶点个数,接着按一顶顺序列举各顶点的坐标,每个点的坐标占据一行。如图所示。
注:所用数据基于国家测绘局发布的标准地理信息
(2)变换图形。河南省大致在东经110°~117°和北纬31°~36°范围内,当用GDI以经度(x轴)和纬度(y轴)对屏幕坐标1:1绘制时,则会得到一幅很小的地图,几乎看不清楚。先将所有顶点经度值减去110、纬度值减去31,再将纬度值和经度值乘以一个因子,得到放大了的地图数据。当用OpenGL绘制时,只需设置glOrtho的平行投影参数来控制显示范围,因而无需做上述变换。
(3)采用循环的方式,分别遍历两个图元容器中的所有数据,调用多边形及折线的图元绘制功能将上述变换后的数据在屏幕上绘出。利用区域填充功能,还可以将所有多边形以某种颜色填充,得到彩色的地图。
3.6.2 基于OpenGL的地图绘制
虽然OpenGL中提供了GL_POLYGON指令用于创建多边形,但它只支持凸多边形,无法正确绘制任意多边形。可将任意多边形分割为多个凸多边形,但这个分割过程通常由人工来完成,因此不适合用来批量绘制任意多边形。为了简便处理,这里使用GL_LINE_LOOP指令来绘制多边形的闭合边界,而不再绘制用颜色填充的多边形。使用OpenGL绘制的河南省各县地图效果如图所示。
3.6.3 代码
完整工程及数据文件下载:https://download.csdn.net/download/me__we/10821480
#include "stdafx.h"#include <iostream>
#include <fstream>
#include<vector>
#include <GL/glut.h>
using namespace std;class MapPoint
{
public:double longitude;double latitude;
};class Polygon
{
public:vector<MapPoint> points; //多边形的顶点序列
};vector<Polygon*> polys; //多边形集合
vector<Polygon*> ReadMapData(const char* filename)
{int PointCount;vector<Polygon*> polygons;ifstream fs(filename);while (fs.eof() != true){Polygon* poly = new Polygon;fs >> PointCount;cout << PointCount << endl;for (int i = 0; i<PointCount; i++){MapPoint p;fs >> p.longitude >> p.latitude;poly->points.push_back(p);}polygons.push_back(poly);}return polygons;
}void display(void)
{glClear(GL_COLOR_BUFFER_BIT);//用蓝色色绘制各省边界glColor3f(0.0, 0.0, 1.0);glPolygonMode(GL_BACK, GL_LINE);for (int i = 0; i<polys.size(); i++){vector<MapPoint> points = polys[i]->points;glBegin(GL_LINE_STRIP);for (int j = 0; j<points.size(); j++){glVertex3f(points[j].longitude, points[j].latitude, 0.0);}glEnd();}glFlush();
}void init(void)
{//设置背景颜色glClearColor(1.0, 1.0, 1.0, 0.0);//初始化观察值glMatrixMode(GL_PROJECTION); //将矩阵模式设为投影glLoadIdentity(); //对矩阵进行单位化glOrtho(110.0, 117.0, 31.0, 37.0, -1.0, 1.0); //构造平行投影矩阵
}int main(int argc, char** argv)
{const char* filename = "F:/HenanCounty.txt"; //根据自己下载的文件位置更改polys = ReadMapData(filename);glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //单缓存和RGBglutInitWindowSize(700, 700);glutInitWindowPosition(100, 100);glutCreateWindow("河南地图");init();glutDisplayFunc(display); //显示回调函数glutMainLoop();return 0;
}
计算机图形学(1)地图绘制相关推荐
- 计算机图形学绘制图形的过程,计算机图形学13_图形绘制流水线的实现.pdf
您所在位置:网站首页 > 海量文档  > 计算机 > 图形图像 计算机图形学13_图形绘制流水线的实现.pdf6页 本 ...
- 计算机图形学上机报告绘制圆,计算机图形学上机实验报告
实验一:基本图形的绘制 一.实验目的与要求 (1)理解glut程序框架: (2)理解窗口到视区的变换 ; (3)理解OpenGL实现动画的原理: (4)添加代码实现中点Bresenham算法画直线: ...
- 学完计算机图形学可以做什么,计算机图形学心得体会.doc
计算机图形学心得体会 姓 名 学号 201203284 班 级: 计科 序 号: 31 院 系: 计算机科学学院 通过一个学期的学习,经过老师细心的讲解,我对图形学这门课有了基础的认识,从的课上我学到 ...
- 计算机图形学的进展与展望
计算机图形学的进展与展望 浙江大学计算机辅助设计与图形学国家重点实验室主任 石教英 一.前言 计算机图形学作为计算机科学与技术学科的一个独立分支已经历了近40年的发展历程.一方面, ...
- 计算机图形学的最新论文,计算机图形学论文范文参考 计算机图形学毕业论文范文[精选]...
★100篇免费计算机图形学论文范文,为你的写作提供相关参考,可用于计算机图形学方向的硕士论文和本科论文写作参考研究,每一篇都是经典优秀的范文格式模板,[赶紧阅读吧!] 第一篇计算机图形学论文范文参考: ...
- 计算机图形学的进展与展望---1996
浙江大学计算机辅助设计与图形学国家重点实验室主任 石教英 一.前言 计算机图形学作为计算机科学与技术学科的一个独立分支已经历了近40年的发展历程.一方面,作为一个学科,计算机图形学在图形基础算 ...
- GIS地图界面和计算机图形学填充算法
一 GIS地图界面 GIS程序最常见的界面就是,不同区域被边界隔开,填充为不同的颜色: 如下三个:是超图iServer自带: 京津地区土地利用现状,京津地区人口分布,京津地区地貌分布:用于学习是很好资 ...
- 计算机怎样用计算法绘制圆弧,计算机图形学圆弧生成算法具体程序实现
数学与软件科学学院实验报告 学期: 2010 至 2011 第一学期 2010年 10月 5日课程名称: 计算机图形学专业:信息与计算科学2007级5班实验编号: 03 实验项目: 圆弧生成算法 指导 ...
- 计算机图形学实验二交互式绘制多边形
一.实验目的 掌握双缓冲绘图技术. (2)掌握人机交互技术. (3)掌握填充动态多边形的有效边表算法. 二.实验步骤 (1)在VS2017环境下创建MFC应用程序工程(单文档) (2)添加命令消息处理 ...
最新文章
- hashmap是线程安全的吗?怎么解决?_解决SimpleDateFormat线程安全问题
- 添加和移除disabled属性
- 直播活动丨BMMeetup第2期:大模型计算加速技术,2场特邀和7位青年学者技术报告联袂上演...
- 查出引起死锁的进程和SQL语句
- Spring面向方面的编程
- apk安装到电视上看不到图标_零基础搭建电视直播APP平台第二弹(修改APP)
- iOS逆向工具-Theos
- 帆软连接kingbase8
- 【CAN】CAN的比特率和波特率
- 怎样在nature上查文献?
- KETTLE的文本文件输出
- PTA 数据结构与算法 7-8 哈利·波特的考试
- 今日头条视频如何收益
- ORA-01000-超出打开游标的最大数(解决及原因)
- js 中~~是什么意思?
- 2018-2019-2 20189206 《密码与安全新技术专题》 第六次作业
- 3DText无法被物体遮挡 - 解决
- BUGKU-成绩查询
- 完美解决**ModuleNotFoundError: No module named ‘src‘**
- 【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + LingAo IMU 测试及RVIZ展示
热门文章
- CG CTF MISC 丘比龙De女神
- openssl 非对称加密算法DSA命令详解
- doc转docx文件会乱吗_word文档打开都是乱码?没关系,教你解决办法-docx文件
- 磁盘配额管理解决共享硬盘空间不足问题(图)
- dsp应用领域及常用网站
- Springboot毕设项目地铁站自动售票系统77x9w(java+VUE+Mybatis+Maven+Mysql)
- matlab 拉格朗日LM检验,求问,做LM检验和LR检验的stata命令
- webrtc-dtls、sctp、srtp
- python学习第三节:小麦计算器(操作符、数学运算)
- C# - 使用自定义控件实现名单修改的比较功能