mirror of
https://github.com/gooba42/adventureland.git
synced 2026-10-14 10:33:47 -05:00
Merge pull request #179 from earthiverse/distance
simplify distance calculation
This commit is contained in:
+25
-63
@@ -615,75 +615,37 @@ function within_xy_range(observer,entity)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// function distance(a,b) // refactored in_check / removed it [07/05/22]
|
function distance(a, b) {
|
||||||
// {
|
|
||||||
// if(!a || !b) 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(get_width(a) && get_width(b))
|
|
||||||
// {
|
|
||||||
// var min_d=99999999,a_w=get_width(a),a_h=get_height(a),b_w=get_width(b),b_h=get_height(b),dist;
|
|
||||||
// // a_h*=0.75; b_h*=0.75; // This seems better, thanks to draw_circle REVISIT!!
|
|
||||||
// var a_x=get_x(a),a_y=get_y(a),b_x=get_x(b),b_y=get_y(b);
|
|
||||||
// // [{x:a_x-a_w/2,y:a_y},{x:a_x+a_w/2,y:a_y},{x:a_x+a_w/2,y:a_y-a_h},{x:a_x-a_w/2,y:a_y-a_h}].forEach(function(p1){
|
|
||||||
// // [{x:b_x-b_w/2,y:b_y},{x:b_x+b_w/2,y:b_y},{x:b_x+b_w/2,y:b_y-b_h},{x:b_x-b_w/2,y:b_y-b_h}].forEach(function(p2){
|
|
||||||
// // dist=simple_distance(p1,p2);
|
|
||||||
// // if(dist<min_d) min_d=dist;
|
|
||||||
// // })
|
|
||||||
// // });
|
|
||||||
// [{x:a_x-a_w/2,y:a_y-a_h/2},{x:a_x+a_w/2,y:a_y-a_h/2},{x:a_x,y:a_y},{x:a_x,y:a_y-a_h}].forEach(function(p1){
|
|
||||||
// [{x:b_x-b_w/2,y:b_y-b_h/2},{x:b_x+b_w/2,y:b_y-b_h/2},{x:b_x,y:b_y},{x:b_x,y:b_y-b_h}].forEach(function(p2){
|
|
||||||
// dist=simple_distance(p1,p2);
|
|
||||||
// if(dist<min_d) min_d=dist;
|
|
||||||
// })
|
|
||||||
// });
|
|
||||||
// // console.log(min_d);
|
|
||||||
// return min_d;
|
|
||||||
// }
|
|
||||||
// return simple_distance(a,b);
|
|
||||||
// }
|
|
||||||
|
|
||||||
function distance(_a, _b, in_check) {
|
|
||||||
// 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.sqrt(dx * dx + dy * 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
|
||||||
|
|||||||
Reference in New Issue
Block a user