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

相关推荐
Lhan.zzZ21 分钟前
Qt/QML:业务记录单展示、签名确认与 PDF 导出开发
c++·qt·pdf
傲世仙尊23 分钟前
类和对象上-class与struct实例化内存对齐与this指针
c++
C++ 老炮儿的技术栈28 分钟前
C++ const 的3个核心作用
服务器·c语言·c++·算法·c
小黄人软件30 分钟前
粘贴助手C++版 支持 Windows 7 / 10 / 11 不会出现缺少api-ms-win-core-path-11-1-0.dll
开发语言·c++·windows
有毒的教程41 分钟前
Dev-C++ 避免爆栈(Stack Overflow)完整方案
c++·算法·深度优先
程序员老陆41 分钟前
从汇编层面理解 C++ 多线程
开发语言·c++·程序设计
IOT-Power1 小时前
模板方法 + 策略模式
开发语言·c++
fpcc10 小时前
c++编程实践—堆和栈越界调试
c++
weiabc11 小时前
MSYS2 UCRT64 + g++ C++ 中文输出乱码 完整全过程
c++
灯澜忆梦12 小时前
【面向对象编程C++】| 基础语法
java·c++·算法