@amphore-dev/kinogrida 0.3.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -0
  3. package/dist/classes/ArcShape.d.ts +26 -0
  4. package/dist/classes/ArcShape.d.ts.map +1 -0
  5. package/dist/classes/ArcShape.js +299 -0
  6. package/dist/classes/ArcShape.js.map +1 -0
  7. package/dist/classes/BaseShape.d.ts +37 -0
  8. package/dist/classes/BaseShape.d.ts.map +1 -0
  9. package/dist/classes/BaseShape.js +146 -0
  10. package/dist/classes/BaseShape.js.map +1 -0
  11. package/dist/classes/Kinogrida.d.ts +32 -0
  12. package/dist/classes/Kinogrida.d.ts.map +1 -0
  13. package/dist/classes/Kinogrida.js +223 -0
  14. package/dist/classes/Kinogrida.js.map +1 -0
  15. package/dist/classes/SquareShape.d.ts +12 -0
  16. package/dist/classes/SquareShape.d.ts.map +1 -0
  17. package/dist/classes/SquareShape.js +125 -0
  18. package/dist/classes/SquareShape.js.map +1 -0
  19. package/dist/classes/index.d.ts +2 -0
  20. package/dist/classes/index.d.ts.map +1 -0
  21. package/dist/classes/index.js +2 -0
  22. package/dist/classes/index.js.map +1 -0
  23. package/dist/constants/CColors.d.ts +8 -0
  24. package/dist/constants/CColors.d.ts.map +1 -0
  25. package/dist/constants/CColors.js +70 -0
  26. package/dist/constants/CColors.js.map +1 -0
  27. package/dist/constants/CShapes.d.ts +7 -0
  28. package/dist/constants/CShapes.d.ts.map +1 -0
  29. package/dist/constants/CShapes.js +7 -0
  30. package/dist/constants/CShapes.js.map +1 -0
  31. package/dist/constants/index.d.ts +3 -0
  32. package/dist/constants/index.d.ts.map +1 -0
  33. package/dist/constants/index.js +3 -0
  34. package/dist/constants/index.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +2 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/types/TGrid.d.ts +28 -0
  40. package/dist/types/TGrid.d.ts.map +1 -0
  41. package/dist/types/TGrid.js +2 -0
  42. package/dist/types/TGrid.js.map +1 -0
  43. package/dist/types/TKinogrida.d.ts +9 -0
  44. package/dist/types/TKinogrida.d.ts.map +1 -0
  45. package/dist/types/TKinogrida.js +2 -0
  46. package/dist/types/TKinogrida.js.map +1 -0
  47. package/dist/types/index.d.ts +2 -0
  48. package/dist/types/index.d.ts.map +1 -0
  49. package/dist/types/index.js +2 -0
  50. package/dist/types/index.js.map +1 -0
  51. package/dist/utils/UColors.d.ts +3 -0
  52. package/dist/utils/UColors.d.ts.map +1 -0
  53. package/dist/utils/UColors.js +12 -0
  54. package/dist/utils/UColors.js.map +1 -0
  55. package/dist/utils/UMath.d.ts +5 -0
  56. package/dist/utils/UMath.d.ts.map +1 -0
  57. package/dist/utils/UMath.js +15 -0
  58. package/dist/utils/UMath.js.map +1 -0
  59. package/dist/utils/UShapes.d.ts +2 -0
  60. package/dist/utils/UShapes.d.ts.map +1 -0
  61. package/dist/utils/UShapes.js +7 -0
  62. package/dist/utils/UShapes.js.map +1 -0
  63. package/dist/utils/index.d.ts +4 -0
  64. package/dist/utils/index.d.ts.map +1 -0
  65. package/dist/utils/index.js +4 -0
  66. package/dist/utils/index.js.map +1 -0
  67. package/package.json +77 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Amphore Dev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,202 @@
1
+ # 🎨 Kinogrida
2
+
3
+ **A TypeScript library for creating animated shape visualizations on HTML5 Canvas**
4
+
5
+ Kinogrida provides a powerful and flexible system for creating animated grid-based visualizations with dynamic shape movements, collision detection, and customizable visual effects.
6
+
7
+ ## ✨ Features
8
+
9
+ - 🎯 **Grid-based Animation System** - Smooth movement between grid cells with pathfinding
10
+ - 🔒 **Collision Detection** - Smart path locking prevents overlapping movements
11
+ - 🎨 **Multiple Shape Types** - BaseShape, SquareShape, and ArcShape with extensible architecture
12
+ - 🌈 **Rich Color Palettes** - 8 pre-built themes (Rainbow, Pastel, Neon, Ocean, Sunset, Dark, Earth, Cyberpunk)
13
+ - 🔄 **Advanced Arc Animation** - Clockwise/counterclockwise rotation with configurable amplitude
14
+ - ⚡ **High Performance** - Optimized rendering with requestAnimationFrame
15
+ - 📱 **Responsive Design** - Auto-adapts to canvas resizing
16
+ - 🎛️ **Highly Customizable** - Extensive configuration options
17
+
18
+ ## 🚀 Installation
19
+
20
+ ```bash
21
+ npm install @amphore-dev/kinogrida
22
+ ```
23
+
24
+ ## 📖 Quick Start
25
+
26
+ ```typescript
27
+ import { Kinogrida } from "@amphore-dev/kinogrida";
28
+
29
+ // Get your canvas element
30
+ const canvas = document.getElementById("myCanvas") as HTMLCanvasElement;
31
+
32
+ // Create and start the visualization
33
+ const kinogrida = new Kinogrida(canvas);
34
+ kinogrida.play();
35
+
36
+ // Stop when needed
37
+ // kinogrida.pause();
38
+ ```
39
+
40
+ ## 🎨 Color Palettes
41
+
42
+ ```typescript
43
+ import {
44
+ CCOLORS_RAINBOW_PALETTE,
45
+ CCOLORS_PASTEL_PALETTE,
46
+ CCOLORS_NEON_PALETTE,
47
+ CCOLORS_OCEAN_PALETTE,
48
+ CCOLORS_SUNSET_PALETTE,
49
+ CCOLORS_DARK_PALETTE,
50
+ CCOLORS_EARTH_PALETTE,
51
+ CCOLORS_CYBERPUNK_PALETTE,
52
+ } from "@amphore-dev/kinogrida";
53
+
54
+ // Use any palette for your shapes
55
+ const colors = CCOLORS_CYBERPUNK_PALETTE;
56
+ ```
57
+
58
+ ## 🔧 Advanced Usage
59
+
60
+ ### Creating Custom Shapes
61
+
62
+ ```typescript
63
+ import {
64
+ BaseShape,
65
+ TGrid,
66
+ TGridConfig,
67
+ TShapeConfig,
68
+ } from "@amphore-dev/kinogrida";
69
+
70
+ export class CustomShape extends BaseShape {
71
+ public draw(context: CanvasRenderingContext2D, gridConfig: TGridConfig) {
72
+ // Your custom drawing logic
73
+ context.fillStyle = this.color;
74
+ const { cellSize, offsetX, offsetY } = gridConfig;
75
+ const x = offsetX + this.x * cellSize;
76
+ const y = offsetY + this.y * cellSize;
77
+ context.fillRect(x, y, cellSize, cellSize);
78
+ }
79
+ }
80
+ ```
81
+
82
+ ### Grid Configuration
83
+
84
+ ```typescript
85
+ const gridConfig = {
86
+ nbrColumns: 20, // Number of columns
87
+ nbrRows: 15, // Number of rows
88
+ gridMargin: 50, // Margin around grid
89
+ cellSize: 40, // Size of each cell (auto-calculated)
90
+ lineWidth: 2, // Stroke width for shapes
91
+ debug: false, // Show debug information
92
+ };
93
+ ```
94
+
95
+ ### Movement System
96
+
97
+ The library features an intelligent movement system:
98
+
99
+ - **Path Planning** - Calculates optimal routes between grid positions
100
+ - **Cell Locking** - Reserves path cells to prevent collisions
101
+ - **Smooth Animation** - Fluid transitions with configurable speed
102
+ - **Bounce-free Motion** - Uses distance-based positioning for precise arrival
103
+
104
+ ## 🏗️ Architecture
105
+
106
+ ### Core Classes
107
+
108
+ - **`Kinogrida`** - Main orchestrator class managing canvas and animation
109
+ - **`BaseShape`** - Abstract base class for all animated shapes
110
+ - **`SquareShape`** - Square implementation with optional rounded corners
111
+ - **`ArcShape`** - Curved arc implementation with rotation and directional control
112
+
113
+ ### Movement Lifecycle
114
+
115
+ 1. **Path Generation** - Calculate cells between start and target
116
+ 2. **Collision Check** - Verify path is clear of obstacles
117
+ 3. **Cell Locking** - Reserve path cells to prevent conflicts
118
+ 4. **Animation Phase 1** - Move shape head to target
119
+ 5. **Animation Phase 2** - Move shape tail to complete extension
120
+ 6. **Cleanup** - Release locked cells and update grid state
121
+
122
+ ## 🎭 Shape Types
123
+
124
+ ### BaseShape (Abstract)
125
+
126
+ BaseShape provides core properties and methods for all shapes, including color management and movement logic.
127
+
128
+ ```typescript
129
+ // Abstract base class with color and movement capabilities
130
+ const item = new BaseShape(grid, x, y, color);
131
+ ```
132
+
133
+ ### SquareShape
134
+
135
+ SquareShape extends BaseShape to create squares with optional rounded corners.
136
+
137
+ ```typescript
138
+ // Configurable squares with optional rounding
139
+ const square = new SquareShape(grid, x, y, {
140
+ color: "blue",
141
+ radiusPercent: 25, // 0-100 percentage for rounded corners
142
+ });
143
+ ```
144
+
145
+ ### ArcShape
146
+
147
+ ArcShape extends BaseShape to create dynamic curved arcs with advanced rotation capabilities.
148
+
149
+ ```typescript
150
+ // Dynamic arcs with advanced rotation control
151
+ const arc = new ArcShape(grid, x, y, {
152
+ color: "red",
153
+ clockwise: true, // Rotation direction
154
+ rotationAmount: 0.25, // 0.25=quarter, 0.5=half, 0.75=three-quarter, 1.0=full rotation
155
+ });
156
+ ```
157
+
158
+ #### ArcShape Rotation Options
159
+
160
+ - **`clockwise`** - `true` for clockwise, `false` for counterclockwise rotation
161
+ - **`rotationAmount`** - Amplitude of rotation:
162
+ - `0.25` - Quarter turn (90°)
163
+ - `0.5` - Half turn (180°)
164
+ - `0.75` - Three-quarter turn (270°)
165
+ - `1.0` - Full rotation (360°)
166
+
167
+ ## 📚 Development
168
+
169
+ ### Build & Test
170
+
171
+ ```bash
172
+ # Development build with watch
173
+ npm run build:watch
174
+
175
+ # Run tests
176
+ npm test
177
+
178
+ # Run example
179
+ cd example && npm run dev
180
+ ```
181
+
182
+ ### Project Structure
183
+
184
+ ```
185
+ src/
186
+ ├── classes/ # Core shape classes
187
+ ├── constants/ # Color palettes and constants
188
+ ├── types/ # TypeScript type definitions
189
+ └── utils/ # Utility functions
190
+ ```
191
+
192
+ ## 🤝 Contributing
193
+
194
+ 1. Fork the repository
195
+ 2. Create your feature branch (`git checkout -b feature/amazing-feature`)
196
+ 3. Commit your changes (`git commit -m 'Add some amazing feature'`)
197
+ 4. Push to the branch (`git push origin feature/amazing-feature`)
198
+ 5. Open a Pull Request
199
+
200
+ ## 📄 License
201
+
202
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
@@ -0,0 +1,26 @@
1
+ import { TGrid, TGridConfig, TPosition, TShapeConfig } from "../types/TGrid.js";
2
+ import { BaseShape } from "./BaseShape.js";
3
+ export declare class ArcShape extends BaseShape {
4
+ protected progress: number;
5
+ protected tailProgress: number;
6
+ protected angleOffset: number;
7
+ protected arc: number;
8
+ protected clockwise: boolean;
9
+ protected rotationAmount: number;
10
+ private debugPath;
11
+ protected moveDuration: number;
12
+ constructor(grid: TGrid, x: number | undefined, y: number | undefined, options: TShapeConfig);
13
+ private genAngleOffset;
14
+ private calculateArcGeometry;
15
+ private drawArcElements;
16
+ drawArc(context: CanvasRenderingContext2D, gridConfig: TGridConfig): void;
17
+ draw(context: CanvasRenderingContext2D, gridConfig: TGridConfig): void;
18
+ private drawDebugPath;
19
+ private updateAnimationProgress;
20
+ protected onMoveComplete(grid: TGrid, newX: number, newY: number): void;
21
+ protected calculateNewTarget(grid: TGrid, gridConfig: TGridConfig): void;
22
+ genLockPath(grid: TGrid, gridConfig: TGridConfig): TPosition[] | false;
23
+ private isValidGridPosition;
24
+ private resetDebugPath;
25
+ }
26
+ //# sourceMappingURL=ArcShape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcShape.d.ts","sourceRoot":"","sources":["../../src/classes/ArcShape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,qBAAa,QAAS,SAAQ,SAAS;IACnC,SAAS,CAAC,QAAQ,SAAK;IACvB,SAAS,CAAC,YAAY,SAAK;IAC3B,SAAS,CAAC,WAAW,SAAK;IAC1B,SAAS,CAAC,GAAG,SAAK;IAClB,SAAS,CAAC,SAAS,UAAQ;IAC3B,SAAS,CAAC,cAAc,SAAQ;IAEhC,OAAO,CAAC,SAAS,CAQf;IAEF,SAAS,CAAC,YAAY,SAAQ;gBAE1B,IAAI,EAAE,KAAK,EACX,CAAC,EAAE,MAAM,YAAI,EACb,CAAC,EAAE,MAAM,YAAI,EACb,OAAO,EAAE,YAAY;IAYzB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,oBAAoB;IAmD5B,OAAO,CAAC,eAAe;IAgFhB,OAAO,CAAC,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,WAAW;IAkBlE,IAAI,CAAC,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,WAAW;IAOtE,OAAO,CAAC,aAAa;IAsCrB,OAAO,CAAC,uBAAuB;IA8C/B,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IASvE,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,GAAG,IAAI;IA4DjE,WAAW,CACd,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,GACxB,SAAS,EAAE,GAAG,KAAK;IAwFtB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,cAAc;CAOzB"}
@@ -0,0 +1,299 @@
1
+ import { BaseShape } from "./BaseShape.js";
2
+ import { randomInt } from "../utils/UMath.js";
3
+ export class ArcShape extends BaseShape {
4
+ progress = 0;
5
+ tailProgress = 0;
6
+ angleOffset = 0;
7
+ arc = 2;
8
+ clockwise = true; // Sens de rotation : true = horaire, false = antihoraire
9
+ rotationAmount = 0.25; // Amplitude de rotation : 0.25 (quart), 0.5 (demi), 0.75 (trois quarts), 1.0 (complet)
10
+ debugPath = {
11
+ inner: [],
12
+ outer: [],
13
+ center: [],
14
+ };
15
+ moveDuration = 4000; // Duration of the move in milliseconds
16
+ constructor(grid, x = 0, y = 0, options) {
17
+ super(grid, x, y, options);
18
+ this.color = options.color;
19
+ this.angleOffset = this.genAngleOffset();
20
+ // Ajouter la possibilité de configurer le sens de rotation
21
+ this.clockwise = options.clockwise ?? true;
22
+ // Configurer l'amplitude de rotation (par défaut quart de tour)
23
+ this.rotationAmount = options.rotationAmount ?? 0.25;
24
+ // this.color = "green";
25
+ }
26
+ genAngleOffset() {
27
+ const possibleAngles = [0, 0.25, 0.5, 0.75];
28
+ return (possibleAngles[randomInt(0, possibleAngles.length - 1)] *
29
+ Math.PI *
30
+ 2);
31
+ }
32
+ calculateArcGeometry(gridConfig, customAngleOffset, customArc) {
33
+ const { cellSize, offsetX, offsetY, lineWidth } = gridConfig;
34
+ const arc = customArc ?? this.arc;
35
+ const angleOffset = customAngleOffset ?? this.angleOffset;
36
+ const centerX = offsetX + this.x * cellSize + cellSize / 2;
37
+ const centerY = offsetY + this.y * cellSize + cellSize / 2;
38
+ const endAngle = angleOffset;
39
+ const initAngle = endAngle - Math.PI;
40
+ const rotationDirection = this.clockwise ? 1 : -1;
41
+ const rotationAngle = 2 * Math.PI * this.rotationAmount; // Convertir en radians
42
+ const startAngle = endAngle -
43
+ Math.PI +
44
+ rotationAngle * this.progress * rotationDirection;
45
+ const tailAngle = endAngle -
46
+ Math.PI +
47
+ rotationAngle * this.tailProgress * rotationDirection;
48
+ const arcRadius = cellSize * arc;
49
+ const arcCenterX = centerX + cellSize * arc * Math.cos(endAngle);
50
+ const arcCenterY = centerY + cellSize * arc * Math.sin(endAngle);
51
+ return {
52
+ centerX,
53
+ centerY,
54
+ endAngle,
55
+ initAngle,
56
+ startAngle,
57
+ tailAngle,
58
+ arcRadius,
59
+ arcCenterX,
60
+ arcCenterY,
61
+ cellSize,
62
+ lineWidth,
63
+ rotationDirection,
64
+ offsetX,
65
+ offsetY,
66
+ };
67
+ }
68
+ drawArcElements(context, geometry, color, width) {
69
+ const { arcCenterX, arcCenterY, arcRadius, startAngle, tailAngle, initAngle, lineWidth, rotationDirection, } = geometry;
70
+ const halfWidth = width / 2;
71
+ context.lineWidth = lineWidth;
72
+ context.strokeStyle = color;
73
+ const startX = arcCenterX + arcRadius * Math.cos(startAngle);
74
+ const startY = arcCenterY + arcRadius * Math.sin(startAngle);
75
+ const endX = arcCenterX + arcRadius * Math.cos(tailAngle);
76
+ const endY = arcCenterY + arcRadius * Math.sin(tailAngle);
77
+ const rotationAngle = 2 * Math.PI * this.rotationAmount;
78
+ const arcStartAngle = initAngle + rotationAngle * this.tailProgress * rotationDirection;
79
+ const arcEndAngle = initAngle + rotationAngle * this.progress * rotationDirection;
80
+ // Start cap
81
+ context.beginPath();
82
+ context.arc(startX, startY, halfWidth, this.clockwise ? startAngle : startAngle - Math.PI, this.clockwise ? startAngle + Math.PI : startAngle);
83
+ context.stroke();
84
+ // End cap
85
+ context.beginPath();
86
+ context.arc(endX, endY, halfWidth, this.clockwise ? tailAngle - Math.PI : tailAngle, this.clockwise ? tailAngle : tailAngle - Math.PI);
87
+ context.stroke();
88
+ // Outer arc
89
+ context.beginPath();
90
+ context.arc(arcCenterX, arcCenterY, arcRadius + halfWidth, arcStartAngle, arcEndAngle, !this.clockwise);
91
+ context.stroke();
92
+ // Inner arc
93
+ context.beginPath();
94
+ context.arc(arcCenterX, arcCenterY, arcRadius - halfWidth, arcStartAngle, arcEndAngle, !this.clockwise);
95
+ context.stroke();
96
+ }
97
+ drawArc(context, gridConfig) {
98
+ const geometry = this.calculateArcGeometry(gridConfig);
99
+ const baseSize = gridConfig.cellSize * 0.8;
100
+ context.lineCap = "round";
101
+ this.drawArcElements(context, geometry, this.color, baseSize);
102
+ this.drawArcElements(context, geometry, "white", baseSize - geometry.lineWidth * 4);
103
+ this.updateAnimationProgress(geometry);
104
+ }
105
+ draw(context, gridConfig) {
106
+ this.drawArc(context, gridConfig);
107
+ if (gridConfig.debug) {
108
+ this.drawDebugPath(context);
109
+ }
110
+ }
111
+ drawDebugPath(context) {
112
+ if (!this.debugPath || !this.isMoving)
113
+ return;
114
+ context.lineWidth = 1;
115
+ context.strokeStyle = "red";
116
+ context.beginPath();
117
+ this.debugPath.center.forEach((pos, index) => {
118
+ if (index === 0) {
119
+ context.moveTo(pos.x, pos.y);
120
+ }
121
+ else {
122
+ context.lineTo(pos.x, pos.y);
123
+ }
124
+ });
125
+ context.stroke();
126
+ context.strokeStyle = "blue";
127
+ context.beginPath();
128
+ this.debugPath.inner.forEach((pos, index) => {
129
+ if (index === 0) {
130
+ context.moveTo(pos.x, pos.y);
131
+ }
132
+ else {
133
+ context.lineTo(pos.x, pos.y);
134
+ }
135
+ });
136
+ context.stroke();
137
+ context.strokeStyle = "green";
138
+ context.beginPath();
139
+ this.debugPath.outer.forEach((pos, index) => {
140
+ if (index === 0) {
141
+ context.moveTo(pos.x, pos.y);
142
+ }
143
+ else {
144
+ context.lineTo(pos.x, pos.y);
145
+ }
146
+ });
147
+ context.stroke();
148
+ }
149
+ updateAnimationProgress(geometry) {
150
+ if (!this.isMoving)
151
+ return;
152
+ const { arcCenterX, arcCenterY, arcRadius, endAngle, cellSize } = geometry;
153
+ if (!this.hasReachedTarget &&
154
+ (this.progress >= 1 || this.progress + this.speed >= 1)) {
155
+ this.progress = 1;
156
+ this.hasReachedTarget = true;
157
+ }
158
+ else if (this.tailProgress >= 1 ||
159
+ (this.tailProgress + this.speed >= 1 && this.hasReachedTarget)) {
160
+ this.tailProgress = 1;
161
+ // Calculer la position finale en tenant compte de la direction de rotation
162
+ const rotationDirection = this.clockwise ? 1 : -1;
163
+ const rotationAngle = 2 * Math.PI * this.rotationAmount;
164
+ const finalAngle = endAngle - Math.PI + rotationAngle * rotationDirection;
165
+ const newX = Math.floor((arcCenterX +
166
+ arcRadius * Math.cos(finalAngle) -
167
+ geometry.offsetX) /
168
+ cellSize);
169
+ const newY = Math.floor((arcCenterY +
170
+ arcRadius * Math.sin(finalAngle) -
171
+ geometry.offsetY) /
172
+ cellSize);
173
+ this.onMoveComplete(this.grid, newX, newY);
174
+ }
175
+ else if (this.progress < 1) {
176
+ this.progress += this.speed;
177
+ }
178
+ else if (this.progress >= 1 && this.tailProgress < 1) {
179
+ this.tailProgress += this.speed;
180
+ }
181
+ }
182
+ onMoveComplete(grid, newX, newY) {
183
+ super.onMoveComplete(grid, newX, newY);
184
+ this.progress = 0;
185
+ this.tailProgress = 0;
186
+ this.isMoving = false;
187
+ this.hasReachedTarget = true;
188
+ this.hasTailReachedTarget = true;
189
+ }
190
+ calculateNewTarget(grid, gridConfig) {
191
+ if (this.isMoving) {
192
+ return;
193
+ }
194
+ const { nbrColumns, nbrRows } = gridConfig;
195
+ const newOffset = this.genAngleOffset();
196
+ const newArc = randomInt(1, Math.min(nbrColumns, nbrRows) / 2 - 1);
197
+ // Générer aléatoirement le sens de rotation dès le début
198
+ const newClockwise = Math.random() > 0.5;
199
+ // Générer aléatoirement l'amplitude de rotation
200
+ const rotationAmounts = [0.25, 0.5, 0.75]; // quart, demi, trois quarts, complet
201
+ const newRotationAmount = rotationAmounts[randomInt(0, rotationAmounts.length - 1)];
202
+ // Utiliser calculateArcGeometry avec les nouveaux paramètres
203
+ const { arcCenterX, arcCenterY, arcRadius, endAngle, cellSize } = this.calculateArcGeometry(gridConfig, newOffset, newArc);
204
+ // Calculer la position finale en tenant compte de la direction de rotation
205
+ const rotationDirection = newClockwise ? 1 : -1;
206
+ const rotationAngle = 2 * Math.PI * newRotationAmount;
207
+ const finalAngle = endAngle - Math.PI + rotationAngle * rotationDirection;
208
+ const endX = Math.floor((arcCenterX +
209
+ arcRadius * Math.cos(finalAngle) -
210
+ gridConfig.offsetX) /
211
+ cellSize);
212
+ const endY = Math.floor((arcCenterY +
213
+ arcRadius * Math.sin(finalAngle) -
214
+ gridConfig.offsetY) /
215
+ cellSize);
216
+ if (endX >= 0 &&
217
+ endX < nbrColumns &&
218
+ endY >= 0 &&
219
+ endY < nbrRows &&
220
+ grid[endY][endX] === null &&
221
+ (endX !== this.x || endY !== this.y)) {
222
+ this.arc = newArc;
223
+ this.angleOffset = newOffset;
224
+ this.clockwise = newClockwise;
225
+ this.rotationAmount = newRotationAmount;
226
+ const frames = (this.moveDuration / 1000) * 60;
227
+ const speed = 1 / frames; // toujours en %
228
+ this.speed = speed;
229
+ this.moveTo(grid, gridConfig, endX, endY);
230
+ }
231
+ }
232
+ genLockPath(grid, gridConfig) {
233
+ const path = [];
234
+ const pathKeys = new Set();
235
+ const geometry = this.calculateArcGeometry(gridConfig);
236
+ const { arcCenterX, arcCenterY, arcRadius, endAngle, rotationDirection, offsetX, offsetY, cellSize, } = geometry;
237
+ const width = gridConfig.cellSize;
238
+ const halfWidth = width * 0.5 - gridConfig.lineWidth * 0.51;
239
+ const steps = Math.max(10, this.arc * this.arc * (this.rotationAmount * 8));
240
+ const addPoint = (worldX, worldY) => {
241
+ const gridX = Math.floor((worldX - offsetX) / cellSize);
242
+ const gridY = Math.floor((worldY - offsetY) / cellSize);
243
+ if (!this.isValidGridPosition(gridX, gridY, grid)) {
244
+ return false;
245
+ }
246
+ const key = `${gridX}:${gridY}`;
247
+ if (pathKeys.has(key)) {
248
+ return true;
249
+ }
250
+ pathKeys.add(key);
251
+ path.push({ x: gridX, y: gridY });
252
+ return true;
253
+ };
254
+ if (gridConfig.debug)
255
+ this.resetDebugPath();
256
+ for (let i = 0; i <= steps; i++) {
257
+ const progress = i / steps;
258
+ const rotationAngle = 2 * Math.PI * this.rotationAmount;
259
+ const angle = endAngle -
260
+ Math.PI +
261
+ rotationAngle * progress * rotationDirection;
262
+ const centerX = arcCenterX + arcRadius * Math.cos(angle);
263
+ const centerY = arcCenterY + arcRadius * Math.sin(angle);
264
+ if (gridConfig.debug)
265
+ this.debugPath.center.push({ x: centerX, y: centerY });
266
+ const innerRadius = Math.max(0.001, arcRadius - halfWidth);
267
+ const innerX = arcCenterX + innerRadius * Math.cos(angle);
268
+ const innerY = arcCenterY + innerRadius * Math.sin(angle);
269
+ if (gridConfig.debug)
270
+ this.debugPath.inner.push({ x: innerX, y: innerY });
271
+ const outerRadius = arcRadius + halfWidth;
272
+ const outerX = arcCenterX + outerRadius * Math.cos(angle);
273
+ const outerY = arcCenterY + outerRadius * Math.sin(angle);
274
+ if (gridConfig.debug)
275
+ this.debugPath.outer.push({ x: outerX, y: outerY });
276
+ const checkCenter = addPoint(centerX, centerY);
277
+ const checkInner = addPoint(innerX, innerY);
278
+ const checkOuter = addPoint(outerX, outerY);
279
+ if (!checkCenter || !checkInner || !checkOuter) {
280
+ // Si l'une des positions n'est pas valide, arrêter de générer le chemin
281
+ if (gridConfig.debug)
282
+ this.resetDebugPath();
283
+ return false;
284
+ }
285
+ }
286
+ return path;
287
+ }
288
+ isValidGridPosition(x, y, grid) {
289
+ return y >= 0 && y < grid.length && x >= 0 && x < grid[0].length;
290
+ }
291
+ resetDebugPath() {
292
+ this.debugPath = {
293
+ inner: [],
294
+ outer: [],
295
+ center: [],
296
+ };
297
+ }
298
+ }
299
+ //# sourceMappingURL=ArcShape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcShape.js","sourceRoot":"","sources":["../../src/classes/ArcShape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { TGrid, TGridConfig, TPosition, TShapeConfig } from "../types/TGrid.js";
2
+ export declare class BaseShape {
3
+ protected grid: TGrid;
4
+ protected x: number;
5
+ protected y: number;
6
+ protected speed: number;
7
+ protected lastMoveTime: number;
8
+ protected moveDuration: number;
9
+ protected minBounceTime: number;
10
+ protected maxBounceTime: number;
11
+ protected moveDebounce: number;
12
+ protected canMove: boolean;
13
+ protected isMoving: boolean;
14
+ protected tailX: number;
15
+ protected tailY: number;
16
+ protected originalX: number;
17
+ protected originalY: number;
18
+ protected targetX: number;
19
+ protected targetY: number;
20
+ protected hasReachedTarget: boolean;
21
+ protected hasTailReachedTarget: boolean;
22
+ protected color: string;
23
+ protected lockedCells: TPosition[];
24
+ constructor(grid: TGrid, x: number | undefined, y: number | undefined, options: TShapeConfig);
25
+ moveTo(grid: TGrid, gridConfig: TGridConfig, x: number, y: number): void;
26
+ genLockPath(grid: TGrid, gridConfig: TGridConfig, targetX: number, targetY: number): TPosition[] | false;
27
+ lockGridCells(grid: TGrid, cells: TPosition[], applyLocks?: boolean): boolean;
28
+ protected getLineCells(_x0: number, _y0: number, _x1: number, _y1: number): TPosition[];
29
+ update(grid: TGrid, gridConfig: TGridConfig, context: CanvasRenderingContext2D): void;
30
+ protected calculateNewTarget(_grid: TGrid, _gridConfig: TGridConfig): void;
31
+ protected updatePosition(_grid: TGrid): void;
32
+ protected onMoveComplete(grid: TGrid, newX: number, newY: number): void;
33
+ unlockGridCells(grid: TGrid): void;
34
+ draw(_context: CanvasRenderingContext2D, _gridConfig: TGridConfig): void;
35
+ drawLockedCells(context: CanvasRenderingContext2D, gridConfig: TGridConfig): void;
36
+ }
37
+ //# sourceMappingURL=BaseShape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseShape.d.ts","sourceRoot":"","sources":["../../src/classes/BaseShape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAI/E,qBAAa,SAAS;IAClB,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;IACtB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAK;IACxB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAK;IACxB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAS;IAEhC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAc;IAC5C,SAAS,CAAC,YAAY,EAAE,MAAM,CAAQ;IACtC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAK;IACpC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAM;IACrC,SAAS,CAAC,YAAY,EAAE,MAAM,CAC4B;IAE1D,SAAS,CAAC,OAAO,EAAE,OAAO,CAAQ;IAClC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAS;IACpC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAK;IAC5B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAK;IAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAK;IAChC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAK;IAChC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAK;IAC9B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAK;IAC9B,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAS;IAC5C,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAS;IAEhD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAW;IAElC,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,CAAM;gBAGpC,IAAI,EAAE,KAAK,EACX,CAAC,EAAE,MAAM,YAAI,EACb,CAAC,EAAE,MAAM,YAAI,EACb,OAAO,EAAE,YAAY;IAclB,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAwBjE,WAAW,CACd,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAChB,SAAS,EAAE,GAAG,KAAK;IAUf,aAAa,CAChB,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,EAAE,EAClB,UAAU,GAAE,OAAc,GAC3B,OAAO;IA0BV,SAAS,CAAC,YAAY,CAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACZ,SAAS,EAAE;IAMP,MAAM,CACT,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,wBAAwB,GAClC,IAAI;IAUP,SAAS,CAAC,kBAAkB,CACxB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,GACzB,IAAI;IAEP,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAE5C,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAwBhE,eAAe,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IASlC,IAAI,CAAC,QAAQ,EAAE,wBAAwB,EAAE,WAAW,EAAE,WAAW;IAEjE,eAAe,CAClB,OAAO,EAAE,wBAAwB,EACjC,UAAU,EAAE,WAAW;CA4B9B"}