|
Ver temas sin respuesta | Ver temas activos
Foros Linux » Desarrollo » Programación
Página 1 de 1
|
[ 5 mensajes ] |
|
| Autor |
Mensaje |
cerenkov

Forista Medio
Registrado: Mié Jun 16, 2010 9:23 pm Mensajes: 355 Ubicación: Venezuela
|
 Publicado: Dom Sep 25, 2011 5:16 pm |
|
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
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Dom Sep 25, 2011 6:12 pm |
|
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
|
|
|
|
 |
cerenkov

Forista Medio
Registrado: Mié Jun 16, 2010 9:23 pm Mensajes: 355 Ubicación: Venezuela
|
 Publicado: Lun Sep 26, 2011 6:28 am |
|
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]
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Lun Sep 26, 2011 9:10 am |
|
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
|
|
|
|
 |
cerenkov

Forista Medio
Registrado: Mié Jun 16, 2010 9:23 pm Mensajes: 355 Ubicación: Venezuela
|
 Publicado: Lun Sep 26, 2011 5:30 pm |
|
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  . Saludos
_________________ [Reglamento del foro] [Blog]
|
|
|
|
 |
|
|
|
Página 1 de 1
|
[ 5 mensajes ] |
|
¿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
|
|