const canvas = document.getElementById('peep');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const ctx = canvas.getContext('2d');
let draggedShape = null;
const shapes = [
{ type: 'circle', x: 100, y: canvas.height - 32, radius: 30 },
{ type: 'rectangle', x: 200, y: canvas.height - 32, width: 60, height: 60 },
{ type: 'triangle', x: 300, y: canvas.height - 32, sideLength: 50 },
{ type: 'octagon', x: 400, y: canvas.height - 32, sideLength: 40 },
{ type: 'pentagon', x: 500, y: canvas.height - 32, sideLength: 45 },
];
const drawCircle = (shape) => {
ctx.arc(shape.x, shape.y, shape.radius, 0, Math.PI * 2);
};
const drawRectangle = (shape) => {
ctx.rect(shape.x - shape.width / 2, shape.y - shape.height / 2, shape.width, shape.height);
};
const drawTriangle = (shape) => {
const sideLength = shape.sideLength;
const height = (Math.sqrt(3) / 2) * sideLength;
ctx.moveTo(shape.x, shape.y - height / 2);
ctx.lineTo(shape.x - sideLength / 2, shape.y + height / 2);
ctx.lineTo(shape.x + sideLength / 2, shape.y + height / 2);
ctx.closePath();
};
const drawOctagon = (shape) => {
const sideLength = shape.sideLength;
const angle = (2 * Math.PI) / 8;
ctx.moveTo(shape.x + sideLength * Math.cos(0), shape.y + sideLength * Math.sin(0));
for (let i = 1; i < 8; i++) {
ctx.lineTo(shape.x + sideLength * Math.cos(angle * i), shape.y + sideLength * Math.sin(angle * i));
}
ctx.closePath();
};
const drawPentagon = (shape) => {
const sideLength = shape.sideLength;
const angle = (2 * Math.PI) / 5;
ctx.moveTo(shape.x + sideLength * Math.cos(0), shape.y + sideLength * Math.sin(0));
for (let i = 1; i < 5; i++) {
ctx.lineTo(shape.x + sideLength * Math.cos(angle * i), shape.y + sideLength * Math.sin(angle * i));
}
ctx.closePath();
};
const draw = () => {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = '#ddd';
ctx.fillRect(0, 0, canvas.width, canvas.height);
const rectHeight = 4 * 16;
ctx.fillStyle = '#adadad';
ctx.fillRect(0, canvas.height - rectHeight, canvas.width, rectHeight);
ctx.strokeStyle = 'white';
for (const pulse of pulses) {
ctx.beginPath();
ctx.lineWidth = 5;
ctx.shadowColor = 'rgba(255, 255, 255, 0.5)';
ctx.shadowBlur = 20;
ctx.arc(pulse.x, pulse.y, pulse.radius, 0, Math.PI * 2);
ctx.stroke();
// Increase the radius of the pulse
pulse.radius += 5;
// Naive collision detection
for (const shape of shapes) {
if (isPointInsideShape(pulse.x, pulse.y, shape)) {
console.log('Collision detected with shape:', shape.type);
}
}
}
ctx.shadowColor = 'transparent'; // reset shadow color
ctx.shadowBlur = 0; // reset shadow blur
ctx.fillStyle = 'black';
shapes.forEach((shape) => {
ctx.beginPath();
if (shape.type === 'circle') {
drawCircle(shape);
} else if (shape.type === 'rectangle') {
drawRectangle(shape);
} else if (shape.type === 'triangle') {
drawTriangle(shape);
} else if (shape.type === 'octagon') {
drawOctagon(shape);
} else if (shape.type === 'pentagon') {
drawPentagon(shape);
}
ctx.fill();
});
};
const isPointInsideShape = (x, y, shape) => {
if (shape.type === 'circle') {
return Math.hypot(shape.x - x, shape.y - y) < shape.radius;
} else if (shape.type === 'rectangle') {
return x > shape.x - shape.width / 2 && x < shape.x + shape.width / 2 && y > shape.y - shape.height / 2 && y < shape.y + shape.height / 2;
} else if (shape.type === 'triangle') {
return isPointInsideTriangle(x, y, shape);
} else if (shape.type === 'octagon') {
return isPointInsideOctagon(x, y, shape);
} else if (shape.type === 'pentagon') {
return isPointInsidePentagon(x, y, shape);
}
return false;
};
const isPointInsideTriangle = (x, y, shape) => {
const sideLength = shape.sideLength;
const height = (Math.sqrt(3) / 2) * sideLength;
const topY = shape.y - height / 2;
const bottomY = shape.y + height / 2;
const leftX = shape.x - sideLength / 2;
const rightX = shape.x + sideLength / 2;
const topSlope = (y - topY) / (x - shape.x);
const bottomSlope = (y - bottomY) / (x - shape.x);
return x > leftX && x < rightX && y > topY && y < bottomY && topSlope < bottomSlope;
};
const isPointInsideOctagon = (x, y, shape) => {
const sideLength = shape.sideLength;
const topY = shape.y - sideLength;
const bottomY = shape.y + sideLength;
const leftX = shape.x - sideLength;
const rightX = shape.x + sideLength;
const topSlope = (y - topY) / (x - shape.x);
const bottomSlope = (y - bottomY) / (x - shape.x);
return x > leftX && x < rightX && y > topY && y < bottomY && topSlope < bottomSlope;
};
const isPointInsidePentagon = (x, y, shape) => {
const sideLength = shape.sideLength;
const topY = shape.y - sideLength;
const bottomY = shape.y + sideLength;
const leftX = shape.x - sideLength;
const rightX = shape.x + sideLength;
const topSlope = (y - topY) / (x - shape.x);
const bottomSlope = (y - bottomY) / (x - shape.x);
return x > leftX && x < rightX && y > topY && y < bottomY && topSlope < bottomSlope;
};
canvas.addEventListener('mousedown', (event) => {
const x = event.clientX;
const y = event.clientY;
shapes.forEach((shape) => {
if (isPointInsideShape(x, y, shape)) {
draggedShape = shape;
return;
}
});
});
canvas.addEventListener('mousemove', (event) => {
if (draggedShape) {
draggedShape.x = event.clientX;
draggedShape.y = event.clientY;
}
});
let pulses = [];
canvas.addEventListener('mouseup', (event) => {
if (draggedShape && draggedShape.type === 'circle') {
// Add a new pulse for the circle
pulses.push({ x: draggedShape.x, y: draggedShape.y, radius: 0 });
}
draggedShape = null;
});
const setup = () => {};
const update = () => {
draw();
pulses = pulses.filter(pulse => pulse.radius < canvas.width / 2);
requestAnimationFrame(update);
};
setup();
update();