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 - 博客园

相关推荐
UIU1143 小时前
P1481 魔族密码
c++·算法·动态规划
闻缺陷则喜何志丹9 小时前
【C++特性】四种类型转
c++·算法·类型转换
apcipot_rain12 小时前
C++转Java日记(02)
java·开发语言·c++
杜 硕12 小时前
从零开始的C++生活——第七讲——02
开发语言·c++·生活
Rabitebla20 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
西西弗Sisyphus1 天前
C++ 超时互斥锁(Timed Mutex):std::timed_mutex 与 std::unique_lock
c++
今天要早睡_1 天前
C++01_入门基础复习
开发语言·c++
Fuyo_11191 天前
C++ 运行时多态与虚函数机制全面剖析【面试重点】
开发语言·c++·面试
Chen_harmony1 天前
七、STL与string类
开发语言·c++
xxxiugou1231 天前
C++命名空间与引用全解析
开发语言·c++