四个点能否围成正方形
四个点按x排、x相同再按y排,编号p0p1p2p3。不管怎么歪,四条边都是p0p1、p1p3、p3p2、p2p0,对角线是p0p3、p1p2。只要验证四条边相等、两对角线相等。
bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
vector<vector<int>> p = { p1, p2, p3, p4 };
sort(p.begin(), p.end(), [](vector<int> &a, vector<int> &b) {
return a[0] < b[0] || (a[0] == b[0] && a[1] < b[1]);
});
int side = dist(p[0], p[1]);
return side != 0 && side == dist(p[1], p[3]) && side == dist(p[3], p[2]) && side == dist(p[2], p[0])
&& dist(p[0], p[3]) == dist(p[1], p[2]);
}
int dist(vector<int> &a, vector<int> &b) {
return (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);
}