Определить лежат ли три заданные точки на одной прямой 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))) ) )
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д