Учитывая точки A, B и C, как определить, являются ли оба угла ABC и ACB острыми? - PullRequest
1 голос
/ 05 мая 2019

Я пытаюсь найти эффективный способ определить, является ли, учитывая координаты x и y точек A, B и C, и угол, идущий от A до B к C, и угол от A к C кB меньше 90 градусов.

Обычно, если точка A попадает в зеленую область на этом изображении, strip defined by opposite points B and C on edges, метод должен возвращать true, в противном случае - false.

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

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Требуется, чтобы произведение dot BA · BC (т. Е. | BA || BC | cosθ, где θ - угол между BA и BC) составляло от 0 до BC 2 .В Python:

def in_strip(ax, ay, bx, by, cx, cy):
    bcx = cx - bx
    bcy = cy - by
    strip_width_squared = bcx * bcx + bcy * bcy
    bax = ax - bx
    bay = ay - by
    dot_product = bax * bcx + bay * bcy
    return 0 < dot_product < strip_width_squared

Если скалярное произведение меньше 0, точка A лежит вне полосы на стороне ближе к B, если она больше, чем BC 2 , оналежит вне полосы на стороне ближе к C.

Вы можете посмотреть на произведение точек BA · BC как произведение двух длин: длины вектора BC, | BC | и длинысоставляющая вектора BA, параллельная вектору BC (т. е. проекция на параллельную ему прямую), | BA | cosθ.Этот компонент равен 0, когда A находится на краю полосы, которая содержит B, и равен BC, когда A находится на краю полосы, которая содержит C.

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

class Strip:
    def __init__(self, bx, by, cx, cy):
        self.bx,  self.by  = bx, by
        self.bcx, self.bcy = cx - bx, cy - by
        self.width_squared = self.bcx * self.bcx + self.bcy * self.bcy

    def contains(self, ax, ay):
        bax, bay = ax - self.bx, ay - self.by
        return 0 < bax * self.bcx + bay * self.bcy < self.width_squared
1 голос
/ 05 мая 2019

Похоже, вам нужно знать, является ли треугольник ABC острым или нет.

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

hyp^2 < legA^2 + legB^2

Если у вас еще нет длины каждой ноги, вы должны использовать формулу расстояния.

d = sqrt((Ax + Bx)^2 + (Ay + By)^2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...