Перевод на Лисп
Мне нужен алгоритм 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.