2010-06-04 7 views
0

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

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

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

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

(R R ((Ах-Ви) (Ах-Ви) + (Ай-К) (Ай-К))) - (((Ах-Сх) (К-Cy)) - ((Bx-Cx) (Ay-Cy)))> 0

Эта формула взята из link text и основана на окружности с центром в 0,0.

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

ответ

0

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

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

+0

Спасибо за предложение, но, к сожалению, мне нужно сделать этот расчет для разных кругов (каждый раз против множества тысяч сегментов), поэтому я не могу ничего рассчитать заранее. – Dan

+0

Я вижу, что координаты круга не являются частью записей вообще (?) Возможно, вы захотите указать это в своем вопросе. – chiccodoro

+0

Возможно, стоит упомянуть, что я отфильтровываю большую часть строк перед этим вычислением, проверяя это: 1) по крайней мере одна из точек A, B имеет значение x по крайней мере (центр круга - радиус) 2) по крайней мере один точек A, B имеет максимум x (радиус центра + радиус) 3) по крайней мере одна из точек A, B имеет значение ay не менее (радиус центра - радиус) 4) по крайней мере одна из точек A, B имеет значение не более (радиус центра + радиус) Если эти условия не все выполнены, то вся линия лежит вне крестообразной формы, образуя квадрат, центрированный по кругу длиной 2R. – Dan

 Смежные вопросы

  • Нет связанных вопросов^_^