<?php
class SATExamples {
public static function basicCollisionExample() { echo "=== 基本碰撞检测示例 ===\n"; $rect1 = new Polygon([ new Vector2(0, 0), new Vector2(0, 10), new Vector2(10, 10), new Vector2(10, 0) ]); $rect2 = new Polygon([ new Vector2(5, 5), new Vector2(5, 15), new Vector2(15, 15), new Vector2(15, 5) ]); $collision = SATCollisionDetector::checkCollision($rect1, $rect2); echo "矩形1和矩形2碰撞: " . ($collision ? "是" : "否") . "\n"; $rect3 = new Polygon([ new Vector2(20, 20), new Vector2(20, 30), new Vector2(30, 30), new Vector2(30, 20) ]); $collision2 = SATCollisionDetector::checkCollision($rect1, $rect3); echo "矩形1和矩形3碰撞: " . ($collision2 ? "是" : "否") . "\n"; }
public static function mtvExample() { echo "\n=== 最小平移向量示例 ===\n"; $triangle1 = new Polygon([ new Vector2(0, 0), new Vector2(10, 0), new Vector2(5, 8) ]); $triangle2 = new Polygon([ new Vector2(4, 4), new Vector2(14, 4), new Vector2(9, 12) ]); $collisionInfo = SATCollisionDetector::getCollisionInfo($triangle1, $triangle2); if ($collisionInfo['collision']) { echo "三角形发生碰撞!\n"; echo "最小重叠量: " . number_format($collisionInfo['overlap'], 2) . "\n"; echo "最小平移向量: (" . number_format($collisionInfo['mtv']->x, 2) . ", " . number_format($collisionInfo['mtv']->y, 2) . ")\n"; } else { echo "三角形没有碰撞\n"; } }
public static function complexPolygonExample() { echo "\n=== 复杂多边形碰撞检测 ===\n"; $pentagon = new Polygon([ new Vector2(0, 5), new Vector2(4, 9), new Vector2(9, 7), new Vector2(7, 2), new Vector2(2, 0) ]); $hexagon = new Polygon([ new Vector2(5, 3), new Vector2(8, 1), new Vector2(11, 3), new Vector2(11, 7), new Vector2(8, 9), new Vector2(5, 7) ]); $collision = SATCollisionDetector::checkCollision($pentagon, $hexagon); echo "五边形和六边形碰撞: " . ($collision ? "是" : "否") . "\n"; if ($collision) { $info = SATCollisionDetector::getCollisionInfo($pentagon, $hexagon); echo "最小平移向量: (" . number_format($info['mtv']->x, 2) . ", " . number_format($info['mtv']->y, 2) . ")\n"; } }
public static function performanceTest() { echo "\n=== 性能测试 ===\n"; $polygons = []; for ($i = 0; $i < 10; $i++) { $vertices = []; $sides = rand(3, 8); $centerX = rand(0, 100); $centerY = rand(0, 100); $radius = rand(5, 15); for ($j = 0; $j < $sides; $j++) { $angle = 2 * M_PI * $j / $sides; $x = $centerX + $radius * cos($angle); $y = $centerY + $radius * sin($angle); $vertices[] = new Vector2($x, $y); } $polygons[] = new Polygon($vertices); } $startTime = microtime(true); $collisionCount = 0; for ($i = 0; $i < count($polygons); $i++) { for ($j = $i + 1; $j < count($polygons); $j++) { if (SATCollisionDetector::checkCollision($polygons[$i], $polygons[$j])) { $collisionCount++; } } } $endTime = microtime(true); $executionTime = ($endTime - $startTime) * 1000; echo "测试多边形数量: " . count($polygons) . "\n"; echo "多边形对数量: " . (count($polygons) * (count($polygons) - 1) / 2) . "\n"; echo "碰撞对数: " . $collisionCount . "\n"; echo "执行时间: " . number_format($executionTime, 2) . " 毫秒\n"; } }
SATExamples::basicCollisionExample(); SATExamples::mtvExample(); SATExamples::complexPolygonExample(); SATExamples::performanceTest();
?>
|