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

相关推荐
博客18004 小时前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴5 小时前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨1 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
clint4565 天前
C++进阶(1)——前景提要
c++
夜悊5 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴5 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0016 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
玖玥拾6 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you6 天前
constexpr函数
c++
凡人叶枫6 天前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++