Формула для определения того, пересекает ли отрезок прямой окружность - PullRequest
0 голосов
/ 04 июня 2010

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

Мне просто нужно выяснить, пересекает ли отрезок прямой окружность. Мне не нужно находить расстояние до линии от центра круга, мне не нужно искать точки пересечения.

Причина, по которой мне нужно что-то простое, заключается в том, что мне нужно кодировать это в SQL, и я не могу вызвать внешние библиотеки, и мне нужно написать эту формулу в предложении WHERE ... в основном это должно быть сделано в одном заявление, что я могу подключить значения к.

Предполагая 2 точки A (Ax, Ay) и B (Bx, By) для описания отрезка, и окружность с центральной точкой C (Cx, Cy) и радиусом R, формула, которую я сейчас использую:

(R R ((Ax-Bx) (Ax-Bx) + (Ay-By) (Ay-By))) - (((Ax-Cx) (By-Cy)) - ((Bx-Cx) (Ay-Cy)))> 0

Эта формула взята из текста ссылки и основана на 0,0-центрированном круге.

Причина, по которой я публикую сообщения, заключается в том, что я получаю странные результаты, и мне было интересно, сделал ли я что-то глупое. (

1 Ответ

0 голосов
/ 04 июня 2010

хотя это не совсем отвечает на ваш вопрос: вам действительно нужно вычислять это на лету на SQL-Select? Это означает, что система DB должна вычислять формулу для каждой отдельной строки в таблице (или для каждой отдельной строки, для которой сохраняются остальные условия, соответственно), что может привести к снижению производительности.

Вместо , вы можете рассмотреть возможность создания отдельного логического столбца и вычислить его значение в триггере при вставке / обновлении . Там, в свою очередь, вам даже не нужно помещать тест в формулу из одной строки. Использование отдельного столбца имеет еще одно преимущество: вы можете создать индекс для этого столбца, который позволит вам быстро получить набор пересекающихся / непересекающихся записей.

...