这是一次opengl 加载地图资源显示学习过程
使用
使用glfw而不是使用glut方式
glfw-3.4.0 Download | GLFW
glad2.0 在https://glad.dav1d.de/网站上,通过配置定制源码
包含路径
glfw-3.4\include\
glfw-3.4\deps\
将下面代码依次复制到一个cpp文件中
cpp
#include <iostream>
#include <fstream>
#include <vector>
#define GLAD_GL_IMPLEMENTATION
#include <glad/gl.h> // GLAD2 头文件,必须在 GLFW 前面
#include <GLFW/glfw3.h>
cpp
class MapPoint
{
public:
double longitude;
double latitude;
};
class Polygon
{
public:
vector<MapPoint> points; //多边形的顶点序列
};
vector<Polygon*> polys; //多边形集合
vector<Polygon*> ReadMapData(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();
}
cpp
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(110.0, 118.0, 30.0, 38.0, -1.0, 1.0);
}
// 窗口大小改变时自动调整视口和投影
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height); // 自动适配新窗口大小
// 重新设置投影矩阵,保证地图不变形
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(110.0, 118.0, 30.0, 38.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}
cpp
int main(int argc, char** argv)
{
char* filename = "D:/HenanCounty.txt";
polys = ReadMapData(filename);
if (!glfwInit()) return -1;
// 单缓冲
glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_FALSE);
GLFWwindow* window = glfwCreateWindow(500, 500, "地图绘制", NULL, NULL);
if (!window) { glfwTerminate(); return -1; }
glfwSetWindowPos(window, 100, 100);
// 1. 先把上下文设为当前
glfwMakeContextCurrent(window);
// 2. 注册窗口大小变化回调(自适应关键)
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 3. GLAD2 加载 OpenGL 函数
int version = gladLoadGL(glfwGetProcAddress);
if (version == 0) {
// 加载失败
glfwTerminate();
return -1;
}
//
init();
while (!glfwWindowShouldClose(window))
{
display();
glFlush();
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
D:/HenanCounty.txt 网上搜索
参考资料网址: