PHP判断4个坐标是否构成矩形

    矩形:矩形对角线相等,且四个角为直角。所以可以根据勾股定理判定。

    思路:首先判断坐标点是否有重复,然后四个坐标点可以求得它们两两之间的距离,只要两条短边的平方相加等于长边平方即可判定它为矩形。

    注意:正方形是特殊的矩形。

<?php
// 获取两个点之间的长度的平方
// 不计算边长是为了后面方便进行比较
function getLength($point1, $point2){
    $res = pow($point1[0]-$point2[0], 2) + pow($point1[1]-$point2[1], 2);
    return $res;
}

function judgeRectangle($point1, $point2, $point3, $point4){
    // 任意两点相同 不可能组成矩形
    if($point1 == $point2 || $point1 == $point3 || $point1 == $point4 || $point2 == $point3 || $point2 == $point4 || $point3 == $point4){
        return false;
    }
    // 将所有边长平方放在一个数组内
    $arr = [];
    $arr[] = getLength($point1, $point2);
    $arr[] = getLength($point1, $point3);
    $arr[] = getLength($point1, $point4);
    $arr[] = getLength($point2, $point3);
    $arr[] = getLength($point2, $point4);
    $arr[] = getLength($point3, $point4);
    // 去重
    $arr = array_unique($arr);
    $arr_count = count($arr);
    // 正方形也是矩形
    if($arr_count == 3 || $arr_count == 2){
        $max_length = max($arr);
        $min_length = min($arr);
        $other_arr = array_diff($arr, [$max_length, $min_length]);
        $other_length = isset($otherArr[0])?$otherArr[0]:$minLength;
        // 勾股定理
        if(($min_length + $other_length) == $max_length){
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

var_dump(judgeRectangle([0,0], [0,6], [2,0], [2,6]));

     调整一下写法:

<?php
// 数组元素两两组合新数组
function getNewArray($array){
    $array2 = [];
    for($i = 0; $i < count($array); $i++){
        for($j=0; $j<count($array)-$i-1; $j++) {
            $array2[] = [$array[$i], $array[$i+$j+1]];
        }
    }
    return $array2;
}
// 获取两个点之间的长度的平方
// 不计算边长是为了后面方便进行比较
function getLength($point1, $point2){
    $res = pow($point1[0]-$point2[0], 2) + pow($point1[1]-$point2[1], 2);
    return $res;
}

function judgeRectangle($point1, $point2, $point3, $point4){
    // 任意两点相同 不可能组成矩形
    $pr = array($point1, $point2, $point3, $point4);
    // 降维判断 不允许有重复坐标
    $jwArr = [];
    foreach ($pr as $v) {
        $v = join(",", $v); // 降维,也可以用implode,将一维数组转换为用逗号连接的字符串
        $jwArr[] = $v;
    }
    $jwArr = array_unique($jwArr);
    if(count($jwArr) != 4){
        return false;
    }
    // 将所有边长平方放在一个数组内
    $arr = [];
    $newArr = getNewArray($pr);
    foreach ($newArr as $val){
        $arr[] = getLength($val[0], $val[1]);
    }
    // 去重
    $arr = array_unique($arr);
    $arrCount = count($arr);
    // 正方形也是矩形
    if($arrCount == 3 || $arrCount == 2){
        $maxLength = max($arr);
        $minLength = min($arr);
        $otherArr = array_diff($arr, [$maxLength, $minLength]);
        $otherLength = isset($otherArr[0])?$otherArr[0]:$minLength;
        // 勾股定理
        if(($minLength + $otherLength) == $maxLength){
            return true;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

var_dump(judgeRectangle([0,0], [0,6], [6,0], [6,6]));

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值