Ver Mensaje Individual
  #3 (permalink)  
Antiguo 30/11/2007, 06:56
Avatar de Kelpie
Kelpie
 
Fecha de Ingreso: febrero-2002
Ubicación: NorthSpain
Mensajes: 609
Antigüedad: 22 años, 2 meses
Puntos: 8
Re: Urgente!!! es a contrareloj!!!

En una aproximación muy sencilla al problema debes ver las calles en este sentido:

Empiezan en un punto; Ejemplo (x1,y1)
Acaban en un punto; Ejemplo (x2,y2)
Tienen cruces con otras calles; Ejemplo (calleA,x3,y3)
Si la calle no es recta, cada tramo será una subcalle (tratada como calle)
Una calle curva se toma como varios tramos rectos
El final de una calle, salvo que muera, será un cruce

Necesitas guardar, para empezar, en cinco tablas:

calles_principales: (para las grandes calles)
id_calle_verdadera
nombre

calles: (para las calles rectas y los pedazos)
id_calle
nombre
xIni
yIni
xFin
yFin

cruces:
id_propietaria
id_que_cruza
xCruce
yCruca

uniones: (para saber los pedazos de las calles)
id_calle_verdadera
id_calle

casas: (Para guardar los números de los portales)
id_calle
numero
xPortal
yPortal


Para ir del punto I al punto D...
El punto actual es el origen
El siguiente cruce en la dirección correcta es el destino parcial

Calculas si debes ir sumando o restando la X y la Y (para saber por donde tirar)
Recorres los puntos de la calle Origen de la tabla cruces
En cada cruce compruebas si te va a cercar o a alejar del destino final. El cruce actual pasa a ser tu origen y el siguiente tu destino parcial.
Si te va a alejar tomas la calle que cruza como actual, en cuyo caso la calle actual cambia
En cada cruce el punto actual cambia
Si llegas a una calle muerta regresas al anterior cruce y tomas una decisión diferente


Teniendo las coordenadas de los puntos "reales", poniendo el punto cero fuera de la ciudad podrás calcular la distancia sumando los tramos que vas haciendo. Un tramo va desde un origen (O) a un destino parcial (D) [Es la longitud de un segmento, la raiz cuadrada de la suma de los cuadrados de las diferencias de coordenadas.
__________________
Kelpie