Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.21 KB | None | 0 0
  1. (defun make-line (func l r b)
  2.   (loop for x from l to r by b collect (cons x (funcall func x))))
  3.  
  4. (defun f (x) (- (- (* x x)) 3))       ; -x^2 - 3
  5. (defun g (x) (* x x))                 ; x^2
  6. (defun h (x) (+ (* x x) (* 10 x) 25)) ; (x + 5)^2
  7. (defun l (x) (+ x))                   ; x
  8. (defparameter *line1* (make-line #'f -10 10 0.1))
  9. (defparameter *line2* (make-line #'g -10 10 0.1))
  10. (defparameter *line3* (make-line #'h -10 10 0.1))
  11. (defparameter *line4* (make-line #'l -10 10 0.1))
  12.  
  13. (defun dist^2 (p1 p2)
  14.   (+ (expt (- (car p1) (car p2)) 2) (expt (- (cdr p1) (cdr p2)) 2)))
  15.  
  16. (defun mid-point (p1 p2)
  17.   (cons (/ (+ (car p1) (car p2)) 2) (/ (+ (cdr p1) (cdr p2)) 2)))
  18.  
  19. (defun minimum (lst &key (comp< #'<) (key #'identity))
  20.   (let* ((res (car lst))
  21.          (min (funcall key res)))
  22.     (loop for p in (cdr lst) do
  23.          (when (funcall comp< (funcall key p) min)
  24.            (setf min (funcall key p) res p)))
  25.     (values res min)))
  26.  
  27. (defun mid-line (l1 l2)
  28.   (sort (mapcar #'mid-point
  29.                 l1
  30.                 (loop for p1 in l1 collect
  31.                      (minimum l2 :key (lambda (p2) (dist^2 p1 p2)))))
  32.         (lambda (p1 p2) (< (car p1) (car p2)))))
  33.  
  34. ;ex.
  35. ;(mid-line *line3* *line4*)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement