simplify distance calculation

This commit is contained in:
Kent Rasmussen
2025-05-22 14:58:06 +09:00
parent 23e4ce8c8c
commit 2c7b794d74
+25 -35
View File
@@ -643,47 +643,37 @@ function within_xy_range(observer,entity)
// return simple_distance(a,b); // return simple_distance(a,b);
// } // }
function distance(_a, _b, in_check) { function distance(a, b) {
// https://discord.com/channels/238332476743745536/1025784763958693958 // https://discord.com/channels/238332476743745536/1025784763958693958
if (!_a || !_b) return 99999999; if (!a || !b) return 99999999;
if ("in" in _a && "in" in _b && _a.in != _b.in) return 99999999; if ("in" in a && "in" in b && a.in != b.in) return 99999999;
if ("map" in _a && "map" in _b && _a.map != _b.map) return 99999999; if ("map" in a && "map" in b && a.map != b.map) return 99999999;
const a_x = get_x(_a) const a_x = get_x(a);
const a_y = get_y(_a) const a_y = get_y(a);
const b_x = get_x(_b) const b_x = get_x(b);
const b_y = get_y(_b) const b_y = get_y(b);
const a_w2 = get_width(_a) / 2 const aHalfWidth = get_width(a) / 2;
const a_h = get_height(_a) const aHeight = get_height(a);
const b_w2 = get_width(_b) / 2 const bHalfWidth = get_width(b) / 2;
const b_h = get_height(_b) const bHeight = get_height(b);
// Check if they're just 2 points // Compute bounds of each rectangle
if(a_w2 == 0 && a_h == 0 && b_w2 == 0 && b_h == 0) return Math.hypot(a_x - b_x, a_y - b_y) const aLeft = a_x - aHalfWidth;
const aRight = a_x + aHalfWidth;
const aTop = a_y - aHeight;
const aBottom = a_y;
// Check overlap const bLeft = b_x - bHalfWidth;
if ((a_x - a_w2) <= (b_x + b_w2) const bRight = b_x + bHalfWidth;
&& (a_x + a_w2) >= (b_x - b_w2) const bTop = b_y - bHeight;
&& (a_y) >= (b_y - b_h) const bBottom = b_y;
&& (a_y - a_h) <= (b_y) ) return 0
// TODO: If one is just a single point, we're computing 8 needless calculations. const dx = Math.max(bLeft - aRight, aLeft - bRight, 0);
// Compare the 4 corners to each other const dy = Math.max(bTop - aBottom, aTop - bBottom, 0);
let min = 99999999
for(const a_c of [{ x: a_x + a_w2, y: a_y - a_h}, return Math.hypot(dx, dy);
{ x: a_x + a_w2, y: a_y},
{ x: a_x - a_w2, y: a_y - a_h},
{ x: a_x - a_w2, y: a_y}]) {
for(const b_c of [{ x: b_x + b_w2, y: b_y - b_h},
{ x: b_x + b_w2, y: b_y},
{ x: b_x - b_w2, y: b_y - b_h},
{ x: b_x - b_w2, y: b_y}]) {
const d = Math.hypot(a_c.x - b_c.x, a_c.y - b_c.y)
if(d < min) min = d
}
}
return min
} }
function random_away(x,y,R) // https://stackoverflow.com/a/5838055/914546 function random_away(x,y,R) // https://stackoverflow.com/a/5838055/914546