Cita de: eferion en 9 Julio 2013, 10:51 AM
Primera optimización: Si estás manejando coordenadas, lo suyo sería tener una estructura para manejarlos como tal.Código (cpp) [Seleccionar]
class Punto
{
public:
double x;
double y;
Punto( double px, double py )
: x( px ), y( py )
{ }
};
struct Vpeaton
{
int ad_peaton; //numero del punto
Punto punto; // punto
};
typedef std::vector<Vpeaton> V_peaton;
Segunda optimización: Si quieres calcular distancias... saca una función que la calcule en vez de repetir 8 veces el mismo cálculo. Reduces puntos de fallo y mejoras el mantenimiento y la legibilidad del código.Código (cpp) [Seleccionar]
V_peaton Areas;
//buscar peston cercano a cada esquina.
distminXsYs = distancia( punto_ supizq, Areas[0] );
distminXiYs = distancia( punto_infizq, Areas[0] );
distminXsYi = distancia( punto_supder, Areas[0] );
distminXiYi = distancia( punto_infder, Areas[0] );
for(int i=1; i<Areas.size(); i++)
{
dist1 = distancia( punto_supizq, Areas[i] );
dist2 = distancia( punto_infizq, Areas[i] );
dist3 = distancia( punto_supder, Areas[i] );
dist4 = distancia( punto_infder, Areas[i] );
if (dist1<distminXsYs)
{
distminXsYs=dist1;
peaton_1=Areas[i].ad_peaton;
}
if (dist2<distminXiYs)
{
distminXiYs=dist2;
peaton_2=Areas[i].ad_peaton;
}
if(dist3<distminXsYi);
{
distminXsYi=dist3;
peaton_3=Areas[i].ad_peaton;
}
if(dist4<distminXiYi);
{
distminXiYi=dist4;
peaton_4=Areas[i].ad_peaton;
}
}
Tercera optimización: si asignas un valor inicial a las distancias lo suficientemente alto como para que cualquier punto posea una distancia inferior te puedes ahorrar las 4 primeras distancias y aglutinar todo en el for.Código (cpp) [Seleccionar]
V_peaton Areas;
double distminXsYs = 1e9; // por ejemplo
double distminXiYs = 1e9;
double distminXsYi = 1e9;
double distminXiYi = 1e9;
for(int i=0; i<Areas.size(); i++)
{
dist1 = distancia( punto_supizq, Areas[i] );
dist2 = distancia( punto_infizq, Areas[i] );
dist3 = distancia( punto_supder, Areas[i] );
dist4 = distancia( punto_infder, Areas[i] );
if (dist1<distminXsYs)
{
distminXsYs=dist1;
peaton_1=Areas[i].ad_peaton;
}
if (dist2<distminXiYs)
{
distminXiYs=dist2;
peaton_2=Areas[i].ad_peaton;
}
if(dist3<distminXsYi);
{
distminXsYi=dist3;
peaton_3=Areas[i].ad_peaton;
}
if(dist4<distminXiYi);
{
distminXiYi=dist4;
peaton_4=Areas[i].ad_peaton;
}
}
Con esto además corriges uno de tus problemas, y era que no asociabas valores a los peatones si la distancia mínima se encuentra en el punto 0.
Cuarta optimización: Podrías usar un vector de puntos para definir el rectángulo, con eso podrías evitar tener que comprobar la distancia con cada esquina de forma explícita.Código (cpp) [Seleccionar]
class DatoDistancias
{
public:
double distancia;
Punto punto;
DatoDistancias( const Punto& pt )
: distancia( 1e9 ), punto( pt )
{ }
};
V_peaton Areas;
V_peaton peatones; // En vez de peaton_1, peaton_2, peaton_3, peaton_4; Hay que inicializarlo
std::vector< DatoDistancias > rectangulo;
// presupongo que los límites del cuadrado son conocidos. Si no es así esto se sustituiría por la inicialización correspondiente.
rectangulo.push_back( Punto( -6.7071067, 0.7071067 ) );
rectangulo.push_back( Punto( -6.7071067, -0.7071067 ) );
rectangulo.push_back( Punto( 6.7071067, 0.7071067 ) );
rectangulo.push_back( Punto( 6.7071067, -0.7071067 ) );
for( int i=0; i<Areas.size(); i++)
{
for ( int j=0; j<rectangulo.size( ); ++j )
{
double dist = distancia( rectangulo[j].punto, Areas[i] );
if ( dist < rectangulo[j].distancia )
{
peatones[j] = Areas[i].ad_peaton;
rectangulo[j].distancia = dist;
}
}
}
Creo que el código final tiene bastante mejor pinta, no crees?
Y ya te digo yo que es muuucho más fácil corregir errores de esta forma.
La implementación de la función distancia no es que se me haya olvidado ponerla, con lo que tienes no te debería costar mucho implementarla.
Muchas gracias, la verdad si que queda más claro el código.
Aunque con mi código ya solucione el error (un ; detrás del 3º y 4º if), Probaré el código que me has dicho, que veo que se optimiza mucho los recursos.
Gracias