WIP
This commit is contained in:
+32
-32
@@ -1,5 +1,5 @@
|
||||
import type { AABB } from "#/engine/AABB.ts";
|
||||
import type { Circle } from "#/engine/Circle.ts";
|
||||
import type { Rect } from "#/engine/Rect";
|
||||
import type { Vector } from "#/engine/Vector.ts";
|
||||
|
||||
export function isPointInCircle(point: Vector, circle: Circle): boolean {
|
||||
@@ -9,15 +9,15 @@ export function isPointInCircle(point: Vector, circle: Circle): boolean {
|
||||
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;
|
||||
export function isPointInRect(point: Vector, rect: Rect): boolean {
|
||||
const rx = rect.position.x;
|
||||
const ry = rect.position.y;
|
||||
|
||||
return (
|
||||
point.x >= rx &&
|
||||
point.x <= rx + aabb.width &&
|
||||
point.x <= rx + rect.width &&
|
||||
point.y >= ry &&
|
||||
point.y <= ry + aabb.height
|
||||
point.y <= ry + rect.height
|
||||
);
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ export function circleIntersectCircle(a: Circle, b: Circle): boolean {
|
||||
return dx * dx + dy * dy <= (a.radius + b.radius) ** 2;
|
||||
}
|
||||
|
||||
export function AABBIntersectAABB(a: AABB, b: AABB): boolean {
|
||||
export function RectIntersectRect(a: Rect, b: Rect): boolean {
|
||||
const ax = a.position.x;
|
||||
const ay = a.position.y;
|
||||
const bx = b.position.x;
|
||||
@@ -42,14 +42,14 @@ export function AABBIntersectAABB(a: AABB, b: AABB): boolean {
|
||||
);
|
||||
}
|
||||
|
||||
export function circleIntersectAABB(circle: Circle, aabb: AABB): boolean {
|
||||
export function circleIntersectRect(circle: Circle, rect: Rect): boolean {
|
||||
const cx = circle.position.x;
|
||||
const cy = circle.position.y;
|
||||
const rx = aabb.position.x;
|
||||
const ry = aabb.position.y;
|
||||
const rx = rect.position.x;
|
||||
const ry = rect.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));
|
||||
const dx = cx - Math.max(rx, Math.min(cx, rx + rect.width));
|
||||
const dy = cy - Math.max(ry, Math.min(cy, ry + rect.height));
|
||||
|
||||
return dx * dx + dy * dy <= circle.radius ** 2;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ export function circleContainsCircle(a: Circle, b: Circle): boolean {
|
||||
return a.radius >= b.radius + distance;
|
||||
}
|
||||
|
||||
export function AABBContainsAABB(a: AABB, b: AABB): boolean {
|
||||
export function RectContainsRect(a: Rect, b: Rect): boolean {
|
||||
const ax = a.position.x;
|
||||
const ay = a.position.y;
|
||||
const bx = b.position.x;
|
||||
@@ -76,44 +76,44 @@ export function AABBContainsAABB(a: AABB, b: AABB): boolean {
|
||||
);
|
||||
}
|
||||
|
||||
export function AABBContainsCircle(aabb: AABB, circle: Circle): boolean {
|
||||
const rx = aabb.position.x;
|
||||
const ry = aabb.position.y;
|
||||
export function RectContainsCircle(rect: Rect, circle: Circle): boolean {
|
||||
const rx = rect.position.x;
|
||||
const ry = rect.position.y;
|
||||
const cx = circle.position.x;
|
||||
const cy = circle.position.y;
|
||||
|
||||
return (
|
||||
rx <= cx - circle.radius &&
|
||||
rx + aabb.width >= cx + circle.radius &&
|
||||
rx + rect.width >= cx + circle.radius &&
|
||||
ry <= cy - circle.radius &&
|
||||
ry + aabb.height >= cy + circle.radius
|
||||
ry + rect.height >= cy + circle.radius
|
||||
);
|
||||
}
|
||||
|
||||
export function circleContainsAABB(circle: Circle, aabb: AABB): boolean {
|
||||
const radiusSquare = circle.radius ** 2;
|
||||
export function circleContainsRect(circle: Circle, rect: Rect): boolean {
|
||||
const radSquare = 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) {
|
||||
const dax = rect.position.x - circle.position.x;
|
||||
const day = rect.position.y - circle.position.y;
|
||||
if (dax * dax + day * day > radSquare) {
|
||||
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) {
|
||||
const dbx = rect.position.x + rect.width - circle.position.x;
|
||||
const dby = rect.position.y - circle.position.y;
|
||||
if (dbx * dbx + dby * dby > radSquare) {
|
||||
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) {
|
||||
const dcx = rect.position.x - circle.position.x;
|
||||
const dcy = rect.position.y + rect.height - circle.position.y;
|
||||
if (dcx * dcx + dcy * dcy > radSquare) {
|
||||
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) {
|
||||
const ddx = rect.position.x + rect.width - circle.position.x;
|
||||
const ddy = rect.position.y + rect.height - circle.position.y;
|
||||
if (ddx * ddx + ddy * ddy > radSquare) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user