Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 5 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Mié Jun 16, 2010 9:23 pm
Mensajes: 355
Ubicación: Venezuela

Nota Publicado: Dom Sep 25, 2011 5:16 pm 
Arriba  
Buenas.

Estoy empezando a desarrollar una clase Coordenadas en la cual he definido lo siguiente:

Código:
class Coordenadas {

   private:

      double a[3];

   public:

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

      void CambioUtmGeo (double huso, double a, double b, Coordenadas v, Coordenadas &t);

      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 ostream& operator << (ostream &salida, Coordenadas &z);

};


La función CambioUtmGeo, produce el resultado que quiero pero, en lugar de pasar el objeto por referencia al programa principal, me interesaría más una asignación directa a otro objeto. He estado un buen tiempo tratando de hacerlo y, finalmente, funcionó lo que les expongo pero no estoy satisfecho. Cuál sería la solución al problema? La implementación de la función es la siguiente:

Código:
void Coordenadas::

   CambioUtmGeo (double huso, double a, double b, Coordenadas v, Coordenadas &t){

   v.a[0] -= 500000;

   const double pi = 3.14159265358979323846;

// Sobre la geometria del elipsoide
// excentricidad = e1; segunda excentricidad = e2

   double e1, e2;

   e1 = sqrt (pow(a,2) - pow(b, 2)) / a;
   e2 = sqrt (pow(a,2) - pow(b, 2)) / b;

// Radio polar de curvatura y aplanamiento
// radio polar de curvatura = c; aplanamiento = alpha

   double c, alpha;

   c = (a*a)/b;

   alpha = (a -b) / a;

// Calculo del meridiano central del huso

   double lambda0;

   lambda0 = huso*6.0 - 183.0;

// Ecuaciones de Coticchia-Surace para el Problema Inverso (Paso de UTM a Geograficas)
// Calculo de Parametros

   double phi, nu, a2, A1, A2, J2, J4, J6, alpha2, beta, gamma, B_phi, b2, zeta, xi,
           eta, delta_lambda, tau;

   phi = v.a[1]/(6366197.724*0.9996);

   nu = (c*0.9996)/sqrt((1 + e2*e2*cos(phi)*cos(phi))); // parecida al directo

   a2 = v.a[0] / nu;

   A1 = sin(2.0*phi);

   A2 = A1 * (cos(phi)*cos(phi));

   J2 = phi + A1/2.0;

   J4 = (3*J2 + A2)/4;

   J6 = (5*J4 + A2 * (cos(phi)*cos(phi)))/3;

   alpha2 = (3.0/4.0)*(e2*e2);

   beta = (5.0/3.0)*(alpha2*alpha2);

   gamma = (35.0/27.0)*(pow(alpha2,3));

   B_phi = 0.9996 * c * (phi - alpha2 * J2 + beta * J4 - gamma * J6);

   b2 = (v.a[1] -B_phi)/nu;

   zeta = (e2*e2/2)*(a2*a2)*(cos(phi)*cos(phi));

   xi = a2 * (1.0 - zeta/3.0);

   eta = b2 * (1.0 - zeta) + phi;

   delta_lambda = atan(sinh(xi)/cos(eta));

   tau = atan(cos(delta_lambda)*tan(eta));

// Calculo final de coordenadas geograficas

   t.a[0] = (delta_lambda/pi)*180.0 + lambda0;

   t.a[1] = 180.0*(phi + (1.0 + (e2*e2)*(cos(phi)*cos(phi))-(3.0/2.0)*(e2*e2)*sin(phi)*cos(phi)*(tau-phi))*(tau-phi))/pi;

   t.a[2] = v.a[2];

   }


Saludos

Editado -- Dom Sep 25, 2011 6:41 pm --

Esta funciona:

Código:
Coordenadas Coordenadas::

   CambioUtmGeo (double huso, double a, double b, Coordenadas v){

   Coordenadas t;

   v.a[0] -= 500000;
.
.
.
// Calculo final de coordenadas geograficas

   t.a[0] = (delta_lambda/pi)*180.0 + lambda0;

   t.a[1] = 180.0*(phi + (1.0 + (e2*e2)*(cos(phi)*cos(phi))-(3.0/2.0)*(e2*e2)*sin(phi)*cos(phi)*(tau-phi))*(tau-phi))/pi;

   t.a[2] = v.a[2];

   return t;
   
   }



Puedo asignar el valor del objeto de esta manera:

Código:
k =  j.CambioUtmGeo(30,6378388.0,6356911.946130,f);

cout << k; //operador << sobrecargado


De esta forma:

Código:
j.CambioUtmGeo(30,6378388.0,6356911.946130,f);

k = j;

cout <<  k;  //operador << sobrecargado


produce basura!! Me imagino que como devuelve un objeto que no se asigna inmediatamente se "pierde en el vacío". Por otra parte, estuve leyendo que esto es costoso y que es preferible el paso por referencia.

Aunque funciona, todavía no termina de gustarme.

_________________
[Reglamento del foro] [Blog]


Última edición por cerenkov el Lun Sep 26, 2011 5:22 pm, editado 1 vez en total
 Perfil Email  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Jue Abr 26, 2007 11:00 pm
Mensajes: 1426

Nota Publicado: Dom Sep 25, 2011 6:12 pm 
Arriba  
Primero que nada tenes que sobrecargar el operador asignación para copiar los valores de un objeto en otro, en este enlace hay un buen ejemplo.
Luego la función tiene que devolver un objeto constante así:

Código:
const Coordenadas & CambioUtmGeo (double huso, double a, double b, Coordenadas v);

_________________
"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."

"Finibus Bonorum Et Malorum", Cicerón

 Perfil WWW  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Mié Jun 16, 2010 9:23 pm
Mensajes: 355
Ubicación: Venezuela

Nota Publicado: Lun Sep 26, 2011 6:28 am 
Arriba  
hipersayan_x escribió:
Primero que nada tenes que sobrecargar el operador asignación para copiar los valores de un objeto en otro, en este enlace hay un buen ejemplo.
Luego la función tiene que devolver un objeto constante así:

Código:
const Coordenadas & CambioUtmGeo (double huso, double a, double b, Coordenadas v);


Gracias por tu respuesta pero no logro hacerlo funcionar con tus sugerencias. Esta bueno por hoy, voy a descansar...

Saludos

Nota: Estoy tan acostumbrado a trabajar con lenguaje procedimental que esto de las clases me abruma. Sin embargo, por vez primera, puedo hacer que funcione (aunque tal vez de manera no muy elegante), el paso por referencia y por valor de un objeto en una Clase. La sobrecarga de operadores siempre la había llevado a cabo con éxito pero hoy, por fin, la entendí con los que pasan un sólo parámetro (como en el producto escalar o la distancia).

Con relación al operador de asignación allí no está el problema. Estuve leyendo que así no lo declare se crea uno por defecto. Por eso es que me funciona esto:

j = j.CambioUtmGeo(30,6378388.0,6356911.946130,f);

Lo que no me gusta es precisamente lo que está en rojo: pero funciona.

_________________
[Reglamento del foro] [Blog]

 Perfil Email  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Jue Abr 26, 2007 11:00 pm
Mensajes: 1426

Nota Publicado: Lun Sep 26, 2011 9:10 am 
Arriba  
cerenkov escribió:
Nota: Estoy tan acostumbrado a trabajar con lenguaje procedimental que esto de las clases me abruma. Sin embargo, por vez primera, puedo hacer que funcione (aunque tal vez de manera no muy elegante), el paso por referencia y por valor de un objeto en una Clase. La sobrecarga de operadores siempre la había llevado a cabo con éxito pero hoy, por fin, la entendí con los que pasan un sólo parámetro (como en el producto escalar o la distancia).

Con relación al operador de asignación allí no está el problema. Estuve leyendo que así no lo declare se crea uno por defecto. Por eso es que me funciona esto:

j = j.CambioUtmGeo(30,6378388.0,6356911.946130,f);

Lo que no me gusta es precisamente lo que está en rojo: pero funciona.


:? Emm... así?:

Código:
j.CambioUtmGeoFrom(30,6378388.0,6356911.946130, f);


Ahora, si CambioUtmGeo es un método de la clase Coordenadas para convertir esa misma coordenada entonces quedaría mejor así:

Código:
// Devuelve un nuevo objeto constante.
const Coordenadas & CambioUtmGeo (double huso, double a, double b);
/*
No es nada raro ver algo como esto:

j = j.CambioUtmGeo (30, 6378388.0, 6356911.946130);
*/

// O reasigna nuevos valores al objeto.
void toCambioUtmGeo (double huso, double a, double b);
/*
Y quedaría así:

j.toCambioUtmGeo (30, 6378388.0, 6356911.946130);
*/

_________________
"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."

"Finibus Bonorum Et Malorum", Cicerón

 Perfil WWW  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Mié Jun 16, 2010 9:23 pm
Mensajes: 355
Ubicación: Venezuela

Nota Publicado: Lun Sep 26, 2011 5:30 pm 
Arriba  
hipersayan_x escribió:
:? Emm... así?:

Código:
j.CambioUtmGeoFrom(30,6378388.0,6356911.946130, f);




Produce una salida basura cuando trato de asignar el objeto. Como está arriba, cuando paso por referencia (en otra versión void de la función que incluye esa posibilidad) a un objeto inicializado a ceros si funciona.

Así:

Código:
j = j.CambioUtmGeo(30,6378388.0,6356911.946130,f);


produce la segunda salida de geográficas:

Código:
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)
v[1] = ? 1
v[2] = ? -5
v[3] = ? 7
(1.0000, -5.0000, 7.0000)


Las salidas en coordenadas geográficas son las correctas. La función trabaja bien. Incluso limpié un poco el código, le metí cosas adentro para reducir el número de parámetros y sobrecargué el operador >> (es lo que se ve al final).

Voy a probar lo que dices pero antes voy a dar por solucionado el tema. Gracias por tus sugerencias :D.

Saludos

_________________
[Reglamento del foro] [Blog]

 Perfil Email  
Mostrar mensajes previos:  Ordenar por  
 [ 5 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO