从点计算文档的倾斜度?

时间:2011-06-20 19:11:50

标签: math geometry geospatial

想象一下,你有一份PDF文件。

在该文档中,您已识别出两个(x,y)坐标,这些坐标对应于两个(lat,lng)坐标。

如何计算文档的倾斜度 - 即文档顶部朝向哪个罗盘方向?

编辑:

当我在发布的答案中使用公式时,它不会返回我期望的结果。例如:

The sample data look like y x (lat lng). 

The 1st test should be due north (0) and the 2nd should be due south (pi).

The first point is 0.000000 0.000000 (30.000000 60.000000) 
The second point is 0.000000 200.000000 (30.000000 120.000000) 
Theta is -0.000000

The first point is 0.000000 200.000000 (30.000000 60.000000) 
The second point is 0.000000 0.000000 (30.000000 120.000000) 
Theta is -0.000000

我正在使用:

float rho = atan(
                 (-y1 + y2) /
                 (-x1 + x2)
                );

float theta = atan(
                   ((lat2  - lat1 )*cos(rho) + (long1 - long2)*sin(rho))/
                   ((long1 - long2)*cos(rho) + (lat1  - lat2 )*sin(rho))
                  );

2 个答案:

答案 0 :(得分:1)

1)如果角度为0 - >这意味着它指向东方! (或者你必须在方程式中反转你的y和x)。

2)在两种情况下你都除以零。这等于无限,在大多数编程语言中都会导致崩溃。如果没有,它至少会引入一些舍入错误。对于两个x坐标尝试不同的值而不是0 ...

您可能需要考虑:


float rho;
int denominator = -x1 + x2;
if(denominator == 0.0)
    rho = (-y1 + y2 > 0) ? pi/2.0 : -pi/2.0;
else
    rho = (-y1 + y2) / denominator; 

答案 1 :(得分:0)

哈!您的算法对您提供的数据存在严重问题。您的两个示例数据点均为x1 = x2,因此在计算rho时,必须找到:

float rho = atan(
                 (-y1 + y2) /
                 0
                );

除以零是个问题。为什么它只是给你垃圾数据而不是错误,我不知道。

只要您的两点不直接在另一个上方,您的算法就可以正常工作。您可以通过设置一个特殊情况(如果x1 = x2 and y1 > y2,然后让rhopi/2,如果x1=x2 and y1 < y2,则设置rho)来修复它。是-pi/2。看起来好像你已经在math.stackexchange上回答了你的问题,但是我很伤心没有人回答所以我想我会发帖...