separating-axis-test
Version:
test for the intersection of convex polytopes in 2d or 3d, computing the minimum translation vector
138 lines (134 loc) • 3.03 kB
JavaScript
var sat3d = require('../3d.js')
var test = require('tape')
test('flat axis-aligned boxes 3d', function (t) {
t.deepEqual(sat3d(
[],
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
0,0,0,0,1,0,1,1,0,1,0,0,
0,0,1,0,1,1,1,1,1,1,0,1
]
},
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
-0.5,0.4,0,0.5,0.4,0,0.5,-0.6,0,-0.5,-0.6,0,
-0.5,0.4,1,0.5,0.4,1,0.5,-0.6,1,-0.5,-0.6,1
]
}
), [0,0.4,0])
t.deepEqual(sat3d(
[],
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
0,0,0,0,1,0,1,1,0,1,0,0,
0,0,1,0,1,1,1,1,1,1,0,1
]
},
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
-0.6,0.5,0,0.4,0.5,0,0.4,-0.5,0,-0.6,-0.5,0,
-0.6,0.5,1,0.4,0.5,1,0.4,-0.5,1,-0.6,-0.5,1
]
}
), [0.4,0,0])
t.deepEqual(sat3d(
[],
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
0,0,0,0,1,0,1,1,0,1,0,0,
0,0,1,0,1,1,1,1,1,1,0,1
]
},
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
-0.4,1.5,0,0.6,1.5,0,0.6,0.5,0,-0.4,0.5,0,
-0.4,1.5,1,0.6,1.5,1,0.6,0.5,1,-0.4,0.5,1
]
}
), [0,-0.5,0])
t.deepEqual(sat3d(
[],
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
0,0,0,0,1,0,1,1,0,1,0,0,
0,0,1,0,1,1,1,1,1,1,0,1
]
},
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
-0.5,1.6,0,0.5,1.6,0,0.5,0.6,0,-0.5,0.6,0,
-0.5,1.6,1,0.5,1.6,1,0.5,0.6,1,-0.5,0.6,1
]
}
), [0,-0.4,0])
t.notOk(sat3d(
[],
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
0,1,0,1,1,0,1,0,0,0,0,0,
0,1,1,1,1,1,1,0,1,0,0,1
]
},
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
-0.5,-0.5,0,0.5,-0.5,0,0.5,-1.5,0,-0.5,-1.5,0,
-0.5,-0.5,1,0.5,-0.5,1,0.5,-1.5,1,-0.5,-1.5,1
]
}
))
t.end()
})
test('flat oriented boxes 3d', function (t) {
var sq22 = Math.sqrt(2)/2
t.deepEqual(roundv3(1000,sat3d(
[],
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
0,1,0,1,1,0,1,0,0,0,0,0,
0,1,1,1,1,1,1,0,1,0,0,1
]
},
{
separatingAxes: [sq22,sq22,0,-sq22,sq22,0,0,0,1],
positions: [
-0.3,0.5,0,+0.2,0.0,0,-0.3,-0.5,0,-0.8,0.0,0,
-0.3,0.5,1,+0.2,0.0,1,-0.3,-0.5,1,-0.8,0.0,1
]
}
)), [0.1,0.1,0])
t.notOk(sat3d(
[],
{
separatingAxes: [0,0,1,0,1,0,1,0,0],
positions: [
0,1,0,1,1,0,1,0,0,0,0,0,
0,1,1,1,1,1,1,0,1,0,0,1
]
},
{
separatingAxes: [sq22,sq22,0,-sq22,sq22,0,0,0,1],
positions: [
-0.3,0.25,0,+0.2,-0.25,0,-0.3,-0.75,0,-0.8,-0.25,0,
-0.3,0.25,1,+0.2,-0.25,1,-0.3,-0.75,1,-0.8,-0.25,1
]
}
))
t.end()
})
function roundv3 (n, v) {
v[0] = Math.round(v[0]*n)/n
v[1] = Math.round(v[1]*n)/n
v[2] = Math.round(v[2]*n)/n
return v
}