phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
97 lines (80 loc) • 2.77 kB
JavaScript
/**
* @author Richard Davey
* @copyright 2013-2025 Phaser Studio Inc.
* @license {@link https://opensource.org/licenses/MIT|MIT License}
*/
var Vector4 = require('../../math/Vector4');
var GetLineToPolygon = require('./GetLineToPolygon');
var Line = require('../line/Line');
// Temp calculation segment
var segment = new Line();
/**
* @ignore
*/
function CheckIntersects (angle, x, y, polygons, intersects)
{
var dx = Math.cos(angle);
var dy = Math.sin(angle);
segment.setTo(x, y, x + dx, y + dy);
var closestIntersect = GetLineToPolygon(segment, polygons, true);
if (closestIntersect)
{
intersects.push(new Vector4(closestIntersect.x, closestIntersect.y, angle, closestIntersect.w));
}
}
/**
* @ignore
*/
function SortIntersects (a, b)
{
return a.z - b.z;
}
/**
* Projects rays out from the given point to each line segment of the polygons.
*
* If the rays intersect with the polygons, the points of intersection are returned in an array.
*
* If no intersections are found, the returned array will be empty.
*
* Each Vector4 intersection result has the following properties:
*
* The `x` and `y` components contain the point of the intersection.
* The `z` component contains the angle of intersection.
* The `w` component contains the index of the polygon, in the given array, that triggered the intersection.
*
* @function Phaser.Geom.Intersects.GetRaysFromPointToPolygon
* @since 3.50.0
*
* @param {number} x - The x coordinate to project the rays from.
* @param {number} y - The y coordinate to project the rays from.
* @param {Phaser.Geom.Polygon | Phaser.Geom.Polygon[]} polygons - A single polygon, or array of polygons, to check against the rays.
*
* @return {Phaser.Math.Vector4[]} An array containing all intersections in Vector4s.
*/
var GetRaysFromPointToPolygon = function (x, y, polygons)
{
if (!Array.isArray(polygons))
{
polygons = [ polygons ];
}
var intersects = [];
var angles = [];
for (var i = 0; i < polygons.length; i++)
{
var points = polygons[i].points;
for (var p = 0; p < points.length; p++)
{
var angle = Math.atan2(points[p].y - y, points[p].x - x);
if (angles.indexOf(angle) === -1)
{
// +- 0.00001 rads to catch lines behind segment corners
CheckIntersects(angle, x, y, polygons, intersects);
CheckIntersects(angle - 0.00001, x, y, polygons, intersects);
CheckIntersects(angle + 0.00001, x, y, polygons, intersects);
angles.push(angle);
}
}
}
return intersects.sort(SortIntersects);
};
module.exports = GetRaysFromPointToPolygon;