Определение, находится ли точка между двумя подшипниками от центральной точки - PullRequest
1 голос
/ 29 апреля 2020

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

На приведенной ниже схеме делается попытка объяснить вещи

  • У меня есть центральная точка, обозначенная A
  • У меня есть две точки (помеченные B & C), которые обеспечивают границы области поиска (только на основе направления - элемент расстояния не требуется).
  • Я пытаюсь определить, находится ли точка D в секторе, образованном AB и A- C
  • . Я рассчитал подшипники от A до каждого B & C
  • В моем реальном сценарии угол между подшипниками может быть что угодно, от 0 до 360.

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

Теоретически это кажется таким простым, но моя математика явно не на пустом месте: (

Буду очень признателен за любой совет или псевдокод.

scenario

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Вот мой подход:

  1. вычисление первого угла подшипника X
  2. вычисление второго угла подшипника Y
  3. вычисление угла Z в направлении точки D
  4. если X

В вашем примере выглядит, как если бы вы вычислили Z ~ 90 градусов и нашли 45 <90 <135 (ваша картинка неправильная? говорит 315). </p>

Вы можете использовать что-то вроде функции «atan2» на любом языке, который вы используете. Это расширение арктангенсной функции basi c, которая принимает не только наклон, но и подъем и бег, и вместо того, чтобы возвращать угол только из диапазона 180 градусов, она возвращает истинный угол из диапазона 360 градусов. Так что

Z = atan2(Dy, Dx)

Должен дать вам угол (возможно, в радианах; будьте осторожны), который вы можете сравнить с вашими ориентирами, чтобы определить, находитесь ли вы в поиске. Обратите внимание, что порядок X и Y имеет значение, поскольку именно этот порядок определяет, какой из двух разделов находится в области поиска (от X до Y дает ~ 90 градусов на вашей картинке, а от Y до X дает ~ 270 градусов).

0 голосов
/ 29 апреля 2020

Вы можете рассчитать и сравнить перекрестные произведения векторов (AB X BD) и (A C X CD).

if (AB X BD) > 0, у вас есть поворот против часовой стрелки
if (AC X CD) < 0, у вас поворот по часовой стрелке
Если оба приведенных выше теста верны, то точка D находится в секторе BAC

Это позволяет полностью избежать использования дорогих функций триггера.

class Point:
    """small class for point arithmetic convenience
    """

    def __init__(self, x: float = 0, y: float = 0) -> None:
        self.x = x
        self.y = y

    def __sub__(self, other: 'Point') -> 'Vector':
        return Vector(self.x - other.x, self.y - other.y)


class Vector:
    """small class for vector arithmetic convenience
    """
    def __init__(self, x: float = 0, y: float = 0) -> None:
        self.x = x
        self.y = y

    def cross(self, other: 'Vector') -> float:
        return (self.x * other.y) - (self.y * other.x)


def in_sector(A: Point, B: Point, C: Point, D: Point) -> bool:

    # construct vectors:
    ab = B - A
    bd = D - B
    ac = C - A
    cd = D - C

    print(f'ab x bc = {ab.cross(bd)}, ac x cd = {ac.cross(cd)}')

    return ab.cross(bd) > 0 and ac.cross(cd) < 0


if __name__ == '__main__':

    A = Point(0, 0)
    B = Point(1, 1)
    C = Point(-1, 1)
    D = Point(0, 1)

print(f'D in sector ABC: {in_sector(A, B, C, D)}', end='\n\n')
print(f'D in sector ACB: {in_sector(A, C, B, D)}')  # inverting the sector definition so D is now outside

Вывод:

ab x bc = 1, ac x cd = -1
D in sector ABC: True

ab x bc = -1, ac x cd = 1
D in sector ACB: False
...