huzhihao / sat
一个使用分离轴定理进行简单2D形状碰撞检测的库。
dev-master
2024-03-22 02:28 UTC
Requires
- php: >=5.3.0
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库的文档。