2013-07-27 32 views
0

我正在尝试制作一个计算地球上两点之间距离以及方位角的程序。然后,一旦我得到距离和方位角,我将不得不创建一个图形数据结构,它将使用Dijkstra的算法找到最短路径。我如何阅读城市名称和该文本文件中的坐标?

下面是几行文本文件。每一行代表两个城市的位置,将发现两者之间的距离坐标:

Cairo= 30:2:39 N 31:14:8 E |Cape Town= 33:55:29 S 18:25:26 E 
Cape Town= 33:55:29 S 18:25:26 E |Cairo= 30:2:39 N 31:14:8 E 
Cairo= 30:2:39 N 31:14:8 E |Lagos= 6:27:11 N 3:23:45 E 
Lagos= 6:27:11 N 3:23:45 E |Cairo= 30:2:39 N 31:14:8 E 
Lagos= 6:27:11 N 3:23:45 E |Cape Town= 33:55:29 S 18:25:26 E 
Cape Town= 33:55:29 S 18:25:26 E |Lagos= 6:27:11 N 3:23:45 E 
Lagos= 6:27:11 N 3:23:45 E |Birmingham= 52:20:10 N 1:53:25 E 
Birmingham= 52:20:10 N 1:53:25 E |Lagos= 6:27:11 N 3:23:45 E 

这是格式:

<lat> d:m:s <N|S>, 
where d = degrees, m = minutes, s = seconds (max(d) == 90) 
<lon> is d:m:s <E|W> (max(d) == 180) 

是分秒重要?

这是一个用余弦定律关闭此网站http://www.krysstal.com/sphertrig.html我的距离函数:

void findDistance(float x1, float y1, float x2, float y2) { 
    float a,b,c; 
    float distance; 

    /* 

    if (latDir == 'W' or lonDir == 'S') { 
     //change to negative 
    } 

    */ 

    a = y2-y1; 
    b = 90-x1; 
    c = 90-x2; 

    printf("\na = %f b = %f c = %f",a,b,c); 

    //convert to radians for trig functions 
    a = a * DEG_TO_RAD; 
    b = b * DEG_TO_RAD; 
    c = c * DEG_TO_RAD; 

    printf("\na = %f b = %f c = %f",a,b,c); 

    distance = cos(b)*cos(c)+sin(b)*sin(c)*cos(a); 

    printf("\nCos(distance) in radians = %f",distance); 

    distance = acos(distance); 

    float distDegree = distance*RAD_TO_DEG; 

    printf("\nCos(distance) in degrees = %f",distDegree); 

    distance = EARTH_CIRCUM * distDegree/360; 

    printf("\ndistance = %f",distance); 

    //return distance; 



} 
+1

澄清你的问题。你需要一种方法来读取城市名称和坐标?你的文章中唯一的问题是“分秒重要吗?”这取决于你自己决定。您的计划需要多准确?赤道一度等于约。 40,000公里/ 360〜111公里,所以如果你的两个城市可能比这更近,那么答案是“是”。 – usr2564301

+0

我很确定伯明翰大约是2ºW,而不是2ºE. –

+0

抱歉修好了。好吧,它可能必须是准确的。在我调用这个函数之前,我只需要修改那一点? – MeesterMarcus

回答

1

我冒昧地净化你的输入,并把每个条目在同一行,像这样:

Birmingham= 52:20:10 N 1:53:25 E 
Cairo= 30:2:39 N 31:14:8 E 
Cape Town= 33:55:29 S 18:25:26 E 
Lagos= 6:27:11 N 3:23:45 E 

我也删除重复。

#include <stdio.h> 

int main() { 
    char line[256]; 

    // data 
    char name[64]; 
    // hour, minute, second, direction 
    int lat_h, lat_m, lat_s; char lat_d; 
    int long_h, long_m, long_s; char long_d; 

    FILE *fin = fopen("in", "r"); 

    while (NULL != fgets(line, 256, fin)) { 
     sscanf(line, "%[^=]=%*[ ]%d:%d:%d%*[ ]%c%*[ ]%d:%d:%d%*[ ]%c", 
      name, 
      &lat_h, &lat_m, &lat_s, &lat_d, 
      &long_h, &long_m, &long_s, &long_d 
     ); 

     printf("Name: %s\nlat: %d:%d:%d %c\nlong: %d:%d:%d %c\n\n", 
      name, 
      lat_h, lat_m, lat_s, lat_d, 
      long_h, long_m, long_s, long_d 
     ); 

    } 
    return 0; 
} 

如果你有一个行许多条目,由分离器分开,每件执行该sscanf

注意:此答案假设标题是您的实际问题。如果您的问题是Is the minutes and seconds important?,请阅读@ Jongware的评论。

+1

我给你一个upvote,但你真的不应该对用户的输入格式有任何自由。定义一个结构来保存一个城市的数据并编写一个从字符串中读取一个城市的函数是明智和合理的。您可以返回停止转换的偏移量,或者在管道符号处预先拆分该线并将该函数调用两次(这可能更简洁)。该函数将处理转换为浮动和处理E/W和N/S。您也可以创建另一个函数来格式化结构中的输出字符串,但这超出了问题的范围。 –

+1

此外,在更技术层面上,您可以用简单的''(空白)替换'%* []'转换规范。事实上,这样做意味着没有空间的'1:53:25W'将被接受并正确转换。你还应该检查'sscanf()'命令返回正确的值(9)。如果没有,数据格式有问题。 'fgets()'加上'sscanf()'是一件好事,你可以打印未被理解的数据;如果你使用普通的'scanf()',你就失去了成功转换的数据。 –

+0

我冒昧地使用每行一个条目来强调格式,虽然你是对的:某些'%* []'可以被替换为(空白)。正如我在帖子中所说的,对于一条线上的多个条目,用分隔符对其进行分割。 – ep0

相关问题