Source: rmgen/Area.js

/**
 * @file An Area is a set of Vector2D points and a cache to lookup membership quickly.
 */

function Area(points)
{
	this.points = deepfreeze(points);

	let mapSize = g_Map.getSize();

	this.cache = new Array(mapSize).fill(0).map(() => new Uint8Array(mapSize));
	for (let point of points)
		this.cache[point.x][point.y] = 1;
}

Area.prototype.getPoints = function()
{
	return this.points;
};

Area.prototype.contains = function(point)
{
	return g_Map.inMapBounds(point) && this.cache[point.x][point.y] == 1;
};

Area.prototype.getClosestPointTo = function(position)
{
	if (!this.points.length)
		return undefined;

	let closestPoint = this.points[0];
	let shortestDistance = Infinity;

	for (let point of this.points)
	{
		let currentDistance = point.distanceToSquared(position);
		if (currentDistance < shortestDistance)
		{
			shortestDistance = currentDistance;
			closestPoint = point;
		}
	}

	return closestPoint;
};