Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
FogNetwork
GitHub Repository: FogNetwork/Tsunami
Path: blob/main/public/games/files/garbage-collector/js/geometry/intersection.js
1036 views
1
/*globals define*/
2
define([
3
'utils'
4
], function( Utils ) {
5
'use strict';
6
7
/**
8
* Return if the two axis-aligned bounding-boxes intersect.
9
*/
10
function aabb( a, b ) {
11
return a.xmin <= b.xmax &&
12
a.xmax >= b.xmin &&
13
a.ymin <= b.ymax &&
14
a.ymax >= b.ymin;
15
}
16
17
function linesParameter( x0, y0, x1, y1, x2, y2, x3, y3 ) {
18
var det = ( x1 - x0 ) * ( y3 - y2 ) - ( x3 - x2 ) * ( y1 - y0 );
19
if ( !det ) {
20
return null;
21
}
22
23
return ( ( x3 - x2 ) * ( y0 - y2 ) - ( y3 - y2 ) * ( x0 - x2 ) ) / det;
24
}
25
26
function lines( x0, y0, x1, y1, x2, y2, x3, y3 ) {
27
var t = linesParameter( x0, y0, x1, y1, x2, y2, x3, y3 );
28
return Utils.lerp2d( x0, y0, x1, y1, t );
29
}
30
31
function segmentsParameter( x0, y0, x1, y1, x2, y2, x3, y3 ) {
32
var s = linesParameter( x0, y0, x1, y1, x2, y2, x3, y3 ),
33
t = linesParameter( x2, y2, x3, y3, x0, y0, x1, y1 );
34
35
if ( s === null || t === null ) {
36
return null;
37
}
38
39
if ( 0 > s || s > 1 ||
40
0 > t || t > 1 ) {
41
return null;
42
}
43
44
return t;
45
}
46
47
function segments( x0, y0, x1, y1, x2, y2, x3, y3 ) {
48
var t = segmentsParameter( x0, y0, x1, y1, x2, y2, x3, y3 );
49
return Utils.lerp2d( x0, y0, x1, y1, t );
50
}
51
52
function lineCircleParameter( x0, y0, x1, y1, cx, cy, r ) {
53
var dx = x1 - x0,
54
dy = y1 - y0;
55
56
// Transform line to circle space.
57
x0 -= cx;
58
y0 -= cy;
59
60
// Compute coefficients.
61
var a = ( dx * dx ) + ( dy * dy );
62
var b = 2 * ( x0 * dx + y0 * dy );
63
var c = ( x0 * x0 ) + ( y0 * y0 ) - ( r * r );
64
65
// Compute discriminant.
66
var d = b * b - 4 * a * c;
67
68
// No intersection.
69
if ( d < 0 ) {
70
return [];
71
}
72
73
// One intersection.
74
if ( !d ) {
75
return [ -b / ( 2 * a ) ];
76
}
77
78
d = Math.sqrt( d );
79
80
// Two intersections.
81
return [
82
( -b - d ) / ( 2 * a ),
83
( -b + d ) / ( 2 * a )
84
];
85
}
86
87
function lineCircle( x0, y0, x1, y1, cx, cy, r ) {
88
return lineCircleParameter( x0, y0, x1, y1, cx, cy, r ).map(function( t ) {
89
return Utils.lerp2d( x0, y0, x1, y1, t );
90
});
91
}
92
93
function segmentCircleParameter( x0, y0, x1, y1, cx, cy, r ) {
94
return lineCircleParameter( x0, y0, x1, y1, cx, cy, r ).filter(function( t ) {
95
return 0 <= t && t <= 1;
96
});
97
}
98
99
function segmentCircle( x0, y0, x1, y1, cx, cy, r ) {
100
return segmentCircleParameter( x0, y0, x1, y1, cx, cy, r ).map(function( t ) {
101
return Utils.lerp2d( x0, y0, x1, y1, t );
102
});
103
}
104
105
function closestPointOnLineParameter( x, y, x0, y0, x1, y1 ) {
106
var dx = x1 - x0,
107
dy = y1 - y0;
108
109
// Check for line degeneracy.
110
if ( !dx && !dy ) {
111
return null;
112
}
113
114
var lengthSquared = dx * dx + dy * dy;
115
116
return ( ( x - x0 ) * ( x1 - x0 ) + ( y - y0 ) * ( y1 - y0 ) ) / lengthSquared;
117
}
118
119
function closestPointOnLine( x, y, x0, y0, x1, y1 ) {
120
var t = closestPointOnLineParameter( x, y, x0, y0, x1, y1 );
121
return Utils.lerp2d( x0, y0, x1, y1, t );
122
}
123
124
function closestPointOnSegment( x, y, x0, y0, x1, y1 ) {
125
var t = closestPointOnLineParameter( x, y, x0, y0, x1, y1 );
126
127
if ( 0 > t ) {
128
return {
129
x: x0,
130
y: y0
131
};
132
}
133
134
if ( t > 1 ) {
135
return {
136
x: x1,
137
y: y1
138
};
139
}
140
141
return Utils.lerp2d( x0, y0, x1, y1, t );
142
}
143
144
function closestPointOnCircle( x, y, cx, cy, radius ) {
145
var angle = Utils.angleFrom( cx, cy, x, y );
146
return {
147
x: cx + Math.cos( angle ) * radius,
148
y: cy + Math.sin( angle ) * radius
149
};
150
}
151
152
return {
153
aabb: aabb,
154
155
linesParameter: linesParameter,
156
lines: lines,
157
158
segmentsParameter: segmentsParameter,
159
segments: segments,
160
161
lineCircleParameter: lineCircleParameter,
162
lineCircle: lineCircle,
163
164
segmentCircleParameter: segmentCircleParameter,
165
segmentCircle: segmentCircle,
166
167
closestPointOnLineParameter: closestPointOnLineParameter,
168
closestPointOnLine: closestPointOnLine,
169
closestPointOnSegment: closestPointOnSegment,
170
171
closestPointOnCircle: closestPointOnCircle
172
};
173
});
174
175