How to check intersection between 2 rotated rectangles?

前端 未结 11 1748
囚心锁ツ
囚心锁ツ 2020-11-27 04:18

Can someone explain how to check if one rotated rectangle intersect other rectangle?

11条回答
  •  粉色の甜心
    2020-11-27 04:37

    Maybe it will help someone. The same algorithm in PHP:

    function isPolygonsIntersecting($a, $b) {
        $polygons = array($a, $b);
    
        for ($i = 0; $i < count($polygons); $i++) {
            $polygon = $polygons[$i];
    
            for ($i1 = 0; $i1 < count($polygon); $i1++) {
                $i2 = ($i1 + 1) % count($polygon);
                $p1 = $polygon[$i1];
                $p2 = $polygon[$i2];
    
                $normal = array(
                    "x" => $p2["y"] - $p1["y"], 
                    "y" => $p1["x"] - $p2["x"]
                );
    
                $minA = NULL; $maxA = NULL;
                for ($j = 0; $j < count($a); $j++) {
                    $projected = $normal["x"] * $a[$j]["x"] + $normal["y"] * $a[$j]["y"];
                    if (!isset($minA) || $projected < $minA) {
                        $minA = $projected;
                    }
                    if (!isset($maxA) || $projected > $maxA) {
                        $maxA = $projected;
                    }
                }
    
                $minB = NULL; $maxB = NULL;
                for ($j = 0; $j < count($b); $j++) {
                    $projected = $normal["x"] * $b[$j]["x"] + $normal["y"] * $b[$j]["y"];
                    if (!isset($minB) || $projected < $minB) {
                        $minB = $projected;
                    }
                    if (!isset($maxB) || $projected > $maxB) {
                        $maxB = $projected;
                    }
                }
    
                if ($maxA < $minB || $maxB < $minA) {
                    return false;
                }
            }
        }
    
        return true;
    }
    

提交回复
热议问题