src/vectors.lisp @ 4e226f02861b

Episode 12: Edge Handling (1)
author Steve Losh <steve@stevelosh.com>
date Sun, 17 Apr 2016 20:47:47 +0000
parents 2f82e9ecb18e
children 540972fdbaab
(in-package #:coding-math)

(defclass vec ()
  ((x :type 'real :initarg :x :accessor vec-x)
   (y :type 'real :initarg :y :accessor vec-y)))


(defun make-vec (&optional (x 0) (y 0))
  (make-instance 'vec :x x :y y))

(defun make-vec-md (magnitude angle)
  (let ((v (make-vec 0 0)))
    (setf (vec-magnitude v) magnitude
          (vec-angle v) angle)
    v))


(defun vec-magnitude (vec)
  (with-slots (x y) vec
    (sqrt (+ (* x x)
             (* y y)))))

(defun vec-angle (vec)
  (with-slots (x y) vec
    (atan y x)))


(defun (setf vec-angle) (angle vec)
  (let ((magnitude (vec-magnitude vec)))
    (with-slots (x y) vec
      (setf x (* magnitude (cos angle)))
      (setf y (* magnitude (sin angle)))))
  angle)

(defun (setf vec-magnitude) (magnitude vec)
  (let ((angle (vec-angle vec)))
    (with-slots (x y) vec
      (setf x (* magnitude (cos angle)))
      (setf y (* magnitude (sin angle)))))
  magnitude)


(defun vec-add (v1 v2)
  (make-vec (+ (vec-x v1) (vec-x v2))
            (+ (vec-y v1) (vec-y v2))))

(defun vec-sub (v1 v2)
  (make-vec (- (vec-x v1) (vec-x v2))
            (- (vec-y v1) (vec-y v2))))

(defun vec-mul (v s)
  (make-vec (* (vec-x v) s)
            (* (vec-y v) s)))

(defun vec-div (v s)
  (make-vec (/ (vec-x v) s)
            (/ (vec-y v) s)))


(defun vec-add! (v1 v2)
  (incf (vec-x v1) (vec-x v2))
  (incf (vec-y v1) (vec-y v2)))

(defun vec-sub! (v1 v2)
  (decf (vec-x v1) (vec-x v2))
  (decf (vec-y v1) (vec-y v2)))

(defun vec-mul! (v s)
  (setf (vec-x v) (* (vec-x v) s)
        (vec-y v) (* (vec-y v) s)))

(defun vec-div! (v s)
  (setf (vec-x v) (/ (vec-x v) s)
        (vec-y v) (/ (vec-y v) s)))


(defun vec-to-string (v)
  (format nil "[~A ~A]" (vec-x v) (vec-y v)))