QT Вопрос (действительно, общая математика): Как я могу определить, есть ли пересечение Эллипса и Линии? - PullRequest
1 голос
/ 09 июня 2010

Эллипс на самом деле круг. Я знаю все координаты обеих вещей, мне просто нужно знать, проходит ли линия по эллипсу или нет.

Это где-нибудь встроено? В частности, я использую QGraphicsEllipseIem и QLine, но я могу преобразовать их в любой другой тип

спасибо

Ответы [ 4 ]

3 голосов
/ 09 июня 2010

Поскольку вы используете QGraphicsScene, вы должны использовать его методы, чтобы определить, пересекаются или сталкиваются объекты.Из документации:

Одной из самых сильных сторон QGraphicsScene является его способность эффективно определять местоположение предметов.Даже с миллионами элементов на сцене функции items () могут определить местоположение элемента в течение нескольких миллисекунд.Есть несколько перегрузок для items (): одна находит элементы в определенной позиции, другая находит элементы внутри или пересекаются с многоугольником или прямоугольником и другие.Список возвращаемых элементов отсортирован по порядку расположения, причем самый верхний элемент является первым элементом в списке.Для удобства также имеется функция itemAt (), которая возвращает верхний элемент в заданной позиции.

См. collidesWithItem () и collidingItems () .

1 голос
/ 09 июня 2010

Вот статья о пересечении окружности .

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

1 голос
/ 09 июня 2010

Вы говорите, что это круг.Я предполагаю, что вы знаете центр (C) и радиус (r).Таким образом, круг равен P == |P - C| = r, что эквивалентно <P-C, P-C> = r*r и, наконец, <P-C, P-C> - r*r = 0.

Вы знаете линию, поэтому вы знаете две точки (A и B).В параметрических уравнениях это P == A + t(B-A).

Для точек, которые являются пересечениями, оба уравнения верны.Таким образом, вы можете заменить второе уравнение на первое, получая <A+t(B-A)-C, A+t(B-A)-C> - r*r = 0.Если вы развернете это скалярное произведение, вы получите квадратное уравнение по t (то есть K1 * t * t + K2 * t + K3 = 0).

Если вам нужно только знать, есть ли пересечениявычислить определитель (K2*K2 - 4*K1*K3).Если это отрицательно, линия и круг не пересекаются.Если это положительно, есть два пересечения.Если это ноль, линия касается окружности.

Если вы хотите вычислить координаты пересечения (ей), вычислите значения t и вставьте их в уравнение параметрической линии, чтобы получитькоординаты

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

Общая процедура состоит в том, чтобы сначала сформировать параметрическое уравнение для линии, используя ее конечные точки:

x(t) = x1 + (x1 - x2) * t
y(t) = y1 + (y1 - y2) * t

Затем вставьте выражения для x (t) и y (t) в уравнение вашего эллипса,который даст вам квадратное уравнение в т.Используйте квадратную формулу, чтобы найти корни этого уравнения, которые представляют собой такие значения t, что точка находится на эллипсе.

Наконец, включите t в уравнения для x (t) и y (t)чтобы получить точку или точки или пересечение.Обратите внимание, что в случае отсутствия пересечения не будет реальных корней квадратного уравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...