
class Solution {
public:
bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
// 依次取得四条边的长度,注意如果任意三条边组合等腰三角形,那等腰三角形的直角边长是相等的,任意返回一个就好。
long l1 = get(p1, p2, p3), l2 = get(p1, p2, p4), l3 = get(p1, p3, p4), l4 = get(p2, p3, p4);
// ~l1 避免矩形,此时返回的值都为-1,
return l1 == l2 && l1 == l3 && l1 == l4 && ~l1;
}
long dis(vector<int>& p1, vector<int>& p2) {
long dx = p1[0] - p2[0], dy = p1[1] - p2[1];
return dx * dx + dy * dy;
}
long get(vector<int>& p1, vector<int>& p2, vector<int>& p3) {
// 正方形任意三点可以组成等腰直角三角形
long l1 = dis(p1, p2), l2 = dis(p1, p3), l3 = dis(p2, p3);
// 选出等腰直角三角形的两条直角边,分别保存在了l1和l2中
if (l3 < l1) swap(l3, l1);
if (l3 < l2) swap(l3, l2);
/*
以下三种情况不等组成等腰直角三角形
(1)两条直角边不相等
(2) 不符合勾股定理
(3)存在重合点
*/
if (l1 != l2 || l1 + l2 != l3 || !l1) return -1;
return l1;
}
};