vector.sld 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. (define-library (turtle vector)
  2. (import (scheme base)
  3. (scheme inexact))
  4. (export rotate vector-sum scale-vector negate-vector vector-magnitude
  5. vector-difference vector-distance unit-vector vector-dot-product
  6. degrees->radians radians->degrees vector-cross-product
  7. vector-angle)
  8. (begin
  9. (define (rotate vec pvec theta-degs)
  10. (define theta (degrees->radians theta-degs))
  11. (vector-sum (scale-vector vec
  12. (cos theta))
  13. (scale-vector pvec
  14. (sin theta))))
  15. (define (vector-sum . vs)
  16. (list->vector (apply map + (map vector->list vs))))
  17. (define (vector-difference . vs)
  18. (if (null? (cdr vs))
  19. (negate-vector (car vs))
  20. (apply vector-sum
  21. (car vs)
  22. (map negate-vector (cdr vs)))))
  23. (define (vector-distance v1 v2)
  24. (vector-magnitude
  25. (vector-sum v1 (scale-vector v2 -1.0))))
  26. (define (scale-vector v k)
  27. (vector-map (lambda (x)
  28. (* x k))
  29. v))
  30. (define (negate-vector v)
  31. (scale-vector v -1))
  32. (define (unit-vector v)
  33. (scale-vector v (/ (vector-magnitude v))))
  34. (define pi (* 2 (acos 0)))
  35. (define (degrees->radians degs)
  36. (* degs (/ pi 180)))
  37. (define (radians->degrees rads)
  38. (/ rads (/ pi 180)))
  39. (define (vector-magnitude v)
  40. (sqrt (apply + (map square (vector->list v)))))
  41. (define (vector-dot-product . l)
  42. (apply + (vector->list (apply vector-map * l))))
  43. (define (vector-cross-product v1 v2)
  44. (define s0 (- (* (vector-ref v1 1)
  45. (vector-ref v2 2))
  46. (* (vector-ref v1 2)
  47. (vector-ref v2 1))))
  48. (define s1 (- (* (vector-ref v1 2)
  49. (vector-ref v2 0))
  50. (* (vector-ref v1 0)
  51. (vector-ref v2 2))))
  52. (define s2 (- (* (vector-ref v1 0)
  53. (vector-ref v2 1))
  54. (* (vector-ref v1 1)
  55. (vector-ref v2 0))))
  56. (vector s0 s1 s2))
  57. (define (vector-angle v1 v2)
  58. (define n (vector-dot-product v1 v2))
  59. (define m (* (vector-magnitude v1)
  60. (vector-magnitude v2)))
  61. (acos (/ n m)))))