#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.
Комментариев нет:
Отправить комментарий