vec.scm 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. (define-module (basket vec)
  2. #:use-module (srfi srfi-1)
  3. #:use-module (basket))
  4. (export
  5. pi tau
  6. vec?
  7. vec-x vec-y make-vec
  8. vec-add vec-sub
  9. vec-dot
  10. vec-mult vec-div
  11. lerp vec-lerp vec-midpoint
  12. vec-magnitude
  13. vec-distance
  14. vec-normalize
  15. vec-rotate)
  16. (define pi 3.141592654)
  17. (define tau (* 2 pi))
  18. (define vec-x car)
  19. (define vec-y cdr)
  20. (define make-vec cons)
  21. (define (vec? v)
  22. (and
  23. (pair? v)
  24. (number? (car v))
  25. (number? (cdr v))))
  26. (define (vec-add . vs)
  27. "Adds any amount of vectors."
  28. (fold
  29. (lambda (a b) (make-vec (+ (vec-x a) (vec-x b))
  30. (+ (vec-y a) (vec-y b))))
  31. '(0 . 0)
  32. vs))
  33. (define (vec-sub . vs)
  34. "Subtracts any amount of vectors."
  35. (cond ((null? vs) '(0 . 0))
  36. ((= (length vs) 1) (vec-mult (car vs) -1))
  37. (else
  38. (fold
  39. (lambda (b a) (make-vec (- (vec-x a) (vec-x b))
  40. (- (vec-y a) (vec-y b))))
  41. (car vs)
  42. (cdr vs)))))
  43. (define (vec-mult a n)
  44. "Multiplies a vector by a scalar."
  45. (make-vec (* (vec-x a) n) (* (vec-y a) n)))
  46. (define (vec-div a n)
  47. "Divides a vector by a scalar."
  48. (vec-mult a (/ 1 n)))
  49. (define (vec-dot a b)
  50. "Returns the dot product of two vectors."
  51. (+ (* (vec-x a) (vec-x b)) (* (vec-y a) (vec-y b))))
  52. (define (lerp a b t)
  53. "Linearly interpolates between two numbers."
  54. (+ (* a (- 1 t)) (* b t)))
  55. (define (vec-lerp a b t)
  56. "Linearly interpolates between two vectors."
  57. (vec-add (vec-mult a (- 1 t)) (vec-mult b t)))
  58. (define (vec-midpoint a b)
  59. "Returns the midpoint of two vectors."
  60. (vec-lerp a b 0.5))
  61. (define (vec-magnitude a)
  62. "Returns the magnitude of a vector."
  63. (sqrt (+ (* (vec-x a) (vec-x a)) (* (vec-y a) (vec-y a)))))
  64. (define (vec-distance a b)
  65. "Returns the distance between two vectors."
  66. (vec-magnitude (vec-sub a b)))
  67. (define (vec-normalize a)
  68. "Normalizes (sets the magnitude to 1) of a vector."
  69. (if (= (vec-magnitude a) 0)
  70. a
  71. (vec-div a (vec-magnitude a))))
  72. (define (vec-rotate a t)
  73. "Rotates a vector by an angle."
  74. (make-vec
  75. (- (* (vec-x a) (cos t)) (* (vec-y a) (sin t)))
  76. (+ (* (vec-x a) (sin t)) (* (vec-y a) (cos t)))))