Anda di halaman 1dari 18

Clase Coordenadas (C/C++)

Publicado el 29 septiembre, 2011por Jos Guerrero

Coloco este esbozo de una Clase Coordenadas (en R ) con el fin de ir mejorndola
con el tiempo. Los mtodos 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 multiplicacin de un vector
por un escalar, la sobrecarga de los operadores >> y << para la entrada y salida por
pantalla con formato vectorial, la implementacin de funciones para el cambio de
coordenadas: geogrficas a UTM, UTM a geogrficas, de geogrficas a geocntricas
y de geocntricas a geogrficas (cambio de datum con 7 parmetros).
3

#include <iostream>

2
3

using namespace std;

4
5
6

#include <cstdlib>
#include <cmath>

7
8

class Coordenadas {

9
private:

1
0
11
1
2
1

double a[3];

public:

1
4
Coordenadas(); // Constructor de la clase coordenadas

1
5

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

1
6
void Iniciar(double m[3]);

1
7

void Mostrar(int p);

1
8

void CambioUtmGeo (int huso, int selector, char hem, Coordenadas v, Coo

1
9
2
0

void CambioGeoUtm (int selector, char long_, char lat_, Coordenadas v,

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

2
1
2
2
2
3

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

Coordenadas CambioUtmGeo (int huso, int selector, char hem, Coordenadas

2
4

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

2
5
2
6
2

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

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

2
8

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

2
9

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

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

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

3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
4
0
4

};

1
4
2
4
3
4
4
Por falta de espacio, a continuacin, presento solamente una seleccin de los
mtodos implementados.
1

double Coordenadas:: operator &(Coordenadas v){

2
3

// Producto escalar de dos vectores

4
5

int i;

6
7

double prod_esc = 0;

8
9

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

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

11
12
}

13
return prod_esc;

14
15
16

17
18

double Coordenadas:: operator %(Coordenadas v){

19
20

// Distancia entre dos vectores

21
22

int i;

23
double distancia = 0;

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

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

28
29

30
31
32

distancia = sqrt(distancia);

33
return distancia;

34
35
36

37
38

Coordenadas operator +(Coordenadas t, Coordenadas s){

39
Coordenadas tempo;

40
41

int i;

42
43

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

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

46
47
}

48
49

return tempo;

50
51
52

53
54

Coordenadas operator -(Coordenadas t, Coordenadas s){

55
Coordenadas tempo;

56
57

int i;

58
59

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

60
61

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

62
63
}

64
65
return tempo;

66
67
}

68
69

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

70
71
72

Coordenadas tempo;

73
int i;

74
75

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

76
77

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

78
79
}

80
81

return tempo;

82
83
}

84
85

istream &operator >> (istream &entrada, Coordenadas &z){//sobrecarga del ope

86
87
int i;

88
89

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

90
91
92

cout << "v[" << i+1 << "] = ? ";

entrada >> z.a[i];

93
94
}

95
96

return entrada;

97
98
99
10
0

ostream &operator << (ostream &salida, Coordenadas &z){//sobrecarga del oper

10
1
10
2

cout.setf(ios::fixed);
cout.precision(4);

10
3
10
4
10
5
10
6

int i;

salida << "(";

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

10
7
10
8

salida << z.a[i];

10
9
110
111
112
113

if(i != 2) salida << ", ";

114
115

116
117

salida << ")\n";

118
119

return salida;

12
0
}

12
1
12
2
12
3
Para probar algunas cosas tenemos el siguiente programa principal:
1

#include "Coordenadas.h"

2
3

int main(){

4
5

system("clear");

6
7

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

8
9
1
0
11

int i;
char hem;

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

1
2
1
3
1
4

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;

1
5

x[0]=448500.79, x[1]=4377580.93, x[2]=771.76;

1
6
1
7
1

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

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

1
9

cout << "v=a=" << a << "w=b=" << b; // se sobrecargo el operador << para i

2
0
2
1

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

2
2
2
3
2
4
2
5
2
6

prod_esc = a&a; // calculando la norma de a; se sobrecargo el operador &

e = (1/sqrt(prod_esc))*a; //normalizando el vector a; se sobrecargo el op


// de un escalar por un vector

cout << "c = a + b = " << c << "d = a - b = " << d << "vector a normalizad

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

2
8
2
9
3
0

prod_esc = e&e; // verificando que la norma del vector normalizado a part

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

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

2
3
3
3
4

distancia = a%b; // calculando la distancia entre a y b; se sobrecargo el

cout << distancia << "\n";

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

3
6
3
7
3
8

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

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

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

4
0
4
1
4
2

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

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

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

4
4
4
5
4

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

6
4
7
4
8

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

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

4
9
cout <<

o;

5
0
5
1
5
2

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

l.CambioUtmGeo(30,2,'n',o,l);

//1. De UTM a Geograficas

5
3
cout << l;

5
4
5
5
5
6

a.CambioGeo_Geocent(2,l,a);

//2. De geogrficas a geocentricas

cout << a;

5
7
b.CambioGeocent_Geo(3,a,b);

5
8
5
9
6

cout << b;

//3. De geocentricas a geograficas (ca

0
c.CambioGeoUtm(1,'o','n',b,c);

6
1
6
2

cout << c;

6
3
return 0;

6
4
6
5
6
6
6
7
6
8
6
9
7
0
7
1
7
2
7
3
7

//4. De Geogrficas a UTM

4
7
5
7
6
7
7
7
8
7
9
8
0
8
1
8
2
8
3
8
4
8
5
8
6
8
7
8

8
8
9
9
0
9
1
el cual produce la siguiente salida:
1

a no inicializado = (0.0000, 0.0000, 0.0000)

v=a=(1.0000, 2.0000, -1.0000)

3
4
5

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)

6
producto escalar de a*a = 6.0000

7
norma de e = 1.0000

8
9
1
0
11

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.488

paso por valor: vector en coordenadas geograficas = k = (-3.8019, 43.4884, 0.


vector en coordenadas UTM = h = (354998.1358, 7213903.0114, 0.0000)

1
2
1

paso por referencia: vector en coordenadas geograficas = m = (-70.4390, -25.1

3
1
4
1
5
1
6
1
7
1
8

paso por referencia: vector en coordenadas UTM = n = h = (354998.1373, 721390


(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)

1
9
2
0
Las 5 ltimas lneas corresponden a la transformacin de (448500.7900,
4377580.9300, 771.7600), coordenadas UTM datum ETRS89, a (448610.6013,
4377788.1567, 697.8972), coordenadas UTM datum ED50, del vrtice de
carbonera (Espaa). El proceso es realizado por mtodos que permiten el paso de
coordenadas UTM a geogrficas, de geogrficas a geocntricas, de geocntricas a
geogrficas (cambio de datum con 7 parmetros) y, finalmente, de geogrficas a
UTM. La documentacin de estos mtodos ser el tema de prximos artculos.

Anda mungkin juga menyukai