一个使用分离轴定理进行简单2D形状碰撞检测的库。

dev-master 2024-03-22 02:28 UTC

This package is not auto-updated.

Last update: 2024-09-20 04:46:32 UTC


README

一个使用分离轴定理进行简单2D形状碰撞检测的库。

简单翻译自JavaScript库并重构为PHP版本。

要求

  • PHP版本5.3.0或更高

安装

composer require huzhihao/sat:dev-master然后从您的代码中引入Composer自动加载器。

使用方法

以下是一些示例,展示了SAT如何工作。要检查两个形状是否碰撞,您可以使用SAT\Collision::XXX函数。并且将提供一个Response对象来检查一个形状是否完全被另一个形状覆盖。

<?php
use SAT\Entity\Circle;
use SAT\Entity\Polygon;
use SAT\Entity\Response;
use SAT\Entity\Vector;
use SAT\Collision;

function dumpR(Response $r){
    echo "overlap:{$r->overlap} overlapV:[{$r->overlapV->x},{$r->overlapV->y}] overlapN:[{$r->overlapN->x},{$r->overlapN->y}] aInB:".($r->aInB?1:0)." bInA:".($r->bInA?1:0)."\n";
}

//pointInCircle
$point = new Vector(1, 1);
$circle = new Circle(new Vector(1, 1), 1);
var_dump(Collision::pointInCircle($point, $circle));

$point = new Vector(1, 2.1);
$circle = new Circle(new Vector(1, 1), 1);
var_dump(Collision::pointInCircle($point, $circle));

//pointInPolygon
$point = new Vector(1, 2.1);
$polygon = new Polygon(null, array(new Vector(3,1), new Vector(3,2), new Vector(2,3), new Vector(1,2),new Vector(1,1),new Vector(2,0)));
var_dump(Collision::pointInPolygon($point, $polygon));

$polygon = new Polygon(new Vector(-1,-1),array(new Vector(1,1),new Vector(1.5,1.5),new Vector(2,1),new Vector(2,2),new Vector(3,2),new Vector(1.5,4),new Vector(1,3),new Vector(1.5,3)));
$point = new Vector(1, 2);
var_dump(Collision::pointInPolygon($point, $polygon));
$point = new Vector(1, 2.5);
var_dump(Collision::pointInPolygon($point, $polygon));

//testCircleCircle
$c1 = new Circle(new Vector(1, 1), 1);
$c2 = new Circle(new Vector(2, 2), 1);
$r = new Response();
var_dump(Collision::testCircleCircle($c1, $c2, $r));
dumpR($r);
$c3 = new Circle(new Vector(3, 1), 0.9);
var_dump(Collision::testCircleCircle($c1, $c3, $r));

$c4 = new Circle( new Vector(0.9,1), 0.1);
var_dump(Collision::testCircleCircle($c1, $c4, $r));
dumpR($r);

//testPolygonCircle
$p1 = new Polygon(new Vector(-1, 0), array(new Vector(3,1), new Vector(3,2), new Vector(2,3), new Vector(1,2),new Vector(1,1),new Vector(2,0)));
$c1 = new Circle(new Vector(0,0), 1/sqrt(2));
$r->clear();
var_dump(Collision::testPolygonCircle($p1, $c1, $r));
dumpR($r);

$c2 = new Circle(new Vector(-0.1,0), 1/sqrt(2));
var_dump(Collision::testPolygonCircle($p1, $c2, $r));

$r->clear();
$c3 = new Circle(new Vector(1,1.5), 1);
var_dump(Collision::testPolygonCircle($p1, $c3, $r));
dumpR($r);

//testCirclePolygon
$r->clear();
var_dump(Collision::testCirclePolygon($c1, $p1, $r));
dumpR($r);

$r->clear();
var_dump(Collision::testCirclePolygon($c3, $p1, $r));
dumpR($r);

$c4 = new Circle(new Vector(1, 1.5), 1.5);
$r->clear();
var_dump(Collision::testCirclePolygon($c4, $p1, $r));
dumpR($r);

//testPolygonPolygon
$p1 = new Polygon(new Vector(-1, 0), array(new Vector(3,1), new Vector(3,2), new Vector(2,3), new Vector(1,2),new Vector(1,1),new Vector(2,0)));
$p2 = new Polygon(new Vector(-0.5, 0.5), array(new Vector(3,1), new Vector(3,2), new Vector(2,3), new Vector(1,2),new Vector(1,1),new Vector(2,0)));
$r->clear();
var_dump(Collision::testPolygonPolygon($p1, $p2, $r));
dumpR($r);

备注:

有关每个类的属性等更多详细信息,请阅读原始JavaScript库的文档