Рассчитать наклон документа из точек? - PullRequest
3 голосов
/ 20 июня 2011

Представьте, что у вас есть документ PDF.

В этом документе вы определили две (x, y) координаты, которые соответствуют двум (lat, lng) координатам.

Как рассчитать угол наклона документа, то есть направление компаса, на которое ориентирована верхняя часть документа?

EDIT:

Когда я использую формулу в опубликованном ответе, она не возвращает ожидаемых результатов. Например:

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 ]

1 голос
/ 06 июля 2011

1) Если у вас угол 0 -> это означает, что он указывает на восток! (или вы должны поменять свои y и x в ваших уравнениях).

2) Вы делите на ноль в обоих случаях. Это равно бесконечности, которая в большинстве языков программирования вызывает сбой. Если нет, то это, по крайней мере, приведет к ошибкам округления. Попробуйте разные значения вместо 0 для обеих координат x ...

Возможно, вы захотите рассмотреть:


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; 
0 голосов
/ 06 июля 2011

Ха!У вашего алгоритма серьезные проблемы с данными, которые вы ему предоставляете.Обе ваши точки данных в качестве примера имели x1 = x2, поэтому, когда он вычислял rho, он должен был найти:

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

И деление на ноль является проблемой.Я не знаю, почему он просто дал вам мусорные данные, а не ошибку.

Ваш алгоритм должен работать нормально, если ваши две точки не находятся прямо друг над другом.Вы могли бы это исправить, добавив специальный случай, если x1 = x2 and y1 > y2, тогда пусть rho будет pi/2, а если x1=x2 and y1 < y2, то пусть rho будет -pi/2.Похоже, что вы уже ответили на свой вопрос на math.stackexchange, но мне жаль, что никто не ответил, поэтому я подумал, что я опубликую ...

...