Skip to content

Commit d61bcad

Browse files
committed
Added LineToCircle intersection method.
1 parent 7bcdf66 commit d61bcad

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Based on code by Matt DesLauriers
2+
// https://github.com/mattdesl/line-circle-collision/blob/master/LICENSE.md
3+
4+
var Contains = require('../circle/Contains');
5+
6+
var tmp = { x: 0, y: 0 };
7+
8+
var LineToCircle = function (line, circle, nearest)
9+
{
10+
if (nearest === undefined) { nearest = tmp; }
11+
12+
if (Contains(circle, line.x1, line.y1))
13+
{
14+
nearest.x = line.x1;
15+
nearest.y = line.y1;
16+
17+
return true;
18+
}
19+
20+
if (Contains(circle, line.x2, line.y2))
21+
{
22+
nearest.x = line.x2;
23+
nearest.y = line.y2;
24+
25+
return true;
26+
}
27+
28+
var dx = line.x2 - line.x1;
29+
var dy = line.y2 - line.y1;
30+
31+
var lcx = circle.x - line.x1;
32+
var lcy = circle.y - line.y1;
33+
34+
// project lc onto d, resulting in vector p
35+
var dLen2 = (dx * dx) + (dy * dy);
36+
var px = dx;
37+
var py = dy;
38+
39+
if (dLen2 > 0)
40+
{
41+
var dp = ((lcx * dx) + (lcy * dy)) / dLen2;
42+
43+
px *= dp;
44+
py *= dp;
45+
}
46+
47+
nearest.x = line.x1 + px;
48+
nearest.y = line.y1 + py;
49+
50+
// len2 of p
51+
var pLen2 = (px * px) + (py * py);
52+
53+
return (
54+
pLen2 <= dLen2 &&
55+
((px * dx) + (py * dy)) >= 0 &&
56+
Contains(circle, nearest.x, nearest.y)
57+
);
58+
};
59+
60+
module.exports = LineToCircle;

v3/src/geom/intersects/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
// Phaser.Geom.Intersects
12

23
module.exports = {
34

45
CircleToCircle: require('./CircleToCircle'),
56
CircleToRectangle: require('./CircleToRectangle'),
67
GetRectangleIntersection: require('./GetRectangleIntersection'),
8+
LineToCircle: require('./LineToCircle'),
79
LineToLine: require('./LineToLine'),
810
LineToRectangle: require('./LineToRectangle'),
911
PointToLine: require('./PointToLine'),

0 commit comments

Comments
 (0)