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