Определить лежат ли три заданные точки на одной прямой lisp
Формулировка задачи:
Здравствуйте помогите пожалуйста!
Определить обычную функцию-предикат, которая принимает в качестве аргумента список точек (радиус-векторов) и возвращает true, если все указанные точки лежат на одной прямой (вычислять с допустимым отклонением *tolerance*)
Точки могут задаваться как декартовыми координатами, так и полярными.
Т.е:
Вот пока что имеется:
А дальше я что-то не знаю, что делать, заранее спасибо за помощь
(defgeneric points (p1 p2 p3 &optional tolerance)) (defmethod points ((p1 cart) (p2 cart) (p3 cart) &optional (tolerance 0.02)) ...)
(defclass cart ()
((x :initarg :x :reader cart-x)
(y :initarg :y :reader cart-y)))
(defclass polar ()
((radius :initarg :radius :accessor radius)
(angle :initarg :angle :accessor angle)))
(defmethod radius ((c cart))
(sqrt (+ (square (cart-x c))
(square (cart-y c)))))
(defmethod angle ((c cart))
(atan (cart-y c) (cart-x c)))
(defmethod cart-x ((p polar))
(* (radius p) (cos (angle p))))
(defmethod cart-y ((p polar))
(* (radius p) (sin (angle p))))
(defgeneric to-cart (arg)
(:method ((c cart))
c)
(:method ((p polar))
(make-instance 'cart
:x (cart-x p)
:y (cart-y p))) )
(defmethod sum ((c1 cart) (c2 cart))
(make-instance 'cart
:x (+ (cart-x c1) (cart-x c2))
:y (+ (cart-y c1) (cart-y c2))))
(defmethod sum ((p1 polar) (p2 polar))
(make-instance 'cart
:x (+ (cart-x p1) (cart-x p2))
:y (+ (cart-y p1) (cart-y p2))))
(defclass line ()
((start :initarg :start :accessor line-start)
(end :initarg :end :accessor line-end)))
(defclass points ()
((p1 :initarg :1 :reader p1)
(p2 :initarg :2 :reader p2)
(p3 :initarg :3 :reader p3)))Решение задачи: «Определить лежат ли три заданные точки на одной прямой lisp»
textual
Листинг программы
(defun vunit (v) ;;; VUNIT ;;; Returns the single unit vector of a vector ;;; Единичный вектор ;;; ;;; Argument = a vector ((lambda (l) (if (/= 0 l) (mapcar (function (lambda (x) (/ x l))) v) ) ) (distance '(0 0 0) v) ) ) (defun vec1 (p1 p2) ;;; VEC1 ;;; Returns the single unit vector from p1 to p2 ;;; Единичный вектор из p1 в p2 ;;; ;;; Arguments = two points (vunit (mapcar '- p2 p1)) ) (defun v^v (v1 v2) ;;; V^V ;;; Returns the cross product of two vectors ;;; Векторное произведение векторов ;;; ;;; Arguments = 2 vectors (list (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2))) (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2))) (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2))) ) )