This commit is contained in:
kolaflash
2026-02-09 23:26:50 +01:00
parent fcc0f90198
commit f07dc0bf51
7 changed files with 211 additions and 13 deletions
+121
View File
@@ -0,0 +1,121 @@
import type { AABB } from "#/engine/AABB.ts";
import type { Circle } from "#/engine/Circle.ts";
import type { Vector } from "#/engine/Vector.ts";
export function isPointInCircle(point: Vector, circle: Circle): boolean {
const dx = point.x - circle.position.x;
const dy = point.y - circle.position.y;
return dx * dx + dy * dy <= circle.radius ** 2;
}
export function isPointInAABB(point: Vector, aabb: AABB): boolean {
const rx = aabb.position.x;
const ry = aabb.position.y;
return (
point.x >= rx &&
point.x <= rx + aabb.width &&
point.y >= ry &&
point.y <= ry + aabb.height
);
}
export function circleIntersectCircle(a: Circle, b: Circle): boolean {
const dx = a.position.x - b.position.x;
const dy = a.position.y - b.position.y;
return dx * dx + dy * dy <= (a.radius + b.radius) ** 2;
}
export function AABBIntersectAABB(a: AABB, b: AABB): boolean {
const ax = a.position.x;
const ay = a.position.y;
const bx = b.position.x;
const by = b.position.y;
return (
ax <= bx + b.width &&
ax + a.width >= bx &&
ay <= by + b.height &&
ay + a.height >= by
);
}
export function circleIntersectAABB(circle: Circle, aabb: AABB): boolean {
const cx = circle.position.x;
const cy = circle.position.y;
const rx = aabb.position.x;
const ry = aabb.position.y;
const dx = cx - Math.max(rx, Math.min(cx, rx + aabb.width));
const dy = cy - Math.max(ry, Math.min(cy, ry + aabb.height));
return dx * dx + dy * dy <= circle.radius ** 2;
}
export function circleContainsCircle(a: Circle, b: Circle): boolean {
const dx = a.position.x - b.position.x;
const dy = a.position.y - b.position.y;
const distance = Math.sqrt(dx * dx + dy * dy);
return a.radius >= b.radius + distance;
}
export function AABBContainsAABB(a: AABB, b: AABB): boolean {
const ax = a.position.x;
const ay = a.position.y;
const bx = b.position.x;
const by = b.position.y;
return (
ax <= bx &&
ax + a.width >= bx + b.width &&
ay <= by &&
ay + a.height >= by + b.height
);
}
export function AABBContainsCircle(aabb: AABB, circle: Circle): boolean {
const rx = aabb.position.x;
const ry = aabb.position.y;
const cx = circle.position.x;
const cy = circle.position.y;
return (
rx <= cx - circle.radius &&
rx + aabb.width >= cx + circle.radius &&
ry <= cy - circle.radius &&
ry + aabb.height >= cy + circle.radius
);
}
export function circleContainsAABB(circle: Circle, aabb: AABB): boolean {
const radiusSquare = circle.radius ** 2;
const dax = aabb.position.x - circle.position.x;
const day = aabb.position.y - circle.position.y;
if (dax * dax + day * day > radiusSquare) {
return false;
}
const dbx = aabb.position.x + aabb.width - circle.position.x;
const dby = aabb.position.y - circle.position.y;
if (dbx * dbx + dby * dby > radiusSquare) {
return false;
}
const dcx = aabb.position.x - circle.position.x;
const dcy = aabb.position.y + aabb.height - circle.position.y;
if (dcx * dcx + dcy * dcy > radiusSquare) {
return false;
}
const ddx = aabb.position.x + aabb.width - circle.position.x;
const ddy = aabb.position.y + aabb.height - circle.position.y;
if (ddx * ddx + ddy * ddy > radiusSquare) {
return false;
}
return true;
}