Funciones y Librerías
Imagina estar en una vasta llanura, a pie o en moto, el rumbo perdido pero sabes tu destino. Luego agradeces no haber gastado la carga del teléfono para poder orientarte. Pero, ¿cómo lo sabe? En resumen lo hace un sistema de satélites y entre bastidores, todo es cuestión de matemáticas, algoritmos y programación. ¿Pero, cómo se orientan los satélites que nos guían?. Hoy nos embarcaremos en un viaje para explorar cómo las funciones y bibliotecas de C++ pueden ayudarnos a resolver problemas simples de navegación por satélite, geodesia y cartografía.
C++ como lenguaje ofrece librerías, rendimiento, flexibilidad y control necesario y suficiente: https://espaecial.org/abstracciones-1/
1. El problema de la precisión: el dilema de Geodestas
En las primeras navegaciones, los marineros se guiaban con estrellas. Hoy, dependemos de los satélites orbitando la Tierra. Estos satélites envían señales a dispositivos en tierra, que calculan su posición mediante complejas fórmulas matemáticas. Pero aquí está el truco: la Tierra no es una esfera perfecta. Es un elipsoide, ligeramente achatado en los polos. Esto significa que calcular distancias, áreas y direcciones en la superficie terrestre no es nada sencillo.
Como geodesta o ingeniero de satélites, necesitas herramientas para resolver problemas como calcular distancias entre puntos, el área de una región o determinar direcciones. Y hay que hacerlo con precisión. Aquí es donde entran en juego las funciones y bibliotecas de C++.
2. Funciones: los bloques de construcción para navegar
Empecemos con lo básico. Una función C++ es la herramienta de un geodesta y realiza una tarea específica, como calcular distancias y áreas, y resolver sistemas de ecuaciones. Una vez que has escrito una función, puedes utilizarla una y otra vez, igual que utilizarías una brújula o una regla.
La distancia del Gran Círculo
Imagina que tienes que calcular la distancia entre dos puntos de la superficie terrestre. Es la distancia ortodrómica o del gran círculo, que se calcula mediante la ecuación de Haversine (https://en.wikipedia.org/wiki/Haversine_formula) que en C++ es:
double calculateDistance(GeoPoint a, GeoPoint b) {
const double R = 6371.0; // Radio de la tierra en kilómetros
double lat1 = toRadians(a.latitude); // toRadians es una función para
double lon1 = toRadians(a.longitude); // transformar ángulos de grados
double lat2 = toRadians(b.latitude); // a radianes
double lon2 = toRadians(b.longitude);
double dlat = lat2 - lat1;
double dlon = lon2 - lon1;
double h = sin(dlat / 2) * sin(dlat / 2) +
cos(lat1) * cos(lat2) * sin(dlon / 2) * sin(dlon / 2);
double c = 2 * atan2(sqrt(h), sqrt(1 - h));
return R * c;
}
Esta función toma dos puntos, a y b, cada uno definido por su latitud y longitud. Calcula la distancia entre ellos utilizando la fórmula del haverseno, que tiene en cuenta la curvatura de la Tierra. Con esta función puedes calcular la distancia entre dos puntos cualesquiera de la Tierra.
3. Bibliotecas: Compartir conocimientos en todo el mundo
Las funciones son potentes, pero ¿y si quieres compartir tus herramientas con otros? ¿O utilizar herramientas creadas por otros? Aquí es donde entran en juego las bibliotecas. Una biblioteca es una colección de funciones, tipos y constantes que puedes utilizar en tus programas.
Biblioteca Geoshapes
Vamos a crear una biblioteca para geodesia. La llamaremos geoshapes.h. Esta biblioteca incluirá herramientas para trabajar con puntos, líneas y círculos de la superficie terrestre. Por ejemplo, podría incluir una función para calcular el área de un círculo (que representa la superficie de la Tierra) o la distancia entre dos puntos. Este es el aspecto que podría tener la interfaz:
#ifndef _geoshapes_h
#define _geoshapes_h
#include <cmath>
#include <string>
const double PI = 3.141592653589793;
struct GeoPoint {
double latitude;
double longitude;
};
double calculateArea(ShapeType type, double radius = 6371.0);
double calculateDistance(GeoPoint a, GeoPoint b);
#endif
Esta librería exporta una constante PI, una estructura GeoPoint para representar un punto en la Tierra, y dos funciones: calculateArea y calculateDistance. Con esta biblioteca, puedes calcular áreas y distancias fácilmente.
4. El poder de descomponer problemas
Una de las lecciones más importantes en programación -y en geodesia- es el poder de la descomposición. Cuando te enfrentes a un problema complejo, divídelo en partes más pequeñas y manejables. Esto es exactamente lo que hacemos con las funciones.
Hallar el centroide de un polígono
Supongamos que está cartografiando una región y necesita encontrar el centroide de un polígono. El centroide es el «centro de masa» del polígono y se calcula mediante las siguientes fórmulas:
Cx = (1 / (6 * A)) * Σ (xi + xi+1)(xi * yi+1 - xi+1 * yi);
Cy = (1 / (6 * A)) * Σ (yi + yi+1)(xi * yi+1 - xi+1 * yi);
Así es como se podría implementar esto en C++:
GeoPoint calculateCentroid(std::vector<GeoPoint> vertices) {
double A = 0, Cx = 0, Cy = 0;
int n = vertices.size();
for (int i = 0; i < n; i++) {
double x1 = vertices[i].latitude;
double y1 = vertices[i].longitude;
double x2 = vertices[(i + 1) % n].latitude;
double y2 = vertices[(i + 1) % n].longitude;
double cross = x1 * y2 - x2 * y1;
A += cross;
Cx += (x1 + x2) * cross;
Cy += (y1 + y2) * cross;
}
A /= 2;
Cx /= (6 * A);
Cy /= (6 * A);
return {Cx, Cy};
}
Esta función toma una lista de vértices y calcula el centroide utilizando las fórmulas anteriores. Al dividir el problema en pasos más pequeños, lo hacemos más fácil de entender y resolver.
5. Aleatoriedad navegando: Simulación de la incertidumbre
En la navegación por satélite, la aleatoriedad desempeña un papel crucial. Las señales de los satélites se ven afectadas por el ruido, y los algoritmos deben tener en cuenta esta incertidumbre. En C++, podemos utilizar la biblioteca random.h para simular la aleatoriedad.
Simulación de señales de satélite
Supongamos que desea simular el error de una señal de satélite. Puede utilizar la función randomReal para generar un valor de error aleatorio:
double simulateError() {
return randomReal(-5.0, 5.0); // Simula un error random entre -5 y +5
}
By adding this error to your calculations, you can test how your algorithms perform under real-world conditions.
6. El arte de diseñar interfaces
Diseñar una biblioteca es un arte. Una buena biblioteca debe ser sencilla, unificada y estable. Debe ocultar la complejidad al usuario a la vez que le proporciona todas las herramientas que necesita.
Librería topooperations
Diseñemos otra biblioteca, topooperations.h, para operaciones topológicas. Esta biblioteca incluirá funciones para calcular la dirección entre dos puntos y el punto medio en la superficie terrestre. Esta la interfaz:
#ifndef _topooperations_h
#define _topooperations_h
#include "geoshapes.h"
Direction getDirection(GeoPoint start, GeoPoint end);
GeoPoint midpoint(GeoPoint a, GeoPoint b);
#endif
La función getDirection calcula la dirección de la brújula (NORTE, ESTE, SUR u OESTE) entre dos puntos, mientras que la función midpoint calcula el punto medio geográfico.
7. Un mundo de posibilidades
Al llegar al final de nuestro viaje, tómate un momento para reflexionar sobre lo que hemos aprendido. Las funciones y las bibliotecas son los pilares de la programación. Nos permiten resolver problemas complejos, compartir conocimientos y crear herramientas que otros pueden utilizar.
En el mundo de la navegación por satélite y la geodesia, estas herramientas son esenciales. Nos ayudan a calcular distancias, cartografiar regiones y comprender la Tierra misma. Y mientras continúas tu viaje, recuerda: todo gran descubrimiento empieza con un solo paso, o con una sola línea de código.
Crea tu primera biblioteca. Y explora el mundo de posibilidades que ofrece la programación. La Tierra te espera.
8. ¡Práctica!
Así que adelante. Escribe tu primera función. Lee la sección 9: Fuentes para mejorar tu comprensión al respecto y resuelve los ejercicios en https://www.overleaf.com/read/swxzpymqwdyr#3aa2eb. Si necesitas guía, revisa este link https://github.com/ESPAECIAL/PROGRAMMINGABSTRACTIONS/tree/main/src/CHAPTER2.
Descubrirás una sorpresa si en esta lectura encuentras errores entre líneas, coméntala!
Empieza ahora a aprender ciencia satelital con contenido muy intuitivo y gratuito para tí en https://espaecial.org/navegacion-satelital-revolucion-gnss-y-su-impacto-global/
9. Fuentes
Este contenido está basado en experiencias propias y en el libro de Programming Abstractions in C++ por Eric Roberts. Lee esta página web https://web.stanford.edu/dept/cs_edu/resources/textbook/ para encontrar las versiones gratuita y paga.