Spa*_*ace 4 javascript algorithm polygons
我正在尝试编写我自己的分离轴定理的实现,但是我很难让它按照我的要求准确地工作.我不能肯定地说,但是当形状周围的假想盒子像第一个形状碰撞时,它看起来就像是在发生碰撞.但第二种形状完美无缺.
这是方形的顶点数据(精确坐标):
vertsx = [ 200, 220, 220, 200 ]
vertsy = [ 220, 220, 200, 200 ]
Run Code Online (Sandbox Code Playgroud)
这是测试形状1(相对于鼠标)的顶点数据:
vertsx = [ -10, 0, 10, 10, -10 ]
vertsy = [ -10, -50, -10, 10, 10 ]
Run Code Online (Sandbox Code Playgroud)
最后这里是测试形状2(相对于鼠标)的顶点数据:
vertsx = [ -10, 0, 10, 10, -10 ]
vertsy = [ -10, -20, -10, 10, 10 ]
Run Code Online (Sandbox Code Playgroud)
仅为了澄清,已翻译的坐标是经过测试的坐标,这些坐标的形状已按照所示的坐标进行测试.
这是实际的功能.
function collisionConvexPolygon ( vertsax, vertsay, vertsbx, vertsby ) {
var alen = vertsax.length;
var blen = vertsbx.length;
// Loop for axes in Shape A
for ( var i = 0, j = alen - 1; i < alen; j = i++ ) {
// Get the axis
var vx = vertsax[ j ] - vertsax[ i ];
var vy = -( vertsay[ j ] - vertsay[ i ] );
var len = Math.sqrt( vx * vx + vy * vy );
vx /= len;
vy /= len;
// Project shape A
var max0 = vertsax[ 0 ] * vx + vertsay[ 0 ] * vy, min0 = max0;
for ( k = 1; k < alen; k++ ) {
var proja = vertsax[ k ] * vx + vertsay[ k ] * vy;
if ( proja > max0 ) {
max0 = proja;
}
else if ( proja < min0 ) {
min0 = proja;
}
}
// Project shape B
var max1 = vertsbx[ 0 ] * vx + vertsby[ 0 ] * vy, min1 = max1;
for ( var k = 1; k < blen; k++ ) {
var projb = vertsbx[ k ] * vx + vertsby[ k ] * vy;
if ( projb > max1 ) {
max1 = projb;
}
else if ( projb < min1 ) {
min1 = projb;
}
}
// Test for gaps
if ( !axisOverlap( min0, max0, min1, max1 ) ) {
return false;
}
}
// Loop for axes in Shape B (same as above)
for ( var i = 0, j = blen - 1; i < blen; j = i++ ) {
var vx = vertsbx[ j ] - vertsbx[ i ];
var vy = -( vertsby[ j ] - vertsby[ i ] );
var len = Math.sqrt( vx * vx + vy * vy );
vx /= len;
vy /= len;
var max0 = vertsax[ 0 ] * vx + vertsay[ 0 ] * vy, min0 = max0;
for ( k = 1; k < alen; k++ ) {
var proja = vertsax[ k ] * vx + vertsay[ k ] * vy;
if ( proja > max0 ) {
max0 = proja;
}
else if ( proja < min0 ) {
min0 = proja;
}
}
var max1 = vertsbx[ 0 ] * vx + vertsby[ 0 ] * vy, min1 = max1;
for ( var k = 1; k < blen; k++ ) {
var projb = vertsbx[ k ] * vx + vertsby[ k ] * vy;
if ( projb > max1 ) {
max1 = projb;
}
else if ( projb < min1 ) {
min1 = projb;
}
}
if ( !axisOverlap( min0, max0, min1, max1 ) ) {
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
如果你需要我,我会尝试其他形状.
这是我的axisOverlap
功能.
function axisOverlap ( a0, a1, b0, b1 ) {
return !( a0 > b1 || b0 > a1 );
}
Run Code Online (Sandbox Code Playgroud)
我想到了!
我开始在纸上绘制数字线,并意识到问题是我的轴没有正确计算.要计算垂直向量,你需要交换x和y坐标,然后THEN反转一个,我完全忘记交换坐标.
新代码
var vx = vertsay[ i ] - vertsay[ j ];
var vy = -( vertsax[ i ] - vertsax[ j ] );
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1743 次 |
最近记录: |