Initial Commit.
This commit is contained in:
commit
941d8f96d8
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
*~
|
||||||
|
*.gpx
|
||||||
|
.o
|
||||||
|
a.out
|
2
Makefile
Normal file
2
Makefile
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
a.out: main.cpp
|
||||||
|
clang++ -std=c++17 -g -o a.out main.cpp -lGL -lGLU -lglut -lstdc++fs
|
164
main.cpp
Normal file
164
main.cpp
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
#include <GL/glut.h>
|
||||||
|
|
||||||
|
#include <experimental/filesystem>
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <math.h> // fmod
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 1.0}; /* Red diffuse light. */
|
||||||
|
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0}; /* Infinite light location. */
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
float lat;
|
||||||
|
float lon;
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::vector<std::vector<Point> > tracks;
|
||||||
|
|
||||||
|
// TODO(dev):
|
||||||
|
// As per https://www.opengl.org/resources/libraries/glut/spec3/node11.html
|
||||||
|
// "Therefore, GLUT programs should not assume the window was created at the specified size or position.
|
||||||
|
// A GLUT program should use the window's reshape callback to determine the true size of the window."
|
||||||
|
|
||||||
|
void draw(const std::vector<Point> &points)
|
||||||
|
{
|
||||||
|
static float rot=0.0;
|
||||||
|
rot += 0.1f;
|
||||||
|
|
||||||
|
glLineWidth(0.5f);
|
||||||
|
glColor3d(1.0,1.0,1.0);
|
||||||
|
|
||||||
|
// Draw Sun:
|
||||||
|
glBegin(GL_LINE_STRIP);
|
||||||
|
for(auto p : points)
|
||||||
|
glVertex3f(p.lat, p.lon, 0.0);
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
// usleep(100000);
|
||||||
|
|
||||||
|
glutPostRedisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void display()
|
||||||
|
{
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
for(auto track : tracks)
|
||||||
|
draw(track);
|
||||||
|
glutSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
// dvereb:
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
|
/* Enable a single OpenGL light. */
|
||||||
|
// glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
|
||||||
|
// glLightfv(GL_LIGHT0, GL_POSITION, light_position);
|
||||||
|
// glEnable(GL_LIGHT0);
|
||||||
|
// glEnable(GL_LIGHTING);
|
||||||
|
|
||||||
|
/* Use depth buffering for hidden surface elimination. */
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
/* Setup the view of the cube. */
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
gluPerspective( /* field of view in degree */ 70.0,
|
||||||
|
/* aspect ratio */ 1.0,
|
||||||
|
/* Z near */ 1.0, /* Z far */ 1000.0);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
gluLookAt(0.0, 0.0, 20.0, /* eye is at */
|
||||||
|
0.0, 0.0, 0.0, /* center is at */
|
||||||
|
0.0, 1.0, 0.); /* up is in positive Y direction */
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if(argc != 2)
|
||||||
|
{
|
||||||
|
std::cerr << "You pust pass the folder which contains gpx files." << std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> files;
|
||||||
|
for(const auto& entry : std::experimental::filesystem::directory_iterator(argv[1]))
|
||||||
|
{
|
||||||
|
auto extension = entry.path().extension();
|
||||||
|
if(extension == ".gpx")
|
||||||
|
files.push_back(entry.path().filename());
|
||||||
|
}
|
||||||
|
|
||||||
|
for(auto file : files)
|
||||||
|
{
|
||||||
|
std::ifstream ifs(file);
|
||||||
|
if(!ifs.is_open())
|
||||||
|
{
|
||||||
|
std::cerr << "Couldn't open " << file << "." << std::endl;
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string line = "";
|
||||||
|
bool first = true;
|
||||||
|
float diff_lat, diff_lon;
|
||||||
|
std::vector<Point> track;
|
||||||
|
while(std::getline(ifs, line))
|
||||||
|
{
|
||||||
|
// get starting position of field NAMES
|
||||||
|
auto lat = line.find("lat=\"");
|
||||||
|
if(lat == std::string::npos)
|
||||||
|
continue;
|
||||||
|
auto lon = line.find("lon=\"");
|
||||||
|
if(lon == std::string::npos)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// get ending position of field DATA
|
||||||
|
auto lat_to = line.find("\"", lat);
|
||||||
|
if(lat_to == std::string::npos)
|
||||||
|
continue;
|
||||||
|
auto lon_to = line.find("\"", lon);
|
||||||
|
if(lon_to == std::string::npos)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Point p;
|
||||||
|
try {
|
||||||
|
p.lat = std::atof(line.substr(lat + 5, lat_to).c_str()) * 500;
|
||||||
|
p.lon = std::atof(line.substr(lon + 5, lon_to).c_str()) * 500;
|
||||||
|
} catch (const std::exception &e) {
|
||||||
|
std::cerr << "Error in file " << file << ", line \"" << line << "\"." << std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(first)
|
||||||
|
{
|
||||||
|
first = false;
|
||||||
|
diff_lat = p.lat;
|
||||||
|
diff_lon = p.lon;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.lat -= diff_lat;
|
||||||
|
p.lon -= diff_lon;
|
||||||
|
track.push_back(p);
|
||||||
|
}
|
||||||
|
tracks.push_back(track);
|
||||||
|
|
||||||
|
ifs.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA | GLUT_MULTISAMPLE);
|
||||||
|
glutInit(&argc, argv);
|
||||||
|
glutCreateWindow("test opengl program");
|
||||||
|
glutDisplayFunc(display);
|
||||||
|
|
||||||
|
// NOTE(dev): lmfao:
|
||||||
|
// glutSetCursor(GLUT_CURSOR_SPRAY);
|
||||||
|
glutSetCursor(GLUT_CURSOR_FULL_CROSSHAIR);
|
||||||
|
|
||||||
|
init();
|
||||||
|
glutMainLoop();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user