physics.sld 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. (define-library (turtle physics)
  2. (import
  3. (scheme base)
  4. (scheme inexact)
  5. (turtle turtle3)
  6. (turtle vector)
  7. (yasos))
  8. (export apply-force apply-momentum
  9. planet? get-mass get-momentum get-force
  10. set-mass! set-momentum! set-force! apply-physics!
  11. calculate-gravity make-planet)
  12. (begin
  13. (define (apply-force f-vector p-vector delta-t)
  14. ;; F * dt = dp
  15. (vector-sum p-vector (scale-vector f-vector delta-t)))
  16. (define (apply-momentum p-vec start-pos mass delta-t)
  17. ;; ds = (p / m) * dt
  18. (vector-sum start-pos (scale-vector p-vec (/ delta-t mass))))
  19. (define-predicate planet?)
  20. (define-operation (get-mass obj))
  21. (define-operation (get-momentum obj))
  22. (define-operation (get-force obj))
  23. (define-operation (set-mass! obj new-mass))
  24. (define-operation (set-momentum! obj new-momentum))
  25. (define-operation (set-force! obj new-force))
  26. (define-operation (apply-physics! obj delta-t))
  27. (define (calculate-gravity body-1 body-2 g-constant)
  28. ;; g-constant is the gravitational constant
  29. ;; this returns the force acting upon body-1
  30. (define d (vector-distance (get-pos body-1)
  31. (get-pos body-2)))
  32. (define f-magnitude (/ (* g-constant
  33. (get-mass body-1)
  34. (get-mass body-2))
  35. (square d)))
  36. (define difference-vector (vector-sum (get-pos body-2)
  37. (scale-vector (get-pos body-1) -1)))
  38. (define unit-difference (unit-vector difference-vector))
  39. (scale-vector unit-difference f-magnitude))
  40. (define (make-planet)
  41. (define mass 1.0)
  42. (define momentum #(0.0 0.0 0.0))
  43. (define force #(0.0 0.0 0.0))
  44. (object-with-ancestors ((p (make-turtle)))
  45. ((planet? self) #t)
  46. ((get-mass self) mass)
  47. ((get-momentum self) momentum)
  48. ((get-force self) force)
  49. ((set-mass! self new-mass)
  50. (set! mass new-mass))
  51. ((set-momentum! self new-momentum)
  52. (set! momentum new-momentum))
  53. ((set-force! self new-force)
  54. (set! force new-force))
  55. ((apply-physics! self delta-t)
  56. (set! momentum (apply-force (get-force self) (get-momentum self) delta-t))
  57. (set-pos! self (apply-momentum (get-momentum self)
  58. (get-pos self)
  59. (get-mass self)
  60. delta-t)))))))