Devolver objeto en Clase Coordenadas [SOLUCIONADO]

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Devolver objeto en Clase Coordenadas [SOLUCIONADO]

Mensaje por cerenkov » Lun Sep 26, 2011 1:16 am

Buenas.

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

Código: Seleccionar todo

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: Seleccionar todo

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: Seleccionar todo

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: Seleccionar todo

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

cout << k; //operador << sobrecargado
De esta forma:

Código: Seleccionar todo

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.
Última edición por cerenkov el Mar Sep 27, 2011 1:22 am, editado 1 vez en total.
Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: Devolver objeto en Clase Coordenadas

Mensaje por hipersayan_x » Lun Sep 26, 2011 2:12 am

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: Seleccionar todo

const Coordenadas & CambioUtmGeo (double huso, double a, double b, Coordenadas v);
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Devolver objeto en Clase Coordenadas

Mensaje por cerenkov » Lun Sep 26, 2011 2:28 pm

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: Seleccionar todo

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.
Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: Devolver objeto en Clase Coordenadas

Mensaje por hipersayan_x » Lun Sep 26, 2011 5:10 pm

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: Seleccionar todo

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: Seleccionar todo

// 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);
*/
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Devolver objeto en Clase Coordenadas

Mensaje por cerenkov » Mar Sep 27, 2011 1:30 am

hipersayan_x escribió: :? Emm... así?:

Código: Seleccionar todo

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: Seleccionar todo

j = j.CambioUtmGeo(30,6378388.0,6356911.946130,f);
produce la segunda salida de geográficas:

Código: Seleccionar todo

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
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje