1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
| <?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();
?>
|