Java vetor de cidades e distancias

9 respostas
M

olá pessoal
preciso fazer um programa para calcular a distância entre cidades
pensei em usar vetores
preciso de algo + ou - assim
o usuário informa a origem e o destino
no programa vai ter um vetor igual aquelas tabelas de distâncias entre as cidades
por exemplo

cidade a  cidade b  cidade c

cidade a 0 50 100
cidade b 50 0 30
cidade c 100 30 0

como faço para montar esse vetor ?
como faço para saber a distancia das cidades, sendo que o usuário só informa qual a origem e qual o destino ?
obrigado

9 Respostas

S

Se não me engano o correio possui um serviço deste tipo, porém ele é pago e a distância é calculada pelo CEP.

M

nossa, se fosse pra ver isso não teria perdido meu tempo perguntado …
brincadeira viu

S

O que você quis dizer com isso, que serviu ou que não era isso que você queria?

Fernando_Generoso_da

utilize uma matriz(array bi-dimensional):

a      b      c   
   a    0      50    100
 
   b    50     0      30
 
   c   100     30     0

a idéia é mais ou menos essa…

B

Se a distancia entre a e b é 500 e a distancia entre b e c é 1000, então a distancia entre a e c é 1500.

É só somar as distancias da matriz distancias[origem,destino] para cada origem e destino.

PS: se a distancia entre a e b e o contrário, b e a, são sempre as mesmas, você pode economizar usando uma matriz triangular superior, mas isso exige um tipo de dado/classe mais complexo.

Lavieri

Calculo vetorial e geometria analitica ^^ ...

se vc for usar espaço 3D, vc pode fazer assim

criar uma classe para referenciar Pontos3D (Point3D)
criar uma classe Vetor Geometrico (GeometricVector) para calcular distancias
criar uma classe Trilha para armazenar os pontos de deslocamento, e calcular a distancia entre os pontos

Agora é so manipular a classe trilha ^^

por exemplo, para suas cidades

Trilha cidadeAtoBtoC = new Trilha();
        System.out.println("De A para A = "+ cidadeAtoBtoC.addPonto(0,50,100));
        System.out.println("De A para B = " + cidadeAtoBtoC.addPonto(50,0,30));
        System.out.println("De B para C = " + cidadeAtoBtoC.addPonto(100,30,0));

        System.out.println("Distancia total = " + cidadeAtoBtoC.distancia());

Ps.: vou postar so a trilha aqui, o resto do código, so entrar nos links do pastebin

import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;

/**
 *
 * @author Tomaz Lavieri
 */
public class Trilha {
    private final LinkedList<Point3D> pontos = new LinkedList<Point3D>();

    public Trilha() {}

    public Trilha(Collection<Point3D> pontos) {
        pontos.addAll(pontos);
    }

    public double addPonto(long x, long y, long z) {
        return addPonto(new Point3D(x,y,z));
    }

    public double addPonto(Point3D point) {
        Point3D start = (pontos.size() > 0) ? pontos.getLast() : point;
        GeometricVector nextDistance = new GeometricVector(start, point);
        pontos.add(point);
        return nextDistance.size();
    }

    public double addPontos(Trilha trilha) {
        this.pontos.addAll(trilha.pontos);
        return trilha.distancia();
    }

    public double addPontos(Collection<Point3D> pontos) {
        return addPontos(new Trilha(pontos));
    }
    
    public boolean removePrimeiraOcorrencia(Point3D ponto) {
        return pontos.removeFirstOccurrence(ponto);
    }
    
    public boolean removeUltimaOcorrencia(Point3D ponto) {
        return pontos.removeLastOccurrence(ponto);
    }
    
    public boolean removeOcorrenciaN(Point3D ponto, int n) {
        boolean modifie = false;
        if ( n <= Collections.frequency(pontos, ponto) ) {
            synchronized(pontos) {
                int count = 0;
                for(Iterator<Point3D> itr = pontos.iterator(); itr.hasNext();) {
                    Point3D p = itr.next();
                    if (ponto.equals(p))
                        count++;
                    if (count == n) {
                        itr.remove();
                        break;
                    }
                }
            }
        }
        return modifie;
    }
    
    public synchronized boolean removeSubTrilha(Trilha trilha) {
        int start = Collections.indexOfSubList(pontos, trilha.pontos);
        if (start == -1)
            return false;
        
        for (int i = start; i < trilha.pontos.size(); i++)
            pontos.remove(i);
        return true;
    }

    public double distancia() {
        if (pontos.size() < 2)
            return 0D;
        double distancia = 0D;
        Point3D start = pontos.getFirst();
        Point3D end;
        for (Point3D p : pontos) {
            end = p;
            distancia += (new GeometricVector(start, end)).size();
            start = p;
        }
        return distancia;
    }
}
Ps.: editei para incluir alguns métodos de remove a trilha....
Lavieri

Dei uma redesenhada na classe Point3D (todas as versões anteriores estão no pastebin tb...
Agora Point3D suporta qualquer tipo de número primitivo, podendo ser byte, short, int, long, float ou double...

Em consequencia dei uma redesenhada no GeometricVector

..........

bom agora ta bem simples de usar, e os pontos não precisam mais ser inteiros...

public class Teste {
    public static void main(String ... args) {
        Collection<Point3D> pontos = new LinkedList<Point3D>();

        Point3D cidadeA = Point3D.valueOf(0.33, 41, 100);
        Point3D cidadeB = Point3D.valueOf(50, 0, 30);
        Point3D cidadeC = Point3D.valueOf(100, 30, 0);

        pontos.add(cidadeA);
        pontos.add(cidadeB);
        pontos.add(cidadeC);

        System.out.println("Distancia da cidade A a C = " 
                + GeometricVector.length(pontos));
    }
}
M

vetor seria a melhor maneira para resolver isso ???

Lavieri

marcoscorso:
vetor seria a melhor maneira para resolver isso ???

Não precisa usar o vetores, as formulas de distancia resolvem seu problema facilmente…

distancia entre 2 pontos = raiz( (x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2 )

com as 2 classes: Point3D (para guardar os pontos) e GeometricVector (para calcular as distancia)

vc resolve facil facil, basta guardar os pontos em uma lista, e calcular a distancia ponto a ponto (GeometricVector tem um método que faz isso, conforme ilustrado no psot anterior)

Criado 12 de março de 2009
Ultima resposta 16 de mar. de 2009
Respostas 9
Participantes 5