@luceosports/play-rendering 1.19.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/.babelrc +2 -1
  2. package/.eslintrc +11 -42
  3. package/dist/play-rendering.d.ts +21 -0
  4. package/dist/play-rendering.js +17 -8
  5. package/dist/play-rendering.js.map +1 -1
  6. package/dist/types/constants.d.ts +41 -0
  7. package/dist/types/helpers/common.d.ts +5 -0
  8. package/dist/types/layers/court/index.d.ts +18 -0
  9. package/dist/types/math/Bezier.d.ts +19 -0
  10. package/dist/types/math/LineDrawingMath.d.ts +8 -0
  11. package/dist/types/models/AnimationModel.d.ts +21 -0
  12. package/dist/types/models/FrameModel.d.ts +39 -0
  13. package/dist/types/models/LineModel.d.ts +22 -0
  14. package/dist/types/models/NoteModel.d.ts +17 -0
  15. package/dist/types/models/PlayModel.d.ts +40 -0
  16. package/dist/types/models/PlayerModel.d.ts +20 -0
  17. package/dist/types/models/ShapeModel.d.ts +54 -0
  18. package/dist/types/models/ShapeModels/CircleShape.d.ts +8 -0
  19. package/dist/types/models/ShapeModels/ConeShape.d.ts +8 -0
  20. package/dist/types/models/ShapeModels/FovShape.d.ts +12 -0
  21. package/dist/types/models/ShapeModels/LineShape.d.ts +11 -0
  22. package/dist/types/models/ShapeModels/SquareShape.d.ts +8 -0
  23. package/dist/types/models/ShapeModels/StraightShape.d.ts +12 -0
  24. package/dist/types/models/ShapeModels/TriangleShape.d.ts +12 -0
  25. package/dist/types/models/ShapeModels/XMarkShape.d.ts +8 -0
  26. package/dist/types/models/ShapeModels/index.d.ts +14 -0
  27. package/dist/types/models/ShapeModels/line/CutLineShape.d.ts +3 -0
  28. package/dist/types/models/ShapeModels/line/DribbleLineShape.d.ts +3 -0
  29. package/dist/types/models/ShapeModels/line/HandoffLineShape.d.ts +3 -0
  30. package/dist/types/models/ShapeModels/line/PassLineShape.d.ts +3 -0
  31. package/dist/types/models/ShapeModels/line/ScreenLineShape.d.ts +3 -0
  32. package/dist/types/types/index.d.ts +138 -0
  33. package/package.json +16 -13
  34. package/src/config.ts +1 -0
  35. package/src/constants.ts +49 -0
  36. package/src/global.d.ts +9 -0
  37. package/src/helpers/common.ts +40 -0
  38. package/src/index.ts +36 -0
  39. package/src/layers/{CourtLayer.js → CourtLayer.ts} +4 -6
  40. package/src/layers/{LineControlPointLayer.js → LineControlPointLayer.ts} +2 -4
  41. package/src/layers/{LineLayer.js → LineLayer.ts} +5 -7
  42. package/src/layers/{NoteLayer.js → NoteLayer.ts} +19 -19
  43. package/src/layers/{PlayerLayer.js → PlayerLayer.ts} +6 -7
  44. package/src/layers/{ShapeControlPointLayer.js → ShapeControlPointLayer.ts} +2 -4
  45. package/src/layers/{ShapeLayer.js → ShapeLayer.ts} +4 -6
  46. package/src/layers/base/BaseLayer.ts +15 -0
  47. package/src/layers/base/InternalBaseLayer.ts +29 -0
  48. package/src/layers/court/base/{InternalCourtLayer.js → InternalCourtLayer.ts} +3 -5
  49. package/src/layers/court/index.ts +213 -0
  50. package/src/layers/court/layers/BASEBALL/constants.ts +5 -0
  51. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/constants.ts +34 -0
  52. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{ADirtLayer.js → ADirtLayer.ts} +14 -14
  53. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{BaseLineLayer.js → BaseLineLayer.ts} +4 -10
  54. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{HomePlateLayer.js → HomePlateLayer.ts} +14 -15
  55. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{PitchingMoundLayer.js → PitchingMoundLayer.ts} +7 -8
  56. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/index.ts +6 -0
  57. package/src/layers/court/layers/{BASKETBALL/layers/BorderRectLayer.js → BASEBALL/layers/BorderRectLayer.ts} +2 -4
  58. package/src/layers/court/layers/BASEBALL/layers/index.ts +3 -0
  59. package/src/layers/court/layers/BASKETBALL/common/{LaneMarkingNBATrait.js → LaneMarkingNBATrait.ts} +1 -1
  60. package/src/layers/court/layers/BASKETBALL/common/{LaneMarkingNCAATrait.js → LaneMarkingNCAATrait.ts} +1 -1
  61. package/src/layers/court/layers/BASKETBALL/constants.ts +5 -0
  62. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/constants.ts +11 -0
  63. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/{Big3Layer.js → Big3Layer.ts} +2 -4
  64. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/LaneMarkingLayer.ts +10 -0
  65. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/index.ts +4 -0
  66. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/constants.ts +11 -0
  67. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/layers/{LaneMarkingLayer.js → LaneMarkingLayer.ts} +2 -4
  68. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/layers/index.ts +3 -0
  69. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/constants.ts +11 -0
  70. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/LaneMarkingLayer.ts +10 -0
  71. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/index.ts +3 -0
  72. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/constants.ts +11 -0
  73. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/LaneMarkingLayer.ts +10 -0
  74. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/index.ts +3 -0
  75. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/constants.ts +11 -0
  76. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/LaneMarkingLayer.ts +10 -0
  77. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/index.ts +3 -0
  78. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/constants.ts +11 -0
  79. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/LaneMarkingLayer.ts +10 -0
  80. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/index.ts +3 -0
  81. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/constants.ts +11 -0
  82. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/LaneMarkingLayer.ts +10 -0
  83. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/index.ts +3 -0
  84. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/constants.ts +11 -0
  85. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/LaneMarkingLayer.ts +10 -0
  86. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/index.ts +3 -0
  87. package/src/layers/court/layers/BASKETBALL/layers/{BaseLineMarkingLayer.js → BaseLineMarkingLayer.ts} +3 -4
  88. package/src/layers/court/layers/BASKETBALL/layers/{BenchAreaLayer.js → BenchAreaLayer.ts} +2 -4
  89. package/src/layers/court/layers/{LACROSSE/layers/BorderRectLayer.js → BASKETBALL/layers/BorderRectLayer.ts} +2 -4
  90. package/src/layers/court/layers/BASKETBALL/layers/{CenterCircleLayer.js → CenterCircleLayer.ts} +2 -4
  91. package/src/layers/court/layers/{FOOTBALL/layers/CenterLineLayer.js → BASKETBALL/layers/CenterLineLayer.ts} +2 -4
  92. package/src/layers/court/layers/BASKETBALL/layers/{FreeThrowLayer.js → FreeThrowLayer.ts} +2 -4
  93. package/src/layers/court/layers/BASKETBALL/layers/{HoopLayer.js → HoopLayer.ts} +2 -4
  94. package/src/layers/court/layers/BASKETBALL/layers/{InnerOuterRectLayer.js → InnerOuterRectLayer.ts} +2 -4
  95. package/src/layers/court/layers/BASKETBALL/layers/{RestrictedAreaLayer.js → RestrictedAreaLayer.ts} +3 -4
  96. package/src/layers/court/layers/BASKETBALL/layers/{ThreePointLineLayer.js → ThreePointLineLayer.ts} +2 -4
  97. package/src/layers/court/layers/BASKETBALL/layers/index.ts +23 -0
  98. package/src/layers/court/layers/FOOTBALL/constants.ts +5 -0
  99. package/src/layers/court/layers/FOOTBALL/courtTypes/FOOTBALL_HIGH_SCHOOL/constants.ts +3 -0
  100. package/src/layers/court/layers/{BASEBALL/layers/BorderRectLayer.js → FOOTBALL/layers/BorderRectLayer.ts} +2 -4
  101. package/src/layers/court/layers/{SOCCER/layers/CenterLineLayer.js → FOOTBALL/layers/CenterLineLayer.ts} +2 -4
  102. package/src/layers/court/layers/FOOTBALL/layers/{EndZoneLayer.js → EndZoneLayer.ts} +2 -4
  103. package/src/layers/court/layers/FOOTBALL/layers/{FieldNumberLayer.js → FieldNumberLayer.ts} +2 -4
  104. package/src/layers/court/layers/FOOTBALL/layers/{HashMarkLayer.js → HashMarkLayer.ts} +2 -4
  105. package/src/layers/court/layers/FOOTBALL/layers/{YardLineLayer.js → YardLineLayer.ts} +2 -4
  106. package/src/layers/court/layers/FOOTBALL/layers/index.ts +8 -0
  107. package/src/layers/court/layers/HOCKEY/constants.ts +5 -0
  108. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/constants.ts +12 -0
  109. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/layers/{GoaCreaseLayer.js → GoaCreaseLayer.ts} +2 -4
  110. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/layers/index.ts +3 -0
  111. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/constants.ts +12 -0
  112. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/layers/{GoaCreaseLayer.js → GoaCreaseLayer.ts} +2 -4
  113. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/layers/index.ts +3 -0
  114. package/src/layers/court/layers/HOCKEY/layers/{BorderRinkLayer.js → BorderRinkLayer.ts} +2 -4
  115. package/src/layers/court/layers/HOCKEY/layers/{CenterCircleLayer.js → CenterCircleLayer.ts} +2 -4
  116. package/src/layers/court/layers/HOCKEY/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
  117. package/src/layers/court/layers/HOCKEY/layers/{CenterSpotLayer.js → CenterSpotLayer.ts} +2 -4
  118. package/src/layers/court/layers/HOCKEY/layers/{EndZoneLayer.js → EndZoneLayer.ts} +2 -4
  119. package/src/layers/court/layers/HOCKEY/layers/{GoalLineLayer.js → GoalLineLayer.ts} +2 -4
  120. package/src/layers/court/layers/HOCKEY/layers/{NeutralZoneLayer.js → NeutralZoneLayer.ts} +2 -4
  121. package/src/layers/court/layers/HOCKEY/layers/{RefereeCreaseLayer.js → RefereeCreaseLayer.ts} +2 -4
  122. package/src/layers/court/layers/HOCKEY/layers/index.ts +19 -0
  123. package/src/layers/court/layers/LACROSSE/constants.ts +5 -0
  124. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/constants.ts +4 -0
  125. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
  126. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/{GoalAreaLineLayer.js → GoalAreaLineLayer.ts} +2 -4
  127. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/{WingAreaLineLayer.js → WingAreaLineLayer.ts} +2 -4
  128. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/index.ts +5 -0
  129. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/constants.ts +3 -0
  130. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
  131. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/layers/{FanLineLayer.js → FanLineLayer.ts} +2 -4
  132. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/layers/index.ts +4 -0
  133. package/src/layers/court/layers/{FOOTBALL/layers/BorderRectLayer.js → LACROSSE/layers/BorderRectLayer.ts} +2 -4
  134. package/src/layers/court/layers/LACROSSE/layers/{RestrainingLineLayer.js → RestrainingLineLayer.ts} +2 -4
  135. package/src/layers/court/layers/LACROSSE/layers/index.ts +4 -0
  136. package/src/layers/court/layers/SOCCER/constants.ts +5 -0
  137. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_FIFA/constants.ts +7 -0
  138. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/constants.ts +7 -0
  139. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/{CenterSpotLayer.js → CenterSpotLayer.ts} +2 -4
  140. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/{HashMarkLayer.js → HashMarkLayer.ts} +2 -4
  141. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/{PenaltySpotLayer.js → PenaltySpotLayer.ts} +2 -4
  142. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/index.ts +5 -0
  143. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/constants.ts +7 -0
  144. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/layers/{HashMarkLayer.js → HashMarkLayer.ts} +2 -4
  145. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/layers/{PenaltySpotLayer.js → PenaltySpotLayer.ts} +2 -4
  146. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/layers/index.ts +4 -0
  147. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/constants.ts +7 -0
  148. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/layers/{BuildOutLineLayer.js → BuildOutLineLayer.ts} +2 -4
  149. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/layers/{PenaltyArcLayer.js → PenaltyArcLayer.ts} +2 -4
  150. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/layers/index.ts +4 -0
  151. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/constants.ts +7 -0
  152. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/layers/{PenaltyArcLayer.js → PenaltyArcLayer.ts} +2 -4
  153. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/layers/index.ts +3 -0
  154. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U19/constants.ts +7 -0
  155. package/src/layers/court/layers/SOCCER/layers/BorderRectLayer.ts +10 -0
  156. package/src/layers/court/layers/SOCCER/layers/{CenterCircleLayer.js → CenterCircleLayer.ts} +2 -4
  157. package/src/layers/court/layers/{BASKETBALL/layers/CenterLineLayer.js → SOCCER/layers/CenterLineLayer.ts} +2 -4
  158. package/src/layers/court/layers/SOCCER/layers/{CenterSpotLayer.js → CenterSpotLayer.ts} +2 -4
  159. package/src/layers/court/layers/SOCCER/layers/{CornerLayer.js → CornerLayer.ts} +3 -4
  160. package/src/layers/court/layers/SOCCER/layers/{PenaltyArcLayer.js → PenaltyArcLayer.ts} +2 -4
  161. package/src/layers/court/layers/SOCCER/layers/{PenaltyAreaLayer.js → PenaltyAreaLayer.ts} +2 -4
  162. package/src/layers/court/layers/SOCCER/layers/{PenaltySpotLayer.js → PenaltySpotLayer.ts} +2 -4
  163. package/src/layers/court/layers/SOCCER/layers/index.ts +19 -0
  164. package/src/layers/court/layers/VOLLEYBALL/constants.ts +5 -0
  165. package/src/layers/court/layers/VOLLEYBALL/courtTypes/VOLLEYBALL_INDOOR/constants.ts +2 -0
  166. package/src/layers/court/layers/VOLLEYBALL/layers/{AttackLineLayer.js → AttackLineLayer.ts} +3 -4
  167. package/src/layers/court/layers/VOLLEYBALL/layers/BorderRectLayer.ts +10 -0
  168. package/src/layers/court/layers/VOLLEYBALL/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
  169. package/src/layers/court/layers/VOLLEYBALL/layers/{HashMarkLayer.js → HashMarkLayer.ts} +3 -4
  170. package/src/layers/court/layers/VOLLEYBALL/layers/index.ts +6 -0
  171. package/src/layers/line/base/{ActionLineLayer.js → ActionLineLayer.ts} +2 -4
  172. package/src/layers/line/base/{InternalLineLayer.js → InternalLineLayer.ts} +30 -10
  173. package/src/layers/line/index.ts +8 -0
  174. package/src/layers/line/layers/CutLineLayer.ts +7 -0
  175. package/src/layers/line/layers/{DribbleLineLayer.js → DribbleLineLayer.ts} +14 -8
  176. package/src/layers/line/layers/{HandoffLineLayer.js → HandoffLineLayer.ts} +4 -5
  177. package/src/layers/line/layers/PassLineLayer.ts +11 -0
  178. package/src/layers/line/layers/ScreenLineLayer.ts +7 -0
  179. package/src/layers/line/layers/{ShotLineLayer.js → ShotLineLayer.ts} +2 -4
  180. package/src/layers/shape/base/{InternalShapeLayer.js → InternalShapeLayer.ts} +7 -5
  181. package/src/layers/shape/index.ts +28 -0
  182. package/src/layers/shape/layers/{CircleShapeLayer.js → CircleShapeLayer.ts} +2 -4
  183. package/src/layers/shape/layers/{ConeShapeLayer.js → ConeShapeLayer.ts} +2 -4
  184. package/src/layers/shape/layers/{FovShapeLayer.js → FovShapeLayer.ts} +2 -4
  185. package/src/layers/shape/layers/{SquareShapeLayer.js → SquareShapeLayer.ts} +2 -4
  186. package/src/layers/shape/layers/{StraightShapeLayer.js → StraightShapeLayer.ts} +2 -4
  187. package/src/layers/shape/layers/{TriangleShapeLayer.js → TriangleShapeLayer.ts} +2 -4
  188. package/src/layers/shape/layers/{XmarkShapeLayer.js → XmarkShapeLayer.ts} +2 -4
  189. package/src/layers/shape/layers/line/CutLineShapeLayer.ts +11 -0
  190. package/src/layers/shape/layers/line/DribbleLineShapeLayer.ts +26 -0
  191. package/src/layers/shape/layers/line/HandoffLineShapeLayer.ts +11 -0
  192. package/src/layers/shape/layers/line/PassLineShapeLayer.ts +15 -0
  193. package/src/layers/shape/layers/line/ScreenLineShapeLayer.ts +11 -0
  194. package/src/layers/shape/layers/line/base/InternalLineShapeLayer.ts +44 -0
  195. package/src/math/{Bezier.js → Bezier.ts} +48 -46
  196. package/src/math/LineDrawingMath.ts +573 -0
  197. package/src/models/{Animation.js → AnimationModel.ts} +29 -22
  198. package/src/models/Base/InternalFrameModel.ts +23 -0
  199. package/src/models/{Frame.js → FrameModel.ts} +136 -82
  200. package/src/models/{Line.js → LineModel.ts} +26 -14
  201. package/src/models/{Note.js → NoteModel.ts} +12 -11
  202. package/src/models/Play/Options.ts +31 -0
  203. package/src/models/PlayModel.ts +139 -0
  204. package/src/models/{Player.js → PlayerModel.ts} +5 -6
  205. package/src/models/{Shape.js → ShapeModel.ts} +9 -10
  206. package/src/models/ShapeModels/{CircleShape.js → CircleShape.ts} +2 -4
  207. package/src/models/ShapeModels/{ConeShape.js → ConeShape.ts} +2 -4
  208. package/src/models/ShapeModels/{FovShape.js → FovShape.ts} +2 -4
  209. package/src/models/ShapeModels/{LineShape.js → LineShape.ts} +4 -6
  210. package/src/models/ShapeModels/{XMarkShape.js → SquareShape.ts} +2 -4
  211. package/src/models/ShapeModels/{StraightShape.js → StraightShape.ts} +2 -4
  212. package/src/models/ShapeModels/{TriangleShape.js → TriangleShape.ts} +2 -4
  213. package/src/models/ShapeModels/{SquareShape.js → XMarkShape.ts} +2 -4
  214. package/src/models/ShapeModels/index.ts +30 -0
  215. package/src/models/ShapeModels/line/CutLineShape.ts +3 -0
  216. package/src/models/ShapeModels/line/DribbleLineShape.ts +3 -0
  217. package/src/models/ShapeModels/line/HandoffLineShape.ts +3 -0
  218. package/src/models/ShapeModels/line/PassLineShape.ts +3 -0
  219. package/src/models/ShapeModels/line/ScreenLineShape.ts +3 -0
  220. package/src/playerHatsConfig.ts +39 -0
  221. package/src/shapesConfig.ts +8 -0
  222. package/src/traits/{DribbleLineTrait.js → DribbleLineTrait.ts} +12 -10
  223. package/src/traits/{LineDrawOperationsTrait.js → LineDrawOperationsTrait.ts} +12 -9
  224. package/src/types/index.ts +205 -0
  225. package/tsconfig.json +21 -0
  226. package/webpack.config.js +5 -8
  227. package/index.js +0 -17
  228. package/src/config.js +0 -3
  229. package/src/constants.js +0 -51
  230. package/src/helpers/common.js +0 -12
  231. package/src/layers/base/BaseLayer.js +0 -20
  232. package/src/layers/base/InternalBaseLayer.js +0 -22
  233. package/src/layers/court/index.js +0 -64
  234. package/src/layers/court/layers/BASEBALL/constants.js +0 -7
  235. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/constants.js +0 -36
  236. package/src/layers/court/layers/BASKETBALL/constants.js +0 -7
  237. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/constants.js +0 -13
  238. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/LaneMarkingLayer.js +0 -12
  239. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/constants.js +0 -13
  240. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/constants.js +0 -13
  241. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/LaneMarkingLayer.js +0 -12
  242. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/constants.js +0 -13
  243. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/LaneMarkingLayer.js +0 -12
  244. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/constants.js +0 -13
  245. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/LaneMarkingLayer.js +0 -12
  246. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/constants.js +0 -13
  247. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/LaneMarkingLayer.js +0 -12
  248. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/constants.js +0 -13
  249. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/LaneMarkingLayer.js +0 -12
  250. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/constants.js +0 -13
  251. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/LaneMarkingLayer.js +0 -12
  252. package/src/layers/court/layers/FOOTBALL/constants.js +0 -7
  253. package/src/layers/court/layers/FOOTBALL/courtTypes/FOOTBALL_HIGH_SCHOOL/constants.js +0 -5
  254. package/src/layers/court/layers/HOCKEY/constants.js +0 -7
  255. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/constants.js +0 -14
  256. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/constants.js +0 -14
  257. package/src/layers/court/layers/LACROSSE/constants.js +0 -7
  258. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/constants.js +0 -6
  259. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/constants.js +0 -5
  260. package/src/layers/court/layers/SOCCER/constants.js +0 -7
  261. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_FIFA/constants.js +0 -9
  262. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/constants.js +0 -9
  263. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/constants.js +0 -9
  264. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/constants.js +0 -9
  265. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/constants.js +0 -9
  266. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U19/constants.js +0 -9
  267. package/src/layers/court/layers/SOCCER/layers/BorderRectLayer.js +0 -12
  268. package/src/layers/court/layers/VOLLEYBALL/constants.js +0 -7
  269. package/src/layers/court/layers/VOLLEYBALL/courtTypes/VOLLEYBALL_INDOOR/constants.js +0 -4
  270. package/src/layers/court/layers/VOLLEYBALL/layers/BorderRectLayer.js +0 -12
  271. package/src/layers/line/index.js +0 -11
  272. package/src/layers/line/layers/CutLineLayer.js +0 -9
  273. package/src/layers/line/layers/PassLineLayer.js +0 -13
  274. package/src/layers/line/layers/ScreenLineLayer.js +0 -9
  275. package/src/layers/shape/index.js +0 -17
  276. package/src/layers/shape/layers/line/CutLineShapeLayer.js +0 -13
  277. package/src/layers/shape/layers/line/DribbleLineShapeLayer.js +0 -20
  278. package/src/layers/shape/layers/line/HandoffLineShapeLayer.js +0 -13
  279. package/src/layers/shape/layers/line/PassLineShapeLayer.js +0 -17
  280. package/src/layers/shape/layers/line/ScreenLineShapeLayer.js +0 -13
  281. package/src/layers/shape/layers/line/base/InternalLineShapeLayer.js +0 -34
  282. package/src/math/LineDrawingMath.js +0 -570
  283. package/src/models/Base/InternalFrameModel.js +0 -20
  284. package/src/models/Play/Options.js +0 -31
  285. package/src/models/Play.js +0 -91
  286. package/src/models/ShapeModels/index.js +0 -18
  287. package/src/models/ShapeModels/line/CutLineShape.js +0 -5
  288. package/src/models/ShapeModels/line/DribbleLineShape.js +0 -5
  289. package/src/models/ShapeModels/line/HandoffLineShape.js +0 -5
  290. package/src/models/ShapeModels/line/PassLineShape.js +0 -5
  291. package/src/models/ShapeModels/line/ScreenLineShape.js +0 -5
  292. package/src/playerHatsConfig.js +0 -29
  293. package/src/shapesConfig.js +0 -6
@@ -1,570 +0,0 @@
1
- const math = require('mathjs');
2
-
3
- const sinusoidNumberOfPoints = 1000;
4
-
5
- module.exports.adjustedBezierCurveWithExclusionZones = function(
6
- controlPoints,
7
- startZoneRadius = null,
8
- startAnchor = null,
9
- endZoneRadius = null,
10
- endAnchor = null
11
- ) {
12
- let curve = [...controlPoints];
13
- if (startZoneRadius && startAnchor) {
14
- const controlPointsMat = controlPointsMatFromPoints(controlPoints);
15
- const tVal = firstTValForPointOnCurveOutsideCircle(controlPointsMat, startAnchor, startZoneRadius);
16
- const splitCurves = splitBezierCurveAtTVal(controlPoints, tVal);
17
- curve = [...splitCurves].pop();
18
- }
19
-
20
- if (endZoneRadius && endAnchor) {
21
- const reverseControlPoints = [].concat(curve).reverse(); // reverse array without changing the original
22
- const reverseControlPointsMat = controlPointsMatFromPoints(reverseControlPoints);
23
- const reverseTVal = firstTValForPointOnCurveOutsideCircle(reverseControlPointsMat, endAnchor, endZoneRadius);
24
- const tVal = 1.0 - reverseTVal;
25
- const splitCurves = splitBezierCurveAtTVal(curve, tVal);
26
- curve = splitCurves[0];
27
- }
28
- return curve;
29
- };
30
-
31
- module.exports.sinusodialBezierPathsForBezierPaths = function(controlPointPaths, waveLength, amplitude) {
32
- const [pointsOnCurve, tangentAnglesToPointsOnCurve] = evenlySpacedPointsOnCurveWithTangentAngles(
33
- controlPointPaths,
34
- waveLength / 2.0
35
- );
36
-
37
- const returnPaths = [];
38
- let normal_PI_inc = Math.PI / 2;
39
- let index = 0;
40
-
41
- while (index < pointsOnCurve.length - 4) {
42
- const beginPoint = pointsOnCurve[index];
43
- const midPoint = pointsOnCurve[index + 1];
44
- const endPoint = pointsOnCurve[index + 2];
45
- const midPointNormalAngle = tangentAnglesToPointsOnCurve[index + 1] + normal_PI_inc;
46
-
47
- const controlPoint = {
48
- x: midPoint.x + amplitude * Math.cos(midPointNormalAngle),
49
- y: midPoint.y + amplitude * Math.sin(midPointNormalAngle)
50
- };
51
-
52
- returnPaths.push([beginPoint, controlPoint, endPoint]);
53
- normal_PI_inc *= -1.0;
54
- index += 2;
55
- }
56
-
57
- const lastPoint = [...[...returnPaths].pop()].pop();
58
- if (lastPoint) {
59
- const lastCp = [...[...controlPointPaths].pop().controlPoints].pop();
60
- returnPaths.push([lastPoint, lastCp]);
61
- }
62
- return returnPaths;
63
- };
64
-
65
- module.exports.distanceBetweenPoints = function(point1, point2) {
66
- const xDist = point1.x - point2.x;
67
- const yDist = point1.y - point2.y;
68
- return Math.sqrt(xDist * xDist + yDist * yDist);
69
- };
70
-
71
- module.exports.splitBezierCurveAtTVal = splitBezierCurveAtTVal;
72
-
73
- function evenlySpacedPointsOnCurveWithTangentAngles(controlPointPaths, distanceBetweenPoints) {
74
- const returnPoints = [];
75
- const returnTangentAngles = [];
76
-
77
- controlPointPaths.forEach((linePath, pathIndex) => {
78
- const { controlPoints } = linePath;
79
- const helperMat = helperMatrixForDegree(controlPoints.length - 1);
80
- const tMat = preCalculatedTMatrixForDegree(controlPoints.length - 1);
81
- const controlPointsMat = controlPointsMatFromPoints(controlPoints);
82
- const testPoints = math.multiply(helperMat, controlPointsMat);
83
- const testPointsTangentRatiosMat = slopesOnCurveAtTVals(controlPointsMat, tMat);
84
- const distancesBetweenPoints = distanceBetweenPointsOnCurve(testPoints);
85
- if (pathIndex === 0) {
86
- const tpFirstRowVector0 = math.subset(testPointsTangentRatiosMat, math.index(0, [0]));
87
- const tpFirstRowVector1 = math.subset(testPointsTangentRatiosMat, math.index(0, [1]));
88
- returnTangentAngles.push(Math.atan2(tpFirstRowVector1, tpFirstRowVector0));
89
- returnPoints.push({ x: tpFirstRowVector0, y: tpFirstRowVector1 });
90
- }
91
-
92
- let currentDistance = 0.0;
93
- distancesBetweenPoints.forEach((dist, i) => {
94
- currentDistance += dist;
95
- if (currentDistance >= distanceBetweenPoints) {
96
- const tpAdjustedStartVectorX = math.subset(testPointsTangentRatiosMat, math.index(i, [0]));
97
- const tpAdjustedStartVectorY = math.subset(testPointsTangentRatiosMat, math.index(i, [1]));
98
- returnTangentAngles.push(Math.atan2(tpAdjustedStartVectorY, tpAdjustedStartVectorX));
99
- returnPoints.push({ x: tpAdjustedStartVectorX, y: tpAdjustedStartVectorY });
100
- currentDistance = 0.0;
101
- }
102
- });
103
- });
104
-
105
- return [returnPoints, returnTangentAngles];
106
- }
107
-
108
- function distanceBetweenPointsOnCurve(points) {
109
- // Creates a copy of the vector with points offset by 1 in order to calculate the relative distances between points
110
- const [pointsNumberOfRows] = points.size();
111
-
112
- const xPointsVector = [];
113
- points.forEach(value => xPointsVector.push(value));
114
-
115
- const oneOffSetXPoints = [...xPointsVector];
116
- oneOffSetXPoints.splice(0, 2);
117
- oneOffSetXPoints.push(xPointsVector[xPointsVector.length - 2]);
118
- oneOffSetXPoints.push(xPointsVector[xPointsVector.length - 1]);
119
-
120
- const yPointsVector = [...xPointsVector];
121
- yPointsVector.splice(0, 1);
122
-
123
- const oneOffSetYPoints = [...oneOffSetXPoints];
124
- oneOffSetYPoints.splice(0, 1);
125
-
126
- const xPointsVectorStrideAdjusted = [];
127
- const oneOffSetXPointsStrideAdjusted = [];
128
- const yPointsVectorStrideAdjusted = [];
129
- const oneOffSetYPointsStrideAdjusted = [];
130
- xPointsVector.forEach((p, index) => {
131
- if (!(index % 2)) xPointsVectorStrideAdjusted.push(p);
132
- });
133
- oneOffSetXPoints.forEach((p, index) => {
134
- if (!(index % 2)) oneOffSetXPointsStrideAdjusted.push(p);
135
- });
136
- yPointsVector.forEach((p, index) => {
137
- if (!(index % 2)) yPointsVectorStrideAdjusted.push(p);
138
- });
139
- oneOffSetYPoints.forEach((p, index) => {
140
- if (!(index % 2)) oneOffSetYPointsStrideAdjusted.push(p);
141
- });
142
-
143
- const distance = [];
144
- for (let n = 0; n < pointsNumberOfRows; ++n) {
145
- distance.push(
146
- Math.sqrt(
147
- (xPointsVectorStrideAdjusted[n] - oneOffSetXPointsStrideAdjusted[n]) ** 2 +
148
- (yPointsVectorStrideAdjusted[n] - oneOffSetYPointsStrideAdjusted[n]) ** 2
149
- )
150
- );
151
- }
152
- return distance;
153
- }
154
-
155
- function slopesOnCurveAtTVals(controlPointsMat, tVals) {
156
- const [cpMatNumberOfRows] = controlPointsMat.size();
157
-
158
- if (cpMatNumberOfRows === 2) {
159
- const xPoints = [];
160
- const yPoints = [];
161
-
162
- controlPointsMat.forEach((value, [, col]) => {
163
- switch (col) {
164
- case 0: {
165
- xPoints.push(value);
166
- break;
167
- }
168
- case 1: {
169
- yPoints.push(value);
170
- break;
171
- }
172
- default: {
173
- break;
174
- }
175
- }
176
- });
177
-
178
- const xDiff = xPoints[1] - xPoints[0];
179
- const yDiff = yPoints[1] - yPoints[0];
180
-
181
- const matrixRows = [];
182
- const [tValsNumberOfRows] = tVals.size();
183
- for (let i = 0; i < tValsNumberOfRows; i++) {
184
- matrixRows.push([xDiff, yDiff]);
185
- }
186
-
187
- return math.matrix(matrixRows);
188
- }
189
-
190
- let fixedMat = null;
191
- if (cpMatNumberOfRows === 3) {
192
- fixedMat = quadraticDerivativeMatrix();
193
- } else {
194
- fixedMat = cubicDerivativeMatrix();
195
- }
196
-
197
- console.log({ tVals, fixedMat, controlPointsMat });
198
-
199
- const slopeRatios = calculatedPointsOnCurve(tVals, controlPointsMat, fixedMat);
200
-
201
- console.log({ slopeRatios });
202
-
203
- return slopeRatios;
204
- }
205
-
206
- function calculatedPointsOnCurve(tValMatrix, controlPointsMatrix, fixedMatrix) {
207
- return math.multiply(tValMatrix, fixedMatrix, controlPointsMatrix);
208
- }
209
-
210
- function splitBezierCurveAtTVal(controlPoints, tVal) {
211
- switch (controlPoints.length) {
212
- case 2:
213
- return splitLinearBezierCurveAtTVal(controlPoints, tVal);
214
- case 3:
215
- return splitQuadraticCurveAtTVal(controlPoints, tVal);
216
- case 4:
217
- return splitCubicCurveAtTVal(controlPoints, tVal);
218
- default:
219
- return null;
220
- }
221
- }
222
-
223
- function linearPointAtTVal(controlPoints, tVal) {
224
- const [firstControlPoint] = controlPoints;
225
- const lastControlPoint = [...controlPoints].pop();
226
- const xt = firstControlPoint.x + (lastControlPoint.x - firstControlPoint.x) * tVal;
227
- const yt = firstControlPoint.y + (lastControlPoint.y - firstControlPoint.y) * tVal;
228
- return { y: yt, x: xt };
229
- }
230
-
231
- function splitLinearBezierCurveAtTVal(controlPoints, tVal) {
232
- // Comment from prev dev:
233
- // this could be faster by doing calculations directly.. but who cares
234
- const midPoint = linearPointAtTVal(controlPoints, tVal);
235
- return [
236
- [controlPoints[0], midPoint],
237
- [midPoint, [...controlPoints].pop()]
238
- ];
239
- }
240
-
241
- function splitQuadraticCurveAtTVal(controlPoints, tVal) {
242
- const firstTwoPoints = [controlPoints[0], controlPoints[1]];
243
- const lastTwoPoints = [controlPoints[1], controlPoints[2]];
244
- const control1 = linearPointAtTVal(firstTwoPoints, tVal);
245
- const control2 = linearPointAtTVal(lastTwoPoints, tVal);
246
- const breakPoint = linearPointAtTVal([control1, control2], tVal);
247
- return [
248
- [controlPoints[0], control1, breakPoint],
249
- [breakPoint, control2, controlPoints[2]]
250
- ];
251
- }
252
-
253
- function splitCubicCurveAtTVal(controlPoints, tVal) {
254
- const firstTwoPoints = [controlPoints[0], controlPoints[1]];
255
- const middleTwoPoints = [controlPoints[1], controlPoints[2]];
256
- const lastTwoPoints = [controlPoints[2], controlPoints[3]];
257
-
258
- const firstTwoMidPoint = linearPointAtTVal(firstTwoPoints, tVal);
259
- const middleTwoMidPoint = linearPointAtTVal(middleTwoPoints, tVal);
260
- const lastTwoMidPoint = linearPointAtTVal(lastTwoPoints, tVal);
261
-
262
- const midPoint123 = linearPointAtTVal([firstTwoMidPoint, middleTwoMidPoint], tVal);
263
- const midPoint234 = linearPointAtTVal([middleTwoMidPoint, lastTwoMidPoint], tVal);
264
- const breakPoint = linearPointAtTVal([midPoint123, midPoint234], tVal);
265
-
266
- return [
267
- [controlPoints[0], firstTwoMidPoint, midPoint123, breakPoint],
268
- [breakPoint, midPoint234, lastTwoMidPoint, controlPoints[3]]
269
- ];
270
- }
271
-
272
- function firstTValForPointOnCurveOutsideCircle(controlPointsMat, anchorPoint, radius) {
273
- const [numberOfRows] = controlPointsMat.size();
274
- const helperMat = helperMatrixForDegree(numberOfRows - 1);
275
- const pointsOnCurveMat = math.multiply(helperMat, controlPointsMat);
276
- const distances = distancesFromPointToPoints(anchorPoint, pointsOnCurveMat);
277
-
278
- // Comment from prev dev:
279
- // We're assuming that point 0 is the closest to the anchor point... So we could use a binary search here to save a bit of time
280
- // Chances are is that the tVal will actually be near the beginning however due to the way the function i used at this time
281
-
282
- let indexOfPoint = distances.length - 1;
283
- for (let i = 0; i < distances.length; i++) {
284
- if (distances[i] >= radius) {
285
- indexOfPoint = i;
286
- break;
287
- }
288
- }
289
-
290
- const tInc = 1.0 / sinusoidNumberOfPoints;
291
- return indexOfPoint * tInc;
292
- }
293
-
294
- function distancesFromPointToPoints(anchorPoint, pointsOnCurveMat) {
295
- const xPointAdjustFromOrigin = -anchorPoint.x;
296
- const yPointAdjustFromOrigin = -anchorPoint.y;
297
-
298
- const adjustedXPoints = [];
299
- const adjustedYPoints = [];
300
-
301
- pointsOnCurveMat.forEach((value, [, col]) => {
302
- switch (col) {
303
- case 0: {
304
- adjustedXPoints.push(value + xPointAdjustFromOrigin);
305
- break;
306
- }
307
- case 1: {
308
- adjustedYPoints.push(value + yPointAdjustFromOrigin);
309
- break;
310
- }
311
- default: {
312
- break;
313
- }
314
- }
315
- });
316
-
317
- const distances = [];
318
- for (let i = 0; i < adjustedXPoints.length; i++) {
319
- distances.push(Math.sqrt(adjustedXPoints[i] * adjustedXPoints[i] + adjustedYPoints[i] * adjustedYPoints[i]));
320
- }
321
- return distances;
322
- }
323
-
324
- function helperMatrixForDegree(degree) {
325
- switch (degree) {
326
- case 1: {
327
- return linearHelperMatrix();
328
- }
329
- case 2: {
330
- return quadraticHelperMatrix();
331
- }
332
- case 3: {
333
- return cubicHelperMatrix();
334
- }
335
- default: {
336
- return null;
337
- }
338
- }
339
- }
340
-
341
- function preCalculatedTMatrixForDegree(degree) {
342
- switch (degree) {
343
- case 1: {
344
- return linearTMatSinusoid();
345
- }
346
- case 2: {
347
- return quadraticTMatSinusoid();
348
- }
349
- case 3: {
350
- return cubicTMatSinusoid();
351
- }
352
- default: {
353
- return null;
354
- }
355
- }
356
- }
357
-
358
- function linearBezierMatrix() {
359
- return math.matrix([
360
- [1, 0],
361
- [-1, 1]
362
- ]);
363
- }
364
-
365
- function quadraticBezierMatrix() {
366
- return math.matrix([
367
- [1, 0, 0],
368
- [-2, 2, 0],
369
- [1, -2, 1]
370
- ]);
371
- }
372
-
373
- function cubicBezierMatrix() {
374
- return math.matrix([
375
- [1, 0, 0, 0],
376
- [-3, 3, 0, 0],
377
- [3, -6, 3, 0],
378
- [-1, 3, -3, 1]
379
- ]);
380
- }
381
-
382
- function cubicDerivativeMatrix() {
383
- return math.matrix([
384
- [-3, 3, 0, 0],
385
- [6, -12, 6, 0],
386
- [-3, 9, -9, 3],
387
- [0, 0, 0, 0]
388
- ]);
389
- }
390
-
391
- function quadraticDerivativeMatrix() {
392
- return math.matrix([
393
- [-2, 2, 0],
394
- [2, -4, 2],
395
- [0, 0, 0]
396
- ]);
397
- }
398
-
399
- function linearHelperMatrix() {
400
- return math.multiply(linearTMatSinusoid(), linearBezierMatrix());
401
- }
402
-
403
- function quadraticHelperMatrix() {
404
- return math.multiply(quadraticTMatSinusoid(), quadraticBezierMatrix());
405
- }
406
- function cubicHelperMatrix() {
407
- return math.multiply(cubicTMatSinusoid(), cubicBezierMatrix());
408
- }
409
-
410
- function linearTMatSinusoid() {
411
- return tMatrixForEvenlyDistributedTValues(sinusoidNumberOfPoints, 1);
412
- }
413
-
414
- function quadraticTMatSinusoid() {
415
- return tMatrixForEvenlyDistributedTValues(sinusoidNumberOfPoints, 2);
416
- }
417
-
418
- function cubicTMatSinusoid() {
419
- return tMatrixForEvenlyDistributedTValues(sinusoidNumberOfPoints, 3);
420
- }
421
-
422
- function tMatrixForEvenlyDistributedTValues(numberOfPoints, degreeOfCurve) {
423
- const increment = 1.0 / numberOfPoints;
424
- let tVal = 0;
425
- const returnArray = math.ones(numberOfPoints + 1, degreeOfCurve + 1).map((value, [, col]) => {
426
- let resVal = null;
427
- switch (col) {
428
- case 0: {
429
- resVal = 1.0;
430
- break;
431
- }
432
- case 1: {
433
- resVal = tVal;
434
- break;
435
- }
436
- case 2: {
437
- resVal = tVal * tVal;
438
- break;
439
- }
440
- case 3: {
441
- resVal = tVal * tVal * tVal;
442
- break;
443
- }
444
- default: {
445
- break;
446
- }
447
- }
448
- tVal += increment;
449
- return resVal;
450
- });
451
-
452
- return math.matrix(returnArray);
453
- }
454
-
455
- function controlPointsMatFromPoints(controlPoints) {
456
- const controlPointsVec = controlPoints.map(cp => {
457
- return [cp.x, cp.y];
458
- });
459
- return math.matrix(controlPointsVec);
460
- }
461
-
462
- module.exports.bezierBoundingBox = function(controlPoints) {
463
- if (![2, 4].includes(controlPoints.length)) {
464
- throw new Error('bezierBoundingBox function supports only linear and cubic bezier curves for now');
465
- }
466
-
467
- const bMinMax = controlPoints.length === 2 ? linearBezierMinMax(controlPoints) : cubicBezierMinMax(controlPoints);
468
-
469
- // Extend bounding box for straight lines
470
- const yAxisOffset = controlPoints.length === 2 ? 1 : 0;
471
-
472
- return [
473
- {
474
- x: bMinMax.min.x,
475
- y: bMinMax.min.y - yAxisOffset
476
- },
477
- {
478
- x: bMinMax.max.x,
479
- y: bMinMax.min.y - yAxisOffset
480
- },
481
- {
482
- x: bMinMax.max.x,
483
- y: bMinMax.max.y + yAxisOffset
484
- },
485
- {
486
- x: bMinMax.min.x,
487
- y: bMinMax.max.y + yAxisOffset
488
- }
489
- ];
490
- };
491
-
492
- function linearBezierMinMax([p0, p1]) {
493
- const xValues = [p0.x, p1.x];
494
- const yValues = [p0.y, p1.y];
495
- return {
496
- min: { x: Math.min.apply(0, xValues), y: Math.min.apply(0, yValues) },
497
- max: { x: Math.max.apply(0, xValues), y: Math.max.apply(0, yValues) }
498
- };
499
- }
500
-
501
- function cubicBezierMinMax([p0, p1, p2, p3]) {
502
- const tValues = [];
503
- const xValues = [];
504
- const yValues = [];
505
- let a;
506
- let b;
507
- let c;
508
- let t;
509
- let t1;
510
- let t2;
511
- let b2ac;
512
- let sqrtb2ac;
513
- for (let i = 0; i < 2; ++i) {
514
- if (i === 0) {
515
- b = 6 * p0.x - 12 * p1.x + 6 * p2.x;
516
- a = -3 * p0.x + 9 * p1.x - 9 * p2.x + 3 * p3.x;
517
- c = 3 * p1.x - 3 * p0.x;
518
- } else {
519
- b = 6 * p0.y - 12 * p1.y + 6 * p2.y;
520
- a = -3 * p0.y + 9 * p1.y - 9 * p2.y + 3 * p3.y;
521
- c = 3 * p1.y - 3 * p0.y;
522
- }
523
- if (Math.abs(a) < 1e-12) {
524
- if (Math.abs(b) < 1e-12) {
525
- continue;
526
- }
527
- t = -c / b;
528
- if (t > 0 && t < 1) {
529
- tValues.push(t);
530
- }
531
- continue;
532
- }
533
- b2ac = b * b - 4 * c * a;
534
- if (b2ac < 0) {
535
- if (Math.abs(b2ac) < 1e-12) {
536
- t = -b / (2 * a);
537
- if (t > 0 && t < 1) {
538
- tValues.push(t);
539
- }
540
- }
541
- continue;
542
- }
543
- sqrtb2ac = Math.sqrt(b2ac);
544
- t1 = (-b + sqrtb2ac) / (2 * a);
545
- if (t1 > 0 && t1 < 1) {
546
- tValues.push(t1);
547
- }
548
- t2 = (-b - sqrtb2ac) / (2 * a);
549
- if (t2 > 0 && t2 < 1) {
550
- tValues.push(t2);
551
- }
552
- }
553
-
554
- let j = tValues.length;
555
- let mt;
556
- while (j--) {
557
- t = tValues[j];
558
- mt = 1 - t;
559
- xValues[j] = mt * mt * mt * p0.x + 3 * mt * mt * t * p1.x + 3 * mt * t * t * p2.x + t * t * t * p3.x;
560
- yValues[j] = mt * mt * mt * p0.y + 3 * mt * mt * t * p1.y + 3 * mt * t * t * p2.y + t * t * t * p3.y;
561
- }
562
-
563
- xValues.push(p0.x, p3.x);
564
- yValues.push(p0.y, p3.y);
565
-
566
- return {
567
- min: { x: Math.min.apply(0, xValues), y: Math.min.apply(0, yValues) },
568
- max: { x: Math.max.apply(0, xValues), y: Math.max.apply(0, yValues) }
569
- };
570
- }
@@ -1,20 +0,0 @@
1
- class Model {
2
- constructor(data) {
3
- this.originalData = JSON.parse(JSON.stringify(data));
4
- this.adjustedData = JSON.parse(JSON.stringify(data));
5
- }
6
-
7
- _getAttrOriginal(attr) {
8
- return typeof this.originalData[attr] !== 'undefined' ? this.originalData[attr] : null;
9
- }
10
-
11
- _getAttr(attr) {
12
- return typeof this.adjustedData[attr] !== 'undefined' ? this.adjustedData[attr] : null;
13
- }
14
-
15
- _setAttr(attr, value) {
16
- this.adjustedData[attr] = value;
17
- }
18
- }
19
-
20
- module.exports = Model;
@@ -1,31 +0,0 @@
1
- module.exports = {
2
- useDefaults: function(options = {}) {
3
- const defaults = {
4
- width: 300,
5
- lineColor: '#fff', // courtBorderColor
6
- linesDisplay: true,
7
- linesDisplayOnMoveOnly: true,
8
- linesHiddenIds: [],
9
- linesSelectedIds: [],
10
- shapeSelectedId: null,
11
- noteSelectedId: null,
12
- playersHiddenPositions: [],
13
- background: '',
14
- watermark: null,
15
- mirror: false,
16
- speed: 1,
17
- position: null,
18
- huddleMode: false,
19
- magnetMode: false,
20
- flipPlayerLabels: false,
21
- legacyPrintStyle: false,
22
- playerTokenScale: 1,
23
- // TODO: refactor NBA court type constants below
24
- showHalfCourtCircle: true
25
- };
26
- return {
27
- ...defaults,
28
- ...options
29
- };
30
- }
31
- };
@@ -1,91 +0,0 @@
1
- const _ = require('lodash');
2
- const { loadImage } = require('canvas');
3
- const playerHatsConfig = require('../playerHatsConfig');
4
- const shapesConfig = require('../shapesConfig');
5
- const { useDefaults } = require('./Play/Options');
6
- const {
7
- SPORT_TYPE_BASKETBALL,
8
- SPORT_TYPE_VOLLEYBALL,
9
- SPORT_TYPE_FOOTBALL,
10
- SPORT_TYPE_LACROSSE,
11
- SPORT_TYPE_SOCCER,
12
- SPORT_TYPE_HOCKEY,
13
- SPORT_TYPE_BASEBALL
14
- } = require('../constants');
15
-
16
- const STORAGE_URL = 'https://playbooksstore.blob.core.windows.net/public';
17
- const LUCEOSPORTS_WATERMARK_PATH = 'partners/LuceoSports/luceo-sports-logo-powered-by-sm.png';
18
-
19
- class Play {
20
- constructor(data, options = {}) {
21
- this.name = data.name;
22
- this.options = useDefaults(options);
23
- this.setPlayData(data.playData);
24
- }
25
-
26
- static async init({ teamLogoPath = '' } = {}) {
27
- Play.playerHats = await playerHatsConfig();
28
- Play.shapes = await shapesConfig();
29
-
30
- const hardwoodImageData = require('../assets/wood_bg.png');
31
- const hardwoodImage = await loadImage(hardwoodImageData);
32
- const grassImageData = require('../assets/grass_bg.png');
33
- const grassImage = await loadImage(grassImageData);
34
- const iceImageData = require('../assets/ice_bg.png');
35
- const iceImage = await loadImage(iceImageData);
36
-
37
- Play.backgroundOptions = {
38
- Hardwood: hardwoodImage,
39
- [SPORT_TYPE_BASKETBALL]: hardwoodImage,
40
- [SPORT_TYPE_VOLLEYBALL]: hardwoodImage,
41
- [SPORT_TYPE_FOOTBALL]: grassImage,
42
- [SPORT_TYPE_LACROSSE]: grassImage,
43
- [SPORT_TYPE_SOCCER]: grassImage,
44
- [SPORT_TYPE_HOCKEY]: iceImage,
45
- [SPORT_TYPE_BASEBALL]: grassImage
46
- };
47
-
48
- const luceoSportsWatermark = await loadImage(`${STORAGE_URL}/${LUCEOSPORTS_WATERMARK_PATH}`);
49
- const teamLogoWatermark = teamLogoPath ? await loadImage(`${STORAGE_URL}/${teamLogoPath}`) : null;
50
- Play.watermark = {
51
- LuceoSports: luceoSportsWatermark,
52
- TeamLogo: teamLogoWatermark
53
- };
54
- }
55
-
56
- get totalPhasesCount() {
57
- const distinctPhases = _.uniq(_.map(this.playData.lines, 'phase'));
58
- return distinctPhases.length || 1;
59
- }
60
-
61
- get scale() {
62
- return this.options.width / this.playData.court.courtRect.size.width;
63
- }
64
-
65
- get width() {
66
- return this.options.width;
67
- }
68
-
69
- get height() {
70
- return Math.ceil(this.playData.court.courtRect.size.height * this.scale);
71
- }
72
-
73
- get staticData() {
74
- return {
75
- backgroundOptions: Play.backgroundOptions,
76
- watermark: Play.watermark,
77
- playerHats: Play.playerHats,
78
- shapes: Play.shapes
79
- };
80
- }
81
-
82
- setOptions(options) {
83
- this.options = { ...this.options, ...options };
84
- }
85
-
86
- setPlayData(playData) {
87
- this.playData = playData;
88
- }
89
- }
90
-
91
- module.exports = Play;