Перевод на Лисп

Мне нужен алгоритм Lisp, переведенный либо в Python, либо в математическое уравнение. У кого-нибудь есть необходимые навыки для этого?

;; Bulge Center  -  Lee Mac
;; p1 - start vertex
;; p2 - end vertex
;; b  - bulge
;; Returns the center of the arc described by the given bulge and vertices

(defun LM:BulgeCenter ( p1 p2 b )
    (polar p1
        (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b))))
        (/ (* (distance p1 p2) (1+ (* b b))) 4 b)
    )
)

2 ответа

Нотация инфикса будет выглядеть примерно так:

polar(p1,
      angle(p1,p2) + ( pi / 2 - 2 * atan(b)),
      (distance(p1,p2) * (1 + b * b)) / (4 * b)
     )

Вот быстрая и грязная функция, чтобы ее предварительно обработать:

(ql:quickload :trivia)
(use-package :trivia)

(defun pretty (form)
  (match form
    ('pi "\\pi{}")
    ((or 'p1 'p2) (format nil
                          "~{~(~a~)_{~a}~}"
                          (coerce (string form) 'list)))
    ((type symbol) (let ((name (string-downcase (string form))))
                     (if (= (length name) 1)
                         name
                         (format nil "\\text{~a}" name))))
    ((type number) (princ-to-string form))
    ((list '1+ x) (pretty `(+ ,x 1)))
    ((list* '* args) (if (= (length (remove-duplicates args)) 1)
                         (format nil
                                 "~a^{~a}"
                                 (pretty (first args))
                                 (length args))
                         (format nil
                                 "~{~a~^\\cdot{}~}"
                                 (mapcar #'pretty args))))
    ((list '/ x) (pretty `(/ 1 ,x)))
    ((list '/ x y) (format nil
                           "\\frac{~a}{~a}"
                           (pretty x)
                           (pretty y)))
    ((list* '/ x args) (pretty `(/ ,x (* ,@args))))
    ((list* (guard op (member op '(+ -))) args)
     (with-output-to-string (out)
       (loop
         initially (princ "\\left(" out)
         for (a . b) on args
         do (princ (pretty a) out)
         while b
         do (format out " ~a " op)
         finally (princ "\\right)" out))))
    ((list* op args) (format nil
                             "~a\\left(~{~a~^, ~}\\right)"
                             (pretty op)
                             (mapcar #'pretty args)))))

Вызовите это в выражении в кавычках, чтобы получить математическое выражение LaTeX. Например, в Emacs / Slime, Cu Cx e после следующей формы оценивает и вставляет вывод в тот же буфер (вы также можете использовать REPL):

(progn
  (princ
        (pretty 
         '(polar p1
           (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b))))
           (/ (* (distance p1 p2) (1+ (* b b))) 4 b)
           )))
  (values))

Затем вы можете включить строку в минимальный документ:

\documentclass{minimal}
\begin{document}
\[
\text{polar}\left(p_{1}, \left(\text{angle}\left(p_{1}, p_{2}\right) + \left(\frac{\pi{}}{2} - 2\cdot{}\text{atan}\left(b\right)\right)\right), \frac{\text{distance}\left(p_{1}, p_{2}\right)\cdot{}\left(b^{2} + 1\right)}{4\cdot{}b}\right)
\]
\end{document}

Который дает:

введите описание изображения здесь

Примечание: если вы не хотите устанавливать LaTeX, используйте, например, http://www.codecogs.com/latex/eqneditor.php или http://www.sciweavers.org/free-online-latex-equation-editor.

Другие вопросы по тегам