Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Классическая задачка на определение прямоугольности треугольника

#java #алгоритм #геометрия


Есть java (с которой я практически не знаком), есть три вершины треугольника (шесть
int), есть необходимость проверить, прямоугольный ли треугольник. Естественно, в этом
случае нужно вообще боком обойти флоаты, чтобы не нарваться на какую-нибудь разницу
в E-13 при проверке. Я довольно долго пыхтел, прежде чем до меня дошло, что 


Каждая сторона - сама по себе гипотенуза прямоугольного треугольника, две вершины
которого совпадают с концами этой стороны, и ее квадрат найти проще простого. Скучная
картинка для наглядности:


В самом банальном уравнении прямоугольного треугольника и так используются квадраты
сторон, поэтому точную длину стороны мне вообще не нужно знать


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


Ответы

Ответ 1



Можно проверить пару отрезков на перпендикулярность. Получить их векторы и проверить, равно ли 0 скалярное произведение векторов. Псевдокод: vx1 = x2 - x1; vy1 = y2 - y1; vx2 = x3 - x1; vy2 = y3 - y1; dotProduct = vx1*vx2 + vy1*vy2; /* == 0 ? прямой угол : не прямой */ В худшем случае придётся проверить все три пары.

Ответ 2



Есть нюанс: поскольку Вы в решении используете произведения, для достаточно больших значений координат вычисления будут некорректны. Причём, ошибки переполнения не возникнет. Об этом говорится в спецификации языка, п. 4.2.2: The integer operators do not indicate overflow or underflow in any way Если в постановке задачи не оговаривается, каковы максимальные возможные значения, необходимо это предусмотреть и для вычислений применять не int, а java.math.BigInteger.

Комментариев нет:

Отправить комментарий