This repository has been archived on 2023-11-03. You can view files and clone it, but cannot push or open issues or pull requests.
GINPA/Controleur/miscellaneous.c

107 lines
2.9 KiB
C

#include "miscellaneous.h"
void getExtrema(Point const* const pts, uint32_t const taille, Coordonnees *const hautGauche, Coordonnees *const basDroit)
{
hautGauche->lat = 90;
hautGauche->lon = -180;
basDroit->lat = -90;
basDroit->lon = 180;
for(uint32_t i = 0; i < taille; i++)
{
if(hautGauche->lat > pts[i].pos.lat)
{
hautGauche->lat = pts[i].pos.lat;
}
if(hautGauche->lon < pts[i].pos.lon)
{
hautGauche->lon = pts[i].pos.lon;
}
if(basDroit->lat < pts[i].pos.lat)
{
basDroit->lat = pts[i].pos.lat;
}
if(basDroit->lon > pts[i].pos.lon)
{
basDroit->lon = pts[i].pos.lon;
}
}
}
bool getBackgroundMap(const Coordonnees *const pointCentral, const uint8_t zoom)
{
// Ici on fabrique notre """petite""" URL magique
char request[REQUESTSIZE] = "";
snprintf(request, REQUESTSIZE,
"https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&size=%ux%u&scale=%u&zoom=%u&key=%s",
pointCentral->lat, pointCentral->lon,
MAPSIZE, MAPSIZE,
MAPSCALE,
zoom,
APIKEY);
/* cURL Request */
// On crée notre objet cURL pour la suite
CURL *curl = curl_easy_init();
if(curl == NULL)
{
return false;
}
// On crée / ouvre un fichier en écriture
FILE *map = fopen(MAPFILE, "wb");
if(map == NULL)
{
curl_easy_cleanup(curl);
fprintf(stderr, "L'ouverture du fichier n\'a pas été possible: %s\n", strerror(errno));
return false;
}
// On crée nos opérations à effectuer lors de l'exécution de la requête
curl_easy_setopt(curl, CURLOPT_URL, request);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, map);
// On exécute !
CURLcode res = curl_easy_perform(curl);
// On détruit notre objet cURL
curl_easy_cleanup(curl);
// On ferme le fichier
if(fclose(map) == EOF)
{
fprintf(stderr, "La fermeture du fichier n\'a pas été possible: %s\n", strerror(errno));
return false;
}
// On indique à la fonction appelante si cURL correctement effectué les opérations ou non !
return (res == CURLE_OK ? true : false);
}
void getZoomEchelle(const Coordonnees *const pointHautGauche, const Coordonnees *const pointBasDroite, uint8_t *const zoom, double *const echelle)
{
const double distLat = RAYON * RADIANS(pointHautGauche->lon-pointBasDroite->lon);
const double distLon = RAYON * log(tan(PI / 4.0 + RADIANS(pointBasDroite->lat) / 2.0)
/ tan(PI / 4.0 + RADIANS(pointHautGauche->lat) / 2.0));
// Calcul de la distance maximum entre les points les plus éloignés, que l'on devra
// pouvoir être en mesure d'afficher
const double distanceMaximale = distLat > distLon ? distLat : distLon;
// L'échelle faisant correspondre la taille de la carte à la réalité voulue
*echelle = (distanceMaximale + 1.0e-2 * BORDERSIZE / PPCM) / (1.0e-2 * (WIDTH < HEIGHT ? WIDTH : HEIGHT) / PPCM);
// Partie entière du zoom à cause de l'API google maps.
*zoom = floor(log2(CONSTANTE / (*echelle)) - 1);
// L'échelle de la carte avec le zoom arrondi.
*echelle = CONSTANTE / pow(2.0, *zoom + 1);
}