Определить лежат ли три заданные точки на одной прямой lisp

Узнай цену своей работы

Формулировка задачи:

Здравствуйте помогите пожалуйста! Определить обычную функцию-предикат, которая принимает в качестве аргумента список точек (радиус-векторов) и возвращает true, если все указанные точки лежат на одной прямой (вычислять с допустимым отклонением *tolerance*) Точки могут задаваться как декартовыми координатами, так и полярными. Т.е:
Листинг программы
  1. (defgeneric points (p1 p2 p3 &optional tolerance))
  2. (defmethod points ((p1 cart) (p2 cart) (p3 cart) &optional (tolerance 0.02))
  3. ...)
Вот пока что имеется:
Листинг программы
  1. (defclass cart ()
  2. ((x :initarg :x :reader cart-x)
  3. (y :initarg :y :reader cart-y)))
  4. (defclass polar ()
  5. ((radius :initarg :radius :accessor radius)
  6. (angle :initarg :angle :accessor angle)))
  7. (defmethod radius ((c cart))
  8. (sqrt (+ (square (cart-x c))
  9. (square (cart-y c)))))
  10. (defmethod angle ((c cart))
  11. (atan (cart-y c) (cart-x c)))
  12. (defmethod cart-x ((p polar))
  13. (* (radius p) (cos (angle p))))
  14. (defmethod cart-y ((p polar))
  15. (* (radius p) (sin (angle p))))
  16. (defgeneric to-cart (arg)
  17. (:method ((c cart))
  18. c)
  19. (:method ((p polar))
  20. (make-instance 'cart
  21. :x (cart-x p)
  22. :y (cart-y p))) )
  23. (defmethod sum ((c1 cart) (c2 cart))
  24. (make-instance 'cart
  25. :x (+ (cart-x c1) (cart-x c2))
  26. :y (+ (cart-y c1) (cart-y c2))))
  27. (defmethod sum ((p1 polar) (p2 polar))
  28. (make-instance 'cart
  29. :x (+ (cart-x p1) (cart-x p2))
  30. :y (+ (cart-y p1) (cart-y p2))))
  31. (defclass line ()
  32. ((start :initarg :start :accessor line-start)
  33. (end :initarg :end :accessor line-end)))
  34. (defclass points ()
  35. ((p1 :initarg :1 :reader p1)
  36. (p2 :initarg :2 :reader p2)
  37. (p3 :initarg :3 :reader p3)))
А дальше я что-то не знаю, что делать, заранее спасибо за помощь

Решение задачи: «Определить лежат ли три заданные точки на одной прямой lisp»

textual
Листинг программы
  1. (defun vunit (v)
  2. ;;; VUNIT
  3. ;;; Returns the single unit vector of a vector
  4. ;;; Единичный вектор
  5. ;;;
  6. ;;; Argument = a vector
  7.   ((lambda (l)
  8.      (if (/= 0 l)
  9.        (mapcar (function (lambda (x) (/ x l))) v)
  10.      )
  11.    )
  12.     (distance '(0 0 0) v)
  13.   )
  14. )
  15.  
  16. (defun vec1 (p1 p2)
  17. ;;; VEC1
  18. ;;; Returns the single unit vector from p1 to p2
  19. ;;; Единичный вектор из p1 в p2
  20. ;;;
  21. ;;; Arguments = two points
  22.   (vunit (mapcar '- p2 p1))
  23. )
  24.  
  25. (defun v^v (v1 v2)
  26. ;;; V^V
  27. ;;; Returns the cross product of two vectors
  28. ;;; Векторное произведение векторов
  29. ;;;
  30. ;;; Arguments = 2 vectors
  31.   (list (- (* (cadr  v1) (caddr v2)) (* (caddr v1) (cadr v2)))
  32.         (- (* (caddr v1) (car   v2)) (* (car v1) (caddr v2)))
  33.         (- (* (car   v1) (cadr  v2)) (* (cadr v1) (car v2)))
  34.   )
  35. )

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


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

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

5   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы