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

Рейтинг: 5Ответов: 2Опубликовано: 29.09.2014

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

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

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

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

Ответы

▲ 6Принят

Можно проверить пару отрезков на перпендикулярность. Получить их векторы и проверить, равно ли 0 скалярное произведение векторов. Псевдокод:

vx1 = x2 - x1;
vy1 = y2 - y1;

vx2 = x3 - x1;
vy2 = y3 - y1;

dotProduct = vx1*vx2 + vy1*vy2;  /* == 0 ? прямой угол : не прямой */

В худшем случае придётся проверить все три пары.

▲ 3

Есть нюанс: поскольку Вы в решении используете произведения, для достаточно больших значений координат вычисления будут некорректны. Причём, ошибки переполнения не возникнет. Об этом говорится в спецификации языка, п. 4.2.2:

The integer operators do not indicate overflow or underflow in any way

Если в постановке задачи не оговаривается, каковы максимальные возможные значения, необходимо это предусмотреть и для вычислений применять не int, а java.math.BigInteger.