Guest User

Untitled

a guest
Dec 18th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.10 KB | None | 0 0
  1. #lang racket
  2.  
  3. (require math/matrix)
  4. (require math/array)
  5. (require racket/draw)
  6. (require pict)
  7.  
  8. (struct pt (x y) #:transparent)
  9. (struct vec (dx dy) #:transparent)
  10.  
  11. (define (pt- p q)
  12. (let ([dx (- (pt-x p) (pt-x q))]
  13. [dy (- (pt-y p) (pt-y q))])
  14. (vec dx dy)))
  15.  
  16. (define (pt+ p v)
  17. (let ([x (+ (pt-x p) (vec-dx v))]
  18. [y (+ (pt-y p) (vec-dy v))])
  19. (pt x y)))
  20.  
  21. (define (pt-fliph p)
  22. (let ([x (- (pt-x p))]
  23. [y (pt-y p)])
  24. (pt x y)))
  25.  
  26. (define (vec+ u v)
  27. (let ([dx (+ (vec-dx u) (vec-dx v))]
  28. [dy (+ (vec-dy u) (vec-dy v))])
  29. (vec dx dy)))
  30.  
  31. (define (vec* c v)
  32. (let ([dx (* c (vec-dx v))]
  33. [dy (* c (vec-dy v))])
  34. (vec dx dy)))
  35.  
  36. (define (vec-dot u v)
  37. (let ([dx (* (vec-dx u) (vec-dx v))]
  38. [dy (* (vec-dy u) (vec-dy v))])
  39. (+ dx dy)))
  40.  
  41. (define (vec-neg v)
  42. (let ([dx (- (vec-dx v))]
  43. [dy (- (vec-dy v))])
  44. (vec dx dy)))
  45.  
  46. (define (pt-transform p m)
  47. (let* ([n (row-matrix [(pt-x p) (pt-y p) 1])]
  48. [o (matrix* n m)])
  49. (pt [array-ref o (vector 0 0)] [array-ref o (vector 0 1)])))
  50.  
  51. (define (vec-transform v m)
  52. (let* ([n (row-matrix [(vec-dx v) (vec-dy v) 1])]
  53. [o (matrix* n m)])
  54. (vec [array-ref o (vector 0 0)] [array-ref o (vector 0 1)])))
  55.  
  56. (define (vec-length v) (sqrt (vec-dot v v)))
  57.  
  58. (define (vec->pt v) (pt (vec-dx v) (vec-dy v)))
  59. (define (pt->vec p) (vec (pt-x p) (pt-y p)))
  60.  
  61. (define (deg->rad n) (* n (/ (* 2 pi) 360)))
  62. (define (rad->deg n) (* n (/ 360 (* 2 pi))))
  63.  
  64. (define (translation-matrix dx dy)
  65. (matrix [[1 0 0] [0 1 0] [dx dy 1]]))
  66.  
  67. (define (scale-matrix sx sy)
  68. (matrix [[sx 0 0] [0 sy 0] [0 0 1]]))
  69.  
  70. (define (rotation-matrix t)
  71. (matrix [[(cos t) (sin t) 0]
  72. [(- (sin t)) (cos t) 0]
  73. [0 0 1]]))
  74.  
  75. (define (tab a b) (translation-matrix a b))
  76. (define (sab a b) (scale-matrix a b))
  77. (define (rt t) (rotation-matrix t))
  78.  
  79. (define p1 (pt 5 8))
  80. (define p2 (pt 1 1))
  81. (define p3 (pt 5 4))
  82. (define p4 (pt 8 5))
  83.  
  84. (define (draw-arrow dc p1 p2 pen)
  85. (define head-length 1)
  86. (define theta (deg->rad 30))
  87. (let* ([a (pt- p2 p1)]
  88. [t (/ head-length (vec-length a))]
  89. [v30 (vec* t a)]
  90. [v31 (vec-transform v30 (rt theta))]
  91. [v32 (vec-transform v30 (rt (- theta)))]
  92. [p4 (pt+ p2 (vec-neg v31))]
  93. [p5 (pt+ p2 (vec-neg v32))])
  94. (define old-pen (send dc get-pen))
  95. (define old-brush (send dc get-brush))
  96. (define path0 (new dc-path%))
  97. (define path1 (new dc-path%))
  98. (define path2 (new dc-path%))
  99. (send dc set-pen pen)
  100. (send path0 move-to (pt-x p1) (pt-y p1))
  101. (send path0 line-to (pt-x p2) (pt-y p2))
  102. (send path1 move-to (pt-x p4) (pt-y p4))
  103. (send path1 line-to (pt-x p2) (pt-y p2))
  104. (send path2 move-to (pt-x p5) (pt-y p5))
  105. (send path2 line-to (pt-x p2) (pt-y p2))
  106. (send dc draw-path path0)
  107. (send dc draw-path path1)
  108. (send dc draw-path path2)
  109. (send dc set-pen old-pen)
  110. (send dc set-brush old-brush)))
  111.  
  112. (define img
  113. (dc (λ (dc dx dy)
  114. (draw-arrow dc p1 p3 (new pen% [width 0.1] [color "blue"]))
  115. (draw-arrow dc p2 p1 (new pen% [width 0.1] [color "black"]))
  116. (draw-arrow dc p1 p4 (new pen% [width 0.1] [color "red"])))
  117. 10 10))
Add Comment
Please, Sign In to add comment