Определить лежат ли три заданные точки на одной прямой 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)))
  )
)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5
Похожие ответы