C++ OpenGL显示地图

这是一次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 网上搜索

参考资料网址:

Draw_extend使用OpenGL显示数据点 - mememagic - 博客园

相关推荐
hPw0eKIqD20 小时前
C++ 模板参数推导问题小记(非推导上下文)
开发语言·c++
程序员爱德华20 小时前
Python与C++:异同点对比
c++·python
888CC++1 天前
C语言与C++的区别:从面向过程到面向对象
java·c语言·c++
Darkwanderor1 天前
Linux系统编程实战项目:模拟实现shell
linux·c++
himobrinehacken1 天前
揭秘Windows程序启动的神秘之旅
c++·安全
库玛西1 天前
C++ 运行时多态 :核心总结与原理图解
c语言·c++·笔记
Byron Loong1 天前
【C++】重定向是什么
开发语言·c++
hansang_IR1 天前
【题解】LC:Z 算法(Z Algorithm)
c++·算法·字符串
霍霍的袁1 天前
【C++】模板从入门到进阶(函数模板 + 类模板 + 特化 + 分离编译)
开发语言·c++·visual studio
海清河晏1111 天前
Qt 实战:信号与槽+事件系统
开发语言·c++·qt