Clase Coordenadas (C/C++)

Coloco este esbozo de una Clase Coordenadas (en R3) con el fin de ir mejorándola con el tiempo. Los métodos corresponden al constructor y destructor de la Clase, un procedimiento para iniciar (copiar) y mostrar los objetos, la sobrecarga de los operadores & y % para realizar el producto escalar y el calculo de la distancia entre dos vectores, respectivamente, la sobrecarga de los operadores + y – para la suma y resta de vectores, la sobrecarga del operador * para la multiplicación de un vector por un escalar, la sobrecarga de los operadores >> y << para la entrada y salida por pantalla con formato vectorial, la implementación de funciones para el cambio de coordenadas: geográficas a UTM, UTM a geográficas, de geográficas a geocéntricas y de geocéntricas a geográficas (cambio de datum con 7 parámetros).

#include <iostream>

using namespace std;

#include <cstdlib>
#include <cmath>

class Coordenadas {

	private:

		double a[3];

	public:

		Coordenadas(); // Constructor de la clase coordenadas
	   ~Coordenadas(); // Destructor de la clase coordenadas

		void Iniciar(double m[3]);
		void Mostrar(int p);

		void CambioUtmGeo (int huso, int selector, char hem, Coordenadas v, Coordenadas &t);
		void CambioGeoUtm (int selector, char long_, char lat_, Coordenadas v, Coordenadas &t);

		void CambioGeo_Geocent (int selector, Coordenadas v, Coordenadas &t);

		void CambioGeocent_Geo(int selector, Coordenadas v, Coordenadas &t);

		Coordenadas CambioUtmGeo (int huso, int selector, char hem, Coordenadas v);

		double operator & (Coordenadas v); // Producto escalar de dos vectores

		double operator % (Coordenadas v); // Distancia entre dos vectores

		friend Coordenadas operator +(Coordenadas t, Coordenadas s);
		friend Coordenadas operator -(Coordenadas t, Coordenadas s);

		friend Coordenadas operator *(double n, Coordenadas s); // escalar por un vector

		friend istream& operator >> (istream &entrada, Coordenadas &z);

		friend ostream& operator << (ostream &salida, Coordenadas &z);

};

Por falta de espacio, a continuación, presento solamente una selección de los métodos implementados.

double Coordenadas:: operator &(Coordenadas v){

	// Producto escalar de dos vectores

	int i;

	double prod_esc = 0;

	for (i=0; i< 3; i++){

		prod_esc += v.a[i]*a[i];

	}

	return prod_esc;

}

double Coordenadas:: operator %(Coordenadas v){

	// Distancia entre dos vectores

	int i;

	double distancia = 0;

	for (i=0; i< 3; i++){

		distancia += (v.a[i]-a[i])*(v.a[i]-a[i]);

	}
	
	distancia = sqrt(distancia);	
	
	return distancia;

}

Coordenadas operator +(Coordenadas t, Coordenadas s){

	Coordenadas tempo;

	int i;

		for (i=0; i < 3; i++){

			tempo.a[i] = t.a[i] + s.a[i];

		}

	return tempo;
		
}

Coordenadas operator -(Coordenadas t, Coordenadas s){

	Coordenadas tempo;

	int i;

		for (i=0; i < 3; i++){

			tempo.a[i] = t.a[i] - s.a[i];

		}

	return tempo;
		
}

Coordenadas operator *(double n, Coordenadas s){// Escalar por un vector

	Coordenadas tempo;

	int i;

		for (i=0; i < 3; i++){

			tempo.a[i] = n*s.a[i];

		}

	return tempo;
		
}

istream &operator >> (istream &entrada, Coordenadas &z){//sobrecarga del operador >>
		
 		int i;

		for (i=0; i < 3; i++){
			
			cout << "v[" << i+1 << "] = ? ";
			entrada >> z.a[i];
			
		}

		return entrada;

} 

ostream &operator << (ostream &salida, Coordenadas &z){//sobrecarga del operador <<
		
		cout.setf(ios::fixed);
		cout.precision(4);

 		int i;

		salida << "(";

		for (i=0; i < 3; i++){

			salida << z.a[i];
			
			if(i != 2) salida << ", ";

		}

		salida << ")\n";

		return salida;

} 

Para probar algunas cosas tenemos el siguiente programa principal:

#include "Coordenadas.h"

int main(){

	system("clear");

	Coordenadas a, b, c, d, e, f, g, h, j, k, l, m, n, o; // Declara objetos de la Clase Coordenadas 

	int i;
	char hem;

	double v[3], w[3], t[3], s[3], r[3], x[3], prod_esc, distancia;

	v[0]=1, v[1]=2, v[2]=-1;
	w[0]=0, w[1]=-3, w[2]=-5;
	t[0]=435157.59, t[1]=4815453.64, t[2]=0;
	r[0]=354998.1358, r[1]=7213903.0114, r[2]=0;
	x[0]=448500.79, x[1]=4377580.93, x[2]=771.76;


	cout << "a no inicializado = "; a.Mostrar(4);

	a.Iniciar(v), b.Iniciar(w), f.Iniciar(t), h.Iniciar(r), o.Iniciar(x); // Inicia los objetos

	cout << "v=a=" << a << "w=b=" << b; // se sobrecargo el operador << para imprimir objetos de la Clase Coordenadas

	c = a + b;
	d = a - b;

	prod_esc = a&a; // calculando la norma de a; se sobrecargo el operador & para realizar producto escalar

	e = (1/sqrt(prod_esc))*a; //normalizando el vector a; se sobrecargo el operador * para realizar el producto
							  // de un escalar por un vector

	cout << "c = a + b = " << c << "d = a - b = " << d << "vector a normalizado = e = " << e;

	cout << "producto escalar de a*a = " << prod_esc << "\n";

	prod_esc = e&e; // verificando que la norma del vector normalizado a partir de a es 1

	cout << "norma de e = " << prod_esc << "\n";

	cout << "Distancia entre a y b = ";

	distancia = a%b; // calculando la distancia entre a y b; se sobrecargo el operador % para realizar esta tarea

	cout << distancia << "\n";

	cout << "vector en coordenadas UTM = f = " << f;

	g.CambioUtmGeo(30,1,'n',f,g);

	cout << "paso por referencia: vector en coordenadas geograficas = g = " << g; 

	k = j.CambioUtmGeo(30,1,'n',f),

	cout << "paso por valor: vector en coordenadas geograficas = k = " << k;

	cout << "vector en coordenadas UTM = h = " << h;

	m.CambioUtmGeo(19,2,'s',h,m);

	cout << "paso por referencia: vector en coordenadas geograficas = m = " << m; 

	n.CambioGeoUtm(2,'o','s',m,n);

	cout << "paso por referencia: vector en coordenadas UTM = n = h = " << n;

	cout <<  o;

	// De UTM a UTM con cambio de datum (4 pasos)

	l.CambioUtmGeo(30,2,'n',o,l);      //1. De UTM a Geograficas

	cout << l;

	a.CambioGeo_Geocent(2,l,a);        //2. De geográficas a geocentricas

	cout << a;

	b.CambioGeocent_Geo(3,a,b);        //3. De geocentricas a geograficas (cambio de datum) 

	cout << b;

	c.CambioGeoUtm(1,'o','n',b,c);     //4. De Geográficas a UTM

	cout << c;

	return 0;

}

el cual produce la siguiente salida:

a no inicializado = (0.0000, 0.0000, 0.0000)
v=a=(1.0000, 2.0000, -1.0000)
w=b=(0.0000, -3.0000, -5.0000)
c = a + b = (1.0000, -1.0000, -6.0000)
d = a - b = (1.0000, 5.0000, 4.0000)
vector a normalizado = e = (0.4082, 0.8165, -0.4082)
producto escalar de a*a = 6.0000
norma de e = 1.0000
Distancia entre a y b = 6.4807
vector en coordenadas UTM = f = (435157.5900, 4815453.6400, 0.0000)
paso por referencia: vector en coordenadas geograficas = g = (-3.8019, 43.4884, 0.0000)
paso por valor: vector en coordenadas geograficas = k = (-3.8019, 43.4884, 0.0000)
vector en coordenadas UTM = h = (354998.1358, 7213903.0114, 0.0000)
paso por referencia: vector en coordenadas geograficas = m = (-70.4390, -25.1840, 0.0000)
paso por referencia: vector en coordenadas UTM = n = h = (354998.1373, 7213903.0110, 0.0000)
(448500.7900, 4377580.9300, 771.7600)
(-3.5994, 39.5464, 771.7600)
(4915809.5115, -309222.2929, 4039765.1165)
(-3.5981, 39.5476, 697.8972)
(448610.6013, 4377788.1567, 697.8972)

Las 5 últimas líneas corresponden a la transformación de (448500.7900, 4377580.9300, 771.7600), coordenadas UTM datum ETRS89, a (448610.6013, 4377788.1567, 697.8972), coordenadas UTM datum ED50, del vértice de carbonera (España). El proceso es realizado por métodos que permiten el paso de coordenadas UTM a geográficas, de geográficas a geocéntricas, de geocéntricas a geográficas (cambio de datum con 7 parámetros) y, finalmente, de geográficas a UTM. La documentación de estos métodos será el tema de próximos artículos.

Esta entrada fue publicada en Código C++, SIG, Transformar Coordenadas. Guarda el enlace permanente.

3 respuestas a Clase Coordenadas (C/C++)

  1. Pingback: Método para convertir coordenadas geocéntricas en geográficas (cambio de datum 7 parámetros): Clase Coordenadas (C/C++) |

  2. Trabajando en code blocks no compila. Como se calcula la distancia entre dos vectores de componente (x,y,z) usando la función sqrt y for combinadas con otras básicas.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s