Нужна помощь в переводе радиального расстояния в понятие обратной полировки для программы LISP - PullRequest
1 голос
/ 20 февраля 2011

Формула расстояния для полярных координат показана здесь: http://math.ucsd.edu/~wgarner/math4c/derivations/distance/distancepolar.htm

Я пытался сделать это так:

(defun distant-formula (r1 r2 t1 t2)
(setq d ( sqrt (*(-(+ (expt r1 2)(expt r2 2))(* 2 r1 r2))
                (cos(- t1 t2))))))

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

Ответы [ 2 ]

4 голосов
/ 20 февраля 2011

Переменная D в вашем коде бесполезна.Вы не должны присваивать значения неопределенным переменным.Лисп также возвращает значение вычисления.Это делает такое назначение особенно бесполезным.

Вы можете написать формулу так:

(defun distant-formula (r1 r2 t1 t2)
  (+ (expt r1 2)
     (expt r2 2)
     (* -2 r1 r2 (cos (- t1 t2)))))

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

3 голосов
/ 20 февраля 2011

Глядя на оригинальную формулу:

sqrt(r1**2 + r2**2 - 2 * r1 * r2 * cos(t1 - t2))

Вы хотите работать снаружи внутрь:

(sqrt (+ (* r1 r1) (* r1 r1) (* -2 r1 r2 (cos (- t1 t2)))))

Вы должны быть осторожны с приоритетом операторов. Один из способов сделать преобразование состоит во всех неявных скобках в инфиксной нотации (поэтому a * b + c переходит на ((a * b) + c)), а затем переставить так, чтобы операторы были впереди.

...