@luceosports/play-rendering 1.12.5 → 1.13.1

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 (60) hide show
  1. package/dist/play-rendering.js +3 -3
  2. package/dist/play-rendering.js.map +1 -1
  3. package/index.js +2 -1
  4. package/package.json +1 -1
  5. package/src/constants.js +19 -19
  6. package/src/layers/CourtLayer.js +8 -4
  7. package/src/layers/base/BaseLayer.js +7 -2
  8. package/src/layers/court/base/InternalCourtLayer.js +7 -0
  9. package/src/layers/court/index.js +48 -6
  10. package/src/layers/court/layers/BASKETBALL/common/LaneMarkingNBATrait.js +34 -0
  11. package/src/layers/court/layers/BASKETBALL/common/LaneMarkingNCAATrait.js +30 -0
  12. package/src/layers/court/layers/BASKETBALL/constants.js +7 -0
  13. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/constants.js +13 -0
  14. package/src/layers/court/layers/{NBA → BASKETBALL/courtTypes/BIG3/layers}/Big3Layer.js +4 -9
  15. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/LaneMarkingLayer.js +12 -0
  16. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/constants.js +13 -0
  17. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/layers/LaneMarkingLayer.js +38 -0
  18. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/constants.js +13 -0
  19. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/LaneMarkingLayer.js +12 -0
  20. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/constants.js +13 -0
  21. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/LaneMarkingLayer.js +12 -0
  22. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/constants.js +13 -0
  23. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/LaneMarkingLayer.js +12 -0
  24. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/constants.js +13 -0
  25. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/LaneMarkingLayer.js +12 -0
  26. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/constants.js +13 -0
  27. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/LaneMarkingLayer.js +12 -0
  28. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/constants.js +13 -0
  29. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/LaneMarkingLayer.js +12 -0
  30. package/src/layers/court/layers/{NBA → BASKETBALL/layers}/BaseLineMarkingLayer.js +8 -5
  31. package/src/layers/court/layers/{NBA → BASKETBALL/layers}/BenchAreaLayer.js +6 -4
  32. package/src/layers/court/layers/BASKETBALL/layers/BorderRectLayer.js +12 -0
  33. package/src/layers/court/layers/BASKETBALL/layers/CenterCircleLayer.js +21 -0
  34. package/src/layers/court/layers/BASKETBALL/layers/CenterLineLayer.js +16 -0
  35. package/src/layers/court/layers/{NBA → BASKETBALL/layers}/FreeThrowLayer.js +5 -3
  36. package/src/layers/court/layers/BASKETBALL/layers/HoopLayer.js +26 -0
  37. package/src/layers/court/layers/BASKETBALL/layers/InnerOuterRectLayer.js +24 -0
  38. package/src/layers/court/layers/{NBA → BASKETBALL/layers}/RestrictedAreaLayer.js +6 -5
  39. package/src/layers/court/layers/BASKETBALL/layers/ThreePointLineLayer.js +42 -0
  40. package/src/layers/court/layers/FOOTBALL/constants.js +9 -0
  41. package/src/layers/court/layers/FOOTBALL/courtTypes/HIGH_SCHOOL_FOOTBALL/constants.js +3 -0
  42. package/src/layers/court/layers/FOOTBALL/layers/BorderRectLayer.js +12 -0
  43. package/src/layers/court/layers/FOOTBALL/layers/CenterLineLayer.js +16 -0
  44. package/src/layers/court/layers/FOOTBALL/{EndZoneLayer.js → layers/EndZoneLayer.js} +3 -6
  45. package/src/layers/court/layers/FOOTBALL/{FieldNumberLayer.js → layers/FieldNumberLayer.js} +4 -7
  46. package/src/layers/court/layers/FOOTBALL/{HashMarkLayer.js → layers/HashMarkLayer.js} +11 -13
  47. package/src/layers/court/layers/FOOTBALL/layers/YardLineLayer.js +23 -0
  48. package/src/models/Frame.js +21 -2
  49. package/src/models/Play/Options.js +0 -1
  50. package/src/models/Play.js +3 -3
  51. package/src/layers/court/layers/FOOTBALL/BorderRectLayer.js +0 -15
  52. package/src/layers/court/layers/FOOTBALL/CenterLineLayer.js +0 -19
  53. package/src/layers/court/layers/FOOTBALL/YardLineLayer.js +0 -25
  54. package/src/layers/court/layers/NBA/BorderRectLayer.js +0 -15
  55. package/src/layers/court/layers/NBA/CenterCircleLayer.js +0 -21
  56. package/src/layers/court/layers/NBA/CenterLineLayer.js +0 -19
  57. package/src/layers/court/layers/NBA/HoopLayer.js +0 -24
  58. package/src/layers/court/layers/NBA/InnerOuterRectLayer.js +0 -26
  59. package/src/layers/court/layers/NBA/LaneMarkingLayer.js +0 -65
  60. package/src/layers/court/layers/NBA/ThreePointLineLayer.js +0 -35
package/index.js CHANGED
@@ -8,4 +8,5 @@ module.exports.Shape = require('./src/models/Shape');
8
8
  module.exports.ShapeModels = require('./src/models/ShapeModels');
9
9
  module.exports.LineDrawingMath = require('./src/math/LineDrawingMath');
10
10
  module.exports.Bezier = require('./src/math/Bezier').Bezier;
11
- module.exports.CourtTypeConstants = require('./src/constants');
11
+ module.exports.CourtTypeConstants = require('./src/layers/court').courtTypeConstants;
12
+ module.exports.Constants = require('./src/constants');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luceosports/play-rendering",
3
- "version": "1.12.5",
3
+ "version": "1.13.1",
4
4
  "description": "",
5
5
  "main": "dist/play-rendering.js",
6
6
  "scripts": {
package/src/constants.js CHANGED
@@ -1,21 +1,21 @@
1
1
  module.exports = Object.freeze({
2
- NBA: {
3
- COURT_LINE_WIDTH: 0.1667,
4
- COURT_RECT_WIDTH: 50.0,
5
- COURT_RECT_HEIGHT: 94.0,
6
- PLAYER_TOKEN_RADIUS: 1.5,
7
- PLAYER_TOKEN_SCALE: 1,
8
- LINE_WIDTH: 0.33,
9
- LINE_MASKING: true
10
- },
11
- FOOTBALL: {
12
- COURT_LINE_WIDTH: 0.32,
13
- COURT_RECT_WIDTH: 160.0,
14
- COURT_RECT_HEIGHT: 360.0,
15
- END_ZONE_HEIGHT: 30,
16
- PLAYER_TOKEN_RADIUS: 1.5,
17
- PLAYER_TOKEN_SCALE: 2,
18
- LINE_WIDTH: 0.55,
19
- LINE_MASKING: false
20
- }
2
+ SPORT_TYPE_BASKETBALL: 'BASKETBALL',
3
+ SPORT_TYPE_FOOTBALL: 'FOOTBALL',
4
+
5
+ COURT_TYPE_NBA: 'NBA',
6
+ COURT_TYPE_HIGH_SCHOOL_FOOTBALL: 'HIGH_SCHOOL_FOOTBALL',
7
+ COURT_TYPE_HIGH_SCHOOL_FOOTBALL_LEGACY: 'FOOTBALL',
8
+
9
+ SHAPE_TYPE_CIRCLE: 'CIRCLE',
10
+ SHAPE_TYPE_SQUARE: 'SQUARE',
11
+ SHAPE_TYPE_TRIANGLE: 'TRIANGLE',
12
+ SHAPE_TYPE_FOV: 'FOV',
13
+ SHAPE_TYPE_XMARK: 'XMARK',
14
+ SHAPE_TYPE_STRAIGHT: 'STRAIGHT',
15
+ SHAPE_TYPE_CONE: 'CONE',
16
+ SHAPE_TYPE_LINE_CUT: 'LINE.CUT',
17
+ SHAPE_TYPE_LINE_SCREEN: 'LINE.SCREEN',
18
+ SHAPE_TYPE_LINE_DRIBBLE: 'LINE.DRIBBLE',
19
+ SHAPE_TYPE_LINE_PASS: 'LINE.PASS',
20
+ SHAPE_TYPE_LINE_HANDOFF: 'LINE.HANDOFF'
21
21
  });
@@ -1,5 +1,5 @@
1
1
  const BaseLayer = require('./base/BaseLayer');
2
- const courtLayers = require('./court');
2
+ const { sportLayers, courtTypeLayers } = require('./court');
3
3
 
4
4
  class CourtLayer extends BaseLayer {
5
5
  get frameWidth() {
@@ -15,12 +15,15 @@ class CourtLayer extends BaseLayer {
15
15
  }
16
16
 
17
17
  get courtTypeLayers() {
18
- if (!courtLayers[this.playData.court.type]) throw new Error('unknown court type');
19
- return courtLayers[this.playData.court.type];
18
+ if (!sportLayers[this.playData.sport]) throw new Error('unknown sport type layer');
19
+ return {
20
+ ...sportLayers[this.playData.sport],
21
+ ...((courtTypeLayers[this.playData.sport] || {})[this.playData.court.type] || {})
22
+ };
20
23
  }
21
24
 
22
25
  get background() {
23
- return this.options.background || this.playData.court.type;
26
+ return this.options.background || this.playData.sport;
24
27
  }
25
28
 
26
29
  apply() {
@@ -50,6 +53,7 @@ class CourtLayer extends BaseLayer {
50
53
  setColor() {
51
54
  const courtBorderColor = this.options.lineColor || '#fff';
52
55
  this.ctx.strokeStyle = courtBorderColor;
56
+ this.ctx.fillStyle = courtBorderColor;
53
57
  }
54
58
 
55
59
  setBackground() {
@@ -1,4 +1,4 @@
1
- const constants = require('../../constants');
1
+ const { sportConstants, courtTypeConstants } = require('../court');
2
2
 
3
3
  class BaseLayer {
4
4
  constructor(ctx, playData) {
@@ -8,7 +8,12 @@ class BaseLayer {
8
8
  }
9
9
 
10
10
  get courtTypeConstants() {
11
- return constants[this.playData.court.type];
11
+ if (!sportConstants[this.playData.sport]) throw new Error('unknown sport type constants');
12
+ if (!courtTypeConstants[this.playData.court.type]) throw new Error('unknown court type constants');
13
+ return {
14
+ ...sportConstants[this.playData.sport],
15
+ ...courtTypeConstants[this.playData.court.type]
16
+ };
12
17
  }
13
18
  }
14
19
 
@@ -1,6 +1,13 @@
1
1
  const InternalBaseLayer = require('../../base/InternalBaseLayer');
2
2
 
3
3
  class InternalCourtLayer extends InternalBaseLayer {
4
+ get courtCenter() {
5
+ return {
6
+ x: this.courtTypeConstants.COURT_RECT_WIDTH / 2,
7
+ y: this.courtTypeConstants.COURT_RECT_HEIGHT / 2
8
+ };
9
+ }
10
+
4
11
  apply() {
5
12
  super.apply();
6
13
 
@@ -1,13 +1,55 @@
1
1
  // require all modules on the path and with the pattern defined
2
2
  const req = require.context('./layers/', true, /.js$/);
3
3
 
4
- const modules = {};
4
+ const sportLayers = {};
5
+ const courtTypeLayers = {};
6
+ const sportConstants = {};
7
+ const courtTypeConstants = {};
5
8
 
6
9
  req.keys().forEach(key => {
7
- const mPath = key.replace('./', '').replace('.js', '');
8
- const [mType, mName] = mPath.split('/');
9
- if (!modules[mType]) modules[mType] = {};
10
- modules[mType][mName] = req(key);
10
+ if (key.match(/layers\//)) {
11
+ return processLayers(key);
12
+ }
13
+ processConstants(key);
11
14
  });
12
15
 
13
- module.exports = modules;
16
+ function processLayers(key) {
17
+ if (key.match(/\/courtTypes\//)) {
18
+ const mPath = key
19
+ .replace('./', '')
20
+ .replace('/courtTypes', '')
21
+ .replace('/layers', '')
22
+ .replace('.js', '');
23
+ const [sportName, courtType, mName] = mPath.split('/');
24
+ if (!courtTypeLayers[sportName]) courtTypeLayers[sportName] = {};
25
+ if (!courtTypeLayers[sportName][courtType]) courtTypeLayers[sportName][courtType] = {};
26
+ courtTypeLayers[sportName][courtType][mName] = req(key);
27
+ return;
28
+ }
29
+ const mPath = key
30
+ .replace('./', '')
31
+ .replace('/layers', '')
32
+ .replace('.js', '');
33
+ const [sportName, mName] = mPath.split('/');
34
+ if (!sportLayers[sportName]) sportLayers[sportName] = {};
35
+ sportLayers[sportName][mName] = req(key);
36
+ }
37
+
38
+ function processConstants(key) {
39
+ if (key.match(/\/courtTypes\//)) {
40
+ const mPath = key
41
+ .replace('./', '')
42
+ .replace('/courtTypes', '')
43
+ .replace('/constants.js', '');
44
+ const [, courtType] = mPath.split('/');
45
+ courtTypeConstants[courtType] = req(key);
46
+ return;
47
+ }
48
+ const mPath = key.replace('./', '').replace('/constants.js', '');
49
+ const [sportName, courtType] = mPath.split('/');
50
+ if (!courtType) {
51
+ sportConstants[sportName] = req(key);
52
+ }
53
+ }
54
+
55
+ module.exports = { sportLayers, courtTypeLayers, sportConstants, courtTypeConstants };
@@ -0,0 +1,34 @@
1
+ const COURT_INNER_MARK_OFFSET = 5;
2
+
3
+ module.exports = {
4
+ drawLogic() {
5
+ const courtMarkingWidth = 0.667;
6
+ const courtOuterRectOffset = this.courtTypeConstants.FREE_THROW_OUTER_WIDTH / 2;
7
+ const courtOuterRectLeftX = this.courtCenter.x - courtOuterRectOffset;
8
+ const courtOuterRectRightX = this.courtCenter.x + courtOuterRectOffset;
9
+ const courtInnerMarkLeftX = this.courtCenter.x - COURT_INNER_MARK_OFFSET;
10
+ const courtInnerMarkRightX = this.courtCenter.x + COURT_INNER_MARK_OFFSET;
11
+
12
+ [7.0, 8.0, 11.0, 14.0].forEach(y => {
13
+ this.ctx.beginPath();
14
+
15
+ this.ctx.moveTo(courtOuterRectLeftX, y);
16
+ this.ctx.lineTo(courtOuterRectLeftX - courtMarkingWidth, y);
17
+
18
+ this.ctx.moveTo(courtOuterRectRightX, y);
19
+ this.ctx.lineTo(courtOuterRectRightX + courtMarkingWidth, y);
20
+
21
+ this.ctx.stroke();
22
+ });
23
+
24
+ this.ctx.beginPath();
25
+ this.ctx.moveTo(courtInnerMarkLeftX, 13.0);
26
+ this.ctx.lineTo(courtInnerMarkLeftX + 0.5, 13.0);
27
+ this.ctx.stroke();
28
+
29
+ this.ctx.beginPath();
30
+ this.ctx.moveTo(courtInnerMarkRightX, 13.0);
31
+ this.ctx.lineTo(courtInnerMarkRightX - 0.5, 13.0);
32
+ this.ctx.stroke();
33
+ }
34
+ };
@@ -0,0 +1,30 @@
1
+ module.exports = {
2
+ drawLogic() {
3
+ const courtMarkingWidth = 0.667;
4
+ const courtOuterRectOffset = this.courtTypeConstants.FREE_THROW_OUTER_WIDTH / 2;
5
+ const courtOuterRectLeftX = this.courtCenter.x - courtOuterRectOffset;
6
+ const courtOuterRectRightX = this.courtCenter.x + courtOuterRectOffset;
7
+
8
+ [11.0, 14.0, 17.0].forEach(y => {
9
+ this.ctx.beginPath();
10
+
11
+ this.ctx.moveTo(courtOuterRectLeftX, y);
12
+ this.ctx.lineTo(courtOuterRectLeftX - courtMarkingWidth, y);
13
+
14
+ this.ctx.moveTo(courtOuterRectRightX, y);
15
+ this.ctx.lineTo(courtOuterRectRightX + courtMarkingWidth, y);
16
+
17
+ this.ctx.stroke();
18
+ });
19
+
20
+ this.ctx.beginPath();
21
+ this.ctx.rect(courtOuterRectLeftX, 7.0, -1.2, 0.8);
22
+ this.ctx.fill();
23
+ this.ctx.stroke();
24
+
25
+ this.ctx.beginPath();
26
+ this.ctx.rect(courtOuterRectRightX, 7.0, 1.2, 0.8);
27
+ this.ctx.fill();
28
+ this.ctx.stroke();
29
+ }
30
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = Object.freeze({
2
+ COURT_LINE_WIDTH: 0.1667,
3
+ PLAYER_TOKEN_RADIUS: 1.5,
4
+ PLAYER_TOKEN_SCALE: 1,
5
+ LINE_WIDTH: 0.33,
6
+ LINE_MASKING: true
7
+ });
@@ -0,0 +1,13 @@
1
+ module.exports = Object.freeze({
2
+ COURT_RECT_WIDTH: 50.0,
3
+ COURT_RECT_HEIGHT: 94.0,
4
+ HOOP_CORNER_DISTANCE: 22,
5
+ THREE_POINT_ARC_RADIUS: 23.6762,
6
+ THREE_POINT_ASIN_APPROX: 10.0,
7
+ THREE_POINT_OFFSET_ORIGIN_Y_APPROX: 14.0,
8
+ FREE_THROW_INNER_WIDTH: 12.0,
9
+ FREE_THROW_OUTER_WIDTH: 16.0,
10
+ FREE_THROW_INNER_DASHED_CIRCLE: true,
11
+ CENTER_INNER_CIRCLE: true,
12
+ BENCH_MARKING: true
13
+ });
@@ -1,22 +1,17 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
- const {
3
- NBA: { COURT_RECT_WIDTH, COURT_LINE_WIDTH }
4
- } = require('../../../../constants');
1
+ const InternalCourtLayer = require('../../../../../base/InternalCourtLayer');
5
2
 
6
3
  class Big3Layer extends InternalCourtLayer {
7
4
  drawLogic() {
8
- if (!this.options.big3) return;
9
-
10
5
  const fontSize = 4;
11
6
  const textHorizontalOffset = 1.1;
12
7
  const textVerticalOffset = 1.4;
13
8
 
14
- const courtHoopCenter = { x: 25.0, y: 5.25 };
9
+ const courtHoopCenter = { x: this.courtCenter.x, y: 5.25 };
15
10
  const distance = 30;
16
11
  const theta = 40;
17
12
  const radius = 2;
18
13
 
19
- const centerPoint = { x: COURT_RECT_WIDTH / 2, y: courtHoopCenter.y + distance };
14
+ const centerPoint = { x: this.courtCenter.x, y: courtHoopCenter.y + distance };
20
15
  const leftPoint = {
21
16
  x: courtHoopCenter.x - distance * Math.cos((Math.PI * (90 - theta)) / 180.0),
22
17
  y: courtHoopCenter.y + distance * Math.sin((Math.PI * (90 - theta)) / 180.0)
@@ -28,7 +23,7 @@ class Big3Layer extends InternalCourtLayer {
28
23
 
29
24
  const big3 = [leftPoint, centerPoint, rightPoint];
30
25
 
31
- this.ctx.lineWidth = COURT_LINE_WIDTH * 3;
26
+ this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH * 3;
32
27
  this.ctx.font = `${fontSize}px Helvetica`;
33
28
 
34
29
  big3.forEach(point => {
@@ -0,0 +1,12 @@
1
+ const InternalCourtLayer = require('../../../../../base/InternalCourtLayer');
2
+ const LaneMarkingNBATrait = require('../../../common/LaneMarkingNBATrait');
3
+
4
+ class LaneMarkingLayer extends InternalCourtLayer {
5
+ reflection() {
6
+ return true;
7
+ }
8
+ }
9
+
10
+ Object.assign(LaneMarkingLayer.prototype, LaneMarkingNBATrait);
11
+
12
+ module.exports = LaneMarkingLayer;
@@ -0,0 +1,13 @@
1
+ module.exports = Object.freeze({
2
+ COURT_RECT_WIDTH: 49.21,
3
+ COURT_RECT_HEIGHT: 91.86,
4
+ HOOP_CORNER_DISTANCE: 21.65,
5
+ THREE_POINT_ARC_RADIUS: 22.15,
6
+ THREE_POINT_ASIN_APPROX: 6.0,
7
+ THREE_POINT_OFFSET_ORIGIN_Y_APPROX: 8.0,
8
+ FREE_THROW_INNER_WIDTH: 12.0,
9
+ FREE_THROW_OUTER_WIDTH: 16.08,
10
+ FREE_THROW_INNER_DASHED_CIRCLE: false,
11
+ CENTER_INNER_CIRCLE: false,
12
+ BENCH_MARKING: false
13
+ });
@@ -0,0 +1,38 @@
1
+ const InternalCourtLayer = require('../../../../../base/InternalCourtLayer');
2
+
3
+ class LaneMarkingLayer extends InternalCourtLayer {
4
+ reflection() {
5
+ return true;
6
+ }
7
+
8
+ drawLogic() {
9
+ const courtMarkingWidth = 0.333;
10
+ const courtOuterRectOffset = this.courtTypeConstants.FREE_THROW_OUTER_WIDTH / 2;
11
+ const courtOuterRectLeftX = this.courtCenter.x - courtOuterRectOffset;
12
+ const courtOuterRectRightX = this.courtCenter.x + courtOuterRectOffset;
13
+
14
+ [5.9, 13.6, 16.5].forEach(y => {
15
+ this.ctx.beginPath();
16
+
17
+ this.ctx.moveTo(courtOuterRectLeftX, y);
18
+ this.ctx.lineTo(courtOuterRectLeftX - courtMarkingWidth, y);
19
+
20
+ this.ctx.moveTo(courtOuterRectRightX, y);
21
+ this.ctx.lineTo(courtOuterRectRightX + courtMarkingWidth, y);
22
+
23
+ this.ctx.stroke();
24
+ });
25
+
26
+ this.ctx.beginPath();
27
+ this.ctx.rect(courtOuterRectLeftX, 8.8, -courtMarkingWidth, 1.9);
28
+ this.ctx.fill();
29
+ this.ctx.stroke();
30
+
31
+ this.ctx.beginPath();
32
+ this.ctx.rect(courtOuterRectRightX, 8.8, courtMarkingWidth, 1.9);
33
+ this.ctx.fill();
34
+ this.ctx.stroke();
35
+ }
36
+ }
37
+
38
+ module.exports = LaneMarkingLayer;
@@ -0,0 +1,13 @@
1
+ module.exports = Object.freeze({
2
+ COURT_RECT_WIDTH: 50.0,
3
+ COURT_RECT_HEIGHT: 94.0,
4
+ HOOP_CORNER_DISTANCE: 22,
5
+ THREE_POINT_ARC_RADIUS: 23.6762,
6
+ THREE_POINT_ASIN_APPROX: 10.0,
7
+ THREE_POINT_OFFSET_ORIGIN_Y_APPROX: 14.0,
8
+ FREE_THROW_INNER_WIDTH: 12.0,
9
+ FREE_THROW_OUTER_WIDTH: 16.0,
10
+ FREE_THROW_INNER_DASHED_CIRCLE: true,
11
+ CENTER_INNER_CIRCLE: true,
12
+ BENCH_MARKING: true
13
+ });
@@ -0,0 +1,12 @@
1
+ const InternalCourtLayer = require('../../../../../base/InternalCourtLayer');
2
+ const LaneMarkingNBATrait = require('../../../common/LaneMarkingNBATrait');
3
+
4
+ class LaneMarkingLayer extends InternalCourtLayer {
5
+ reflection() {
6
+ return true;
7
+ }
8
+ }
9
+
10
+ Object.assign(LaneMarkingLayer.prototype, LaneMarkingNBATrait);
11
+
12
+ module.exports = LaneMarkingLayer;
@@ -0,0 +1,13 @@
1
+ module.exports = Object.freeze({
2
+ COURT_RECT_WIDTH: 50.0,
3
+ COURT_RECT_HEIGHT: 94.0,
4
+ HOOP_CORNER_DISTANCE: 20.75,
5
+ THREE_POINT_ARC_RADIUS: 20.75,
6
+ THREE_POINT_ASIN_APPROX: 2.0,
7
+ THREE_POINT_OFFSET_ORIGIN_Y_APPROX: 6.0,
8
+ FREE_THROW_INNER_WIDTH: 12.0,
9
+ FREE_THROW_OUTER_WIDTH: 12.0,
10
+ FREE_THROW_INNER_DASHED_CIRCLE: false,
11
+ CENTER_INNER_CIRCLE: false,
12
+ BENCH_MARKING: false
13
+ });
@@ -0,0 +1,12 @@
1
+ const InternalCourtLayer = require('../../../../../base/InternalCourtLayer');
2
+ const LaneMarkingNCAATrait = require('../../../common/LaneMarkingNCAATrait');
3
+
4
+ class LaneMarkingLayer extends InternalCourtLayer {
5
+ reflection() {
6
+ return true;
7
+ }
8
+ }
9
+
10
+ Object.assign(LaneMarkingLayer.prototype, LaneMarkingNCAATrait);
11
+
12
+ module.exports = LaneMarkingLayer;
@@ -0,0 +1,13 @@
1
+ module.exports = Object.freeze({
2
+ COURT_RECT_WIDTH: 50.0,
3
+ COURT_RECT_HEIGHT: 94.0,
4
+ HOOP_CORNER_DISTANCE: 20.75,
5
+ THREE_POINT_ARC_RADIUS: 20.75,
6
+ THREE_POINT_ASIN_APPROX: 2.0,
7
+ THREE_POINT_OFFSET_ORIGIN_Y_APPROX: 6.0,
8
+ FREE_THROW_INNER_WIDTH: 12.0,
9
+ FREE_THROW_OUTER_WIDTH: 12.0,
10
+ FREE_THROW_INNER_DASHED_CIRCLE: false,
11
+ CENTER_INNER_CIRCLE: false,
12
+ BENCH_MARKING: true
13
+ });
@@ -0,0 +1,12 @@
1
+ const InternalCourtLayer = require('../../../../../base/InternalCourtLayer');
2
+ const LaneMarkingNCAATrait = require('../../../common/LaneMarkingNCAATrait');
3
+
4
+ class LaneMarkingLayer extends InternalCourtLayer {
5
+ reflection() {
6
+ return true;
7
+ }
8
+ }
9
+
10
+ Object.assign(LaneMarkingLayer.prototype, LaneMarkingNCAATrait);
11
+
12
+ module.exports = LaneMarkingLayer;
@@ -0,0 +1,13 @@
1
+ module.exports = Object.freeze({
2
+ COURT_RECT_WIDTH: 50.0,
3
+ COURT_RECT_HEIGHT: 84.0,
4
+ HOOP_CORNER_DISTANCE: 19.75,
5
+ THREE_POINT_ARC_RADIUS: 19.75,
6
+ THREE_POINT_ASIN_APPROX: 2.0,
7
+ THREE_POINT_OFFSET_ORIGIN_Y_APPROX: 6,
8
+ FREE_THROW_INNER_WIDTH: 12.0,
9
+ FREE_THROW_OUTER_WIDTH: 12.0,
10
+ FREE_THROW_INNER_DASHED_CIRCLE: false,
11
+ CENTER_INNER_CIRCLE: false,
12
+ BENCH_MARKING: false
13
+ });
@@ -0,0 +1,12 @@
1
+ const InternalCourtLayer = require('../../../../../base/InternalCourtLayer');
2
+ const LaneMarkingNCAATrait = require('../../../common/LaneMarkingNCAATrait');
3
+
4
+ class LaneMarkingLayer extends InternalCourtLayer {
5
+ reflection() {
6
+ return true;
7
+ }
8
+ }
9
+
10
+ Object.assign(LaneMarkingLayer.prototype, LaneMarkingNCAATrait);
11
+
12
+ module.exports = LaneMarkingLayer;
@@ -0,0 +1,13 @@
1
+ module.exports = Object.freeze({
2
+ COURT_RECT_WIDTH: 42.0,
3
+ COURT_RECT_HEIGHT: 74.0,
4
+ HOOP_CORNER_DISTANCE: 19.75,
5
+ THREE_POINT_ARC_RADIUS: 19.75,
6
+ THREE_POINT_ASIN_APPROX: 2.0,
7
+ THREE_POINT_OFFSET_ORIGIN_Y_APPROX: 6,
8
+ FREE_THROW_INNER_WIDTH: 12.0,
9
+ FREE_THROW_OUTER_WIDTH: 12.0,
10
+ FREE_THROW_INNER_DASHED_CIRCLE: false,
11
+ CENTER_INNER_CIRCLE: false,
12
+ BENCH_MARKING: false
13
+ });
@@ -0,0 +1,12 @@
1
+ const InternalCourtLayer = require('../../../../../base/InternalCourtLayer');
2
+ const LaneMarkingNCAATrait = require('../../../common/LaneMarkingNCAATrait');
3
+
4
+ class LaneMarkingLayer extends InternalCourtLayer {
5
+ reflection() {
6
+ return true;
7
+ }
8
+ }
9
+
10
+ Object.assign(LaneMarkingLayer.prototype, LaneMarkingNCAATrait);
11
+
12
+ module.exports = LaneMarkingLayer;
@@ -0,0 +1,13 @@
1
+ module.exports = Object.freeze({
2
+ COURT_RECT_WIDTH: 50.0,
3
+ COURT_RECT_HEIGHT: 94.0,
4
+ HOOP_CORNER_DISTANCE: 21.65,
5
+ THREE_POINT_ARC_RADIUS: 22.15,
6
+ THREE_POINT_ASIN_APPROX: 6.0,
7
+ THREE_POINT_OFFSET_ORIGIN_Y_APPROX: 9.0,
8
+ FREE_THROW_INNER_WIDTH: 12.0,
9
+ FREE_THROW_OUTER_WIDTH: 16.0,
10
+ FREE_THROW_INNER_DASHED_CIRCLE: true,
11
+ CENTER_INNER_CIRCLE: true,
12
+ BENCH_MARKING: true
13
+ });
@@ -0,0 +1,12 @@
1
+ const InternalCourtLayer = require('../../../../../base/InternalCourtLayer');
2
+ const LaneMarkingNBATrait = require('../../../common/LaneMarkingNBATrait');
3
+
4
+ class LaneMarkingLayer extends InternalCourtLayer {
5
+ reflection() {
6
+ return true;
7
+ }
8
+ }
9
+
10
+ Object.assign(LaneMarkingLayer.prototype, LaneMarkingNBATrait);
11
+
12
+ module.exports = LaneMarkingLayer;
@@ -1,15 +1,18 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
2
 
3
+ const COURT_BENCH_OFFSET_X = 11;
3
4
  class BaseLineMarkingLayer extends InternalCourtLayer {
4
5
  reflection() {
5
6
  return true;
6
7
  }
7
8
 
8
9
  drawLogic() {
9
- const benchPartLeftCourtOrigin = { x: 14.0, y: 0.0 };
10
- const benchPartLeftCourtTerminus = { x: 14.0, y: 0.5 };
11
- const benchPartRightCourtOrigin = { x: 36.0, y: 0.0 };
12
- const benchPartRightCourtTerminus = { x: 36.0, y: 0.5 };
10
+ if (!this.courtTypeConstants.BENCH_MARKING) return;
11
+
12
+ const benchPartLeftCourtOrigin = { x: this.courtCenter.x - COURT_BENCH_OFFSET_X, y: 0.0 };
13
+ const benchPartLeftCourtTerminus = { x: this.courtCenter.x - COURT_BENCH_OFFSET_X, y: 0.5 };
14
+ const benchPartRightCourtOrigin = { x: this.courtCenter.x + COURT_BENCH_OFFSET_X, y: 0.0 };
15
+ const benchPartRightCourtTerminus = { x: this.courtCenter.x + COURT_BENCH_OFFSET_X, y: 0.5 };
13
16
 
14
17
  this.ctx.beginPath();
15
18
  this.ctx.moveTo(benchPartLeftCourtOrigin.x, benchPartLeftCourtOrigin.y);
@@ -1,4 +1,6 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
+
3
+ const BENCH_AREA_OFFSET = 3.0;
2
4
 
3
5
  class BenchAreaLayer extends InternalCourtLayer {
4
6
  reflection() {
@@ -7,9 +9,9 @@ class BenchAreaLayer extends InternalCourtLayer {
7
9
 
8
10
  drawLogic() {
9
11
  const benchAreaCourtOrigin = { x: 0.0, y: 28.0 };
10
- const benchAreaCourtTerminus = { x: 3.0, y: 28.0 };
11
- const benchAreaCourtOrigin2 = { x: 50.0, y: 28.0 };
12
- const benchAreaCourtTerminus2 = { x: 47.0, y: 28.0 };
12
+ const benchAreaCourtTerminus = { x: BENCH_AREA_OFFSET, y: 28.0 };
13
+ const benchAreaCourtOrigin2 = { x: this.courtTypeConstants.COURT_RECT_WIDTH, y: 28.0 };
14
+ const benchAreaCourtTerminus2 = { x: this.courtTypeConstants.COURT_RECT_WIDTH - BENCH_AREA_OFFSET, y: 28.0 };
13
15
 
14
16
  this.ctx.beginPath();
15
17
  this.ctx.moveTo(benchAreaCourtOrigin.x, benchAreaCourtOrigin.y);
@@ -0,0 +1,12 @@
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
+
3
+ class BorderRectLayer extends InternalCourtLayer {
4
+ drawLogic() {
5
+ this.ctx.beginPath();
6
+ this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH * 2;
7
+ this.ctx.rect(0, 0, this.courtTypeConstants.COURT_RECT_WIDTH, this.courtTypeConstants.COURT_RECT_HEIGHT);
8
+ this.ctx.stroke();
9
+ }
10
+ }
11
+
12
+ module.exports = BorderRectLayer;
@@ -0,0 +1,21 @@
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
+
3
+ class CenterCircleLayer extends InternalCourtLayer {
4
+ drawLogic() {
5
+ if (!this.options.showHalfCourtCircle) return;
6
+
7
+ const outerCenterRadius = 6.0;
8
+ const innerCenterRadius = 2.0;
9
+
10
+ this.ctx.beginPath();
11
+
12
+ this.ctx.arc(this.courtCenter.x, this.courtCenter.y, outerCenterRadius, 0, Math.PI * 2, true);
13
+ if (this.courtTypeConstants.CENTER_INNER_CIRCLE) {
14
+ this.ctx.arc(this.courtCenter.x, this.courtCenter.y, innerCenterRadius, 0, Math.PI * 2, true);
15
+ }
16
+
17
+ this.ctx.stroke();
18
+ }
19
+ }
20
+
21
+ module.exports = CenterCircleLayer;
@@ -0,0 +1,16 @@
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
+
3
+ class CenterLineLayer extends InternalCourtLayer {
4
+ drawLogic() {
5
+ const courtOrigin = { x: 0.0, y: this.courtCenter.y };
6
+ const courtTerminus = { x: this.courtTypeConstants.COURT_RECT_WIDTH, y: this.courtCenter.y };
7
+
8
+ this.ctx.beginPath();
9
+ this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH * 2;
10
+ this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
11
+ this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
12
+ this.ctx.stroke();
13
+ }
14
+ }
15
+
16
+ module.exports = CenterLineLayer;