1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[c] distancia entre coordendas

Discussão em 'Programação' iniciada por metralha761, 24 de Abril de 2008. (Respostas: 8; Visualizações: 2391)

  1. metralha761

    metralha761 1st Folding then Sex

    Boas,

    Eu tenho q fazer um big projecto em q mete a parte do GPS.

    Um dos problemas é saber a distancia entre duas coordenadas de GPS, alguem sabe como se calcula?

    E ja agora, qual a constituição das coordenadas do GPS?
     
  2. balute

    balute Power Member

    Podias começar por criar a estrutura "coordenada":
    Código:
    struct coordenada
    {
      int x, y;
      struct coordenada **ligacoes;
    }
    Em que x e y são as componentes da coordenada, e ligacoes é um conjunto de apontadores para outras coordenadas, que estão conectadas a esta coordenada (no mapa).

    A partir daqui, basta começar na coordenada A ir seguindo as ligações até encontrar a coordenada B. O nº de ligações que teve de seguir dá distância (se as coordenadas estiverem uniformemente afastadas).
     
  3. Dragon_Tamer

    Dragon_Tamer Power Member

    Para calcular a distância mais curta entre 2 pontos, tendo outros pelo meio, um excelente algoritmo é o Dijkstra.
    Se estiveres a considerar um sistema de Eixos normais (XY), calculas as distâncias manualmente entre cada par de pontos ligados (fazes subtracao se estiverem no mesmo eixo, ou teorema de pitágoras se não forem colineares). E depois aplicas o algoritmo para descobrir a distância mais curta entre 2 pontos, partindo de um ponto A até B.

    Espero ter ajudado
     
  4. souto

    souto To fold or to FOLD?

    Não percebi muito bem o que queres, mas para calculares a distância linear de um ponto (x,y) a um ponto (a,b), assumes (x,y) como origem do referencial e tens então a distância como sqrt((a-x)^2 + (y-b)^2).

    Cumprimentos.

    PS: para GPS, penso que tens que trabalhar com latitudes e coisas assim. Posso estar enganado.
     
    Última edição: 24 de Abril de 2008
  5. metralha761

    metralha761 1st Folding then Sex

    Nao é bem isso q quero.

    O q pretendo é com 2 coordenadas de GPS, como calculo a distancia em km em linha recta.

    Parece o GPS trabalha sobre radianos. Para mim o mais importante seria as formulas de calculo

    Exemplo:
    40°11'11.96"N
    8°24'57.53"O
    a
    40°11'11.99"N
    8°24'54.58"O
     
  6. MadOnion

    MadOnion Folding Member

    Encontrei isto no google, ajuda?
     
  7. metralha761

    metralha761 1st Folding then Sex

    Acho q é exactamente isso q quero :)

    Pela vista de olhos q dei tem as formulas :)

    Obrigado.
     
  8. Neptune

    Neptune 1st Folding then Sex

    Algo me diz que és mais um dos alunos de PPP do DEI :D
     
  9. firedrops

    firedrops Power Member

    tinham-me pedido isso há uns dias, mas como a pessoa que me pediu não especificou linguagem, fiz em python, a minha linguagem de eleição.

    Código:
    !/usr/bin/env python
    
    import math
    
    print 'Distancia entre dois pontos Lat/Long usando a formula de Haversine'
    print '\nFormato de Input (exemplo): 53 09 02 N\n'
    
    print ''
    
    lat1i = raw_input('Latitude 1 : ')
    long1i = raw_input('Longitude 1: ')
    
    print ''
    
    lat2i = raw_input('Latitude 2 : ')
    long2i = raw_input('Longitude 2 : ')
    
    
    """
    ## valores de teste; resultado esperado 170.2 km
    lat1i = '53 09 02 N'
    long1i = '01 50 40 W'
    lat2i = '52 12 17 N'
    long2i = '00 08 26 E'
    ##
    """
    
    def dmstodd(z): ## converter graus,min,seg para graus decimais
        
         x = float(z[0:2])+ float(z[3:5])/60 + float(z[6:8])/3600 ## tGraus + tMin/60 + tSeg/3600
         
         if z[-1] == 'W' or z[-1] == 'S': ## W ou S dao coordenadas negativas
            x = x*(-1)
        
         return x
        
    lat1 = dmstodd(lat1i)
    lat2 = dmstodd(lat2i)
    long1 = dmstodd(long1i)
    long2 = dmstodd(long2i)
    
    def dist(lat1,long1,lat2,long2): ## calculo da distancia
        
        R = 6371 ## raio medio da terra
        
        dLat = (lat2-lat1)
        dLon = (long2-long1)
        
        dLat = math.radians(dLat)
        dLon = math.radians(dLon)
        
        a = math.sin(dLat/2) * math.sin(dLat/2) + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dLon/2) * math.sin(dLon/2)
        c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
        
        d = R * c
        
        return d
    
    distancia = dist(lat1,long1,lat2,long2)
    
    print '\nDistancia: %f km' %(distancia)
    
    não sei C mas penso que o modulo math de python colhe grandes semelhanças com o equivalente em C.

    sou estudante de medicina, por isso não me flamem se isto tiver erros crassos, etc e tal :P
     

Partilhar esta Página