Угол между прямыми на Prolog

      Комментарии к записи Угол между прямыми на Prolog отключены

В этой теме 3 ответа, 2 участника, последнее обновление  Васильев Владимир Сергеевич 1 год, 9 мес. назад.

  • Автор
    Сообщения
  • #2373

    questioner
    Участник

    Даны две прямые, заданные общим уравнением (вида Ax + By + C = 0). Программа на языке Prolog должна вычислять угол между ними.

  • #2374

    Для вычисления угла между прямыми, заданными общими уравнениями можно применить формулу, приведенную на рисунке (она достаточно легко выводится если нарисовать прямые на бумаге).

    На SWI Prolog решение может выглядеть следующим образом:

    radian_to_degree(Radian, Degree):-
      Degree is Radian * 180 / 3.1415926535.
      
    angle(equation(A1, B1, _C1), equation(A2, B2, _C2), Angle):-
      CosAngle is (A1*A2 + B1*B2) / (sqrt(A1*A1 + B1*B1) * sqrt(A2*A2 + B2*B2)),
      AngleRad is acos(CosAngle),
      radian_to_degree(AngleRad, Angle).

    По формуле вычисляется значение косинуса угла, чтобы получить значение угла необходимо вычислить арккосинус. При этом угол будет получен в радианах, для перевода результата в градусы используется вспомогательная функция radian_to_degree.

    Вложения:
  • #2376

    questioner
    Участник

    Приведенное решение замечательно работает в SWI Prolog, однако мне необходима функция для Visual Prolog 5.2. Проблема заключается в том, что в нем нет функции вычисления арккосинуса, есть только арктангенс.

  • #2379

    Одним из вариантов решения проблемы на Visual Prolog может быть получение синуса угла по значению его косинуса с помощью известной формулы, затем вычисления тангенса угла как отношения синуса к косинусу. После этого можно применить имеющуюся в Visual Prolog функцию arctan для вычисления угла. При этом необходимо учитывать, что при вычислении тангенса может возникнуть деление на ноль (при нулевом косинусе) — такую ситуацию необходимо отдельно обработать, вернув в качестве угла — 90 градусов:

    angle(equation(A1, B1, _C1), equation(A2, B2, _C2), Angle):-
      	CosAngle = (A1*A2 + B1*B2) / (sqrt(A1*A1 + B1*B1) * sqrt(A2*A2 + B2*B2)),
      	NOT(CosAngle = 0), !,
      	SinAngle = sqrt(1 - CosAngle*CosAngle),
      	TgAngle = SinAngle / CosAngle,
      	AngleRad = arctan(TgAngle),
      	Angle = abs(57.2958 * AngleRad);
      	Angle = 90.

    Очевидно, это не самое красивое решение — может быть более правильно реализовать самостоятельно функцию вычисления арккосинуса.

Для ответа в этой теме необходимо авторизоваться.