1
0
Fork 0
zoomaccel/src/utils/target.ts

58 lines
1.7 KiB
TypeScript

import { Target, CONSTANTS } from '../types';
export const generateTargets = () => {
const newTargets: Target[] = [];
// Fixed target size for better visibility
const MIN_RADIUS = 100;
const MAX_RADIUS = 600;
// Get browser window dimensions
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
// Base the target area on the minimum zoom level
// This ensures when fully zoomed out, we see the entire grid
const minZoom = CONSTANTS.ZOOM_LEVELS.min;
const areaWidth = windowWidth / minZoom;
const areaHeight = windowHeight / minZoom;
// Create a grid-like distribution
const gridSize = Math.ceil(Math.sqrt(CONSTANTS.TARGET_COUNT));
const cellWidth = areaWidth / gridSize;
const cellHeight = areaHeight / gridSize;
for (let i = 0; i < CONSTANTS.TARGET_COUNT; i++) {
// Calculate grid position
const gridX = i % gridSize;
const gridY = Math.floor(i / gridSize);
// Add some randomness within each grid cell
const randomOffsetX = (Math.random() - 0.5) * cellWidth * 0.6;
const randomOffsetY = (Math.random() - 0.5) * cellHeight * 0.6;
// Calculate final position
const x = cellWidth * (gridX + 0.5) + randomOffsetX;
const y = cellHeight * (gridY + 0.5) + randomOffsetY;
// Random radius
const radius = MIN_RADIUS + Math.random() * (MAX_RADIUS - MIN_RADIUS);
// Add the target to the array
newTargets.push({
x,
y,
radius
});
}
return newTargets;
};
export const getRandomTarget = (currentTarget: number | null, maxTargets: number): number => {
let newTarget: number;
do {
newTarget = Math.floor(Math.random() * maxTargets);
} while (newTarget === currentTarget);
return newTarget;
};