Skip to content

Latest commit

 

History

History
86 lines (74 loc) · 2.44 KB

判断4个坐标点能否组成一个矩形.md

File metadata and controls

86 lines (74 loc) · 2.44 KB

判断4个坐标点能否组成一个矩形

描述

给你四个坐标点, 判断它们能否组成一个矩形, 
例如, 判断([0,0], [0,1], [1,1], [1,0])四个坐标点能否组成一个矩形

分析

1. 任意两点间距离为边长, 列出所有边长并放入一个数组中, 对该数组去重, 数组中应该只有3个元素(长方形)或2个元素(正方形)

2. 判断数组里面的元素是否满足勾股定理

代码

<?php

/**
 * 判断四个坐标点能否组成一个矩形
 *
 * @param $point1
 * @param $point2
 * @param $point3
 * @param $point4
 * @return bool
 */
function isRectangle($point1, $point2, $point3, $point4)
{
    // 检查参数
    if ($point1 == $point2 || $point1 == $point3 || $point1 == $point4 || $point2 == $point3 || $point2 == $point4 || $point3 == $point4) {
        return false;
    }

    // 将任意两个坐标点之间距离的平方存入到一个数组中
    $lengthSquareArr = [];
    $lengthSquareArr[] = getLengthSquare($point1, $point2);
    $lengthSquareArr[] = getLengthSquare($point1, $point3);
    $lengthSquareArr[] = getLengthSquare($point1, $point4);
    $lengthSquareArr[] = getLengthSquare($point2, $point3);
    $lengthSquareArr[] = getLengthSquare($point2, $point4);
    $lengthSquareArr[] = getLengthSquare($point3, $point4);

    // 数组去重
    $lengthSquareArr = array_unique($lengthSquareArr);

    $count = count($lengthSquareArr);
    if ($count == 2 || $count == 3) {
        // 判断是不是正方形
        if ($count == 2) {
            // 勾股定理
            return (max($lengthSquareArr) == 2 * min($lengthSquareArr));
        }
        // 判断是不是长方形
        else {
            $maxLengthSquare = max($lengthSquareArr);
            $minLengthSquare = min($lengthSquareArr);
            $otherLengthSquare = array_diff($lengthSquareArr, [$maxLengthSquare, $minLengthSquare]);
            // 勾股定理
            return $minLengthSquare + $otherLengthSquare == $maxLengthSquare;
        }
    } else {
        return false;
    }

}

/**
 * 计算两个坐标点之间距离的平方
 *
 * @param $point1
 * @param $point2
 * @return float|int
 */
function getLengthSquare($point1, $point2)
{
    return pow($point1[0] - $point2[0], 2) + pow($point1[1] - $point2[1], 2);
}

// 测试
var_dump(isRectangle([0,0],[0,1],[1,1],[1,0]));

参考