题意
给4个点的坐标,判断能不能形成正方形
解决思路
取第一个点为基点,向另外3个点划线,3根的长度不是 1 : 1 : 根号2 的优先淘汰。
对3根线排序,获取第一个点的假想对角点,算作point1,计算point1跟另外2个点的距离,不相等的也out。
获取point1根第一个点的距离,如果跟之前3根线中最长线长度不一致,也out。
剩下的都通过。
tricky
javascript的浮点数运算很麻烦, 还好有大牛提供的方法:
function strip(num, precision = 12) {
return +parseFloat(num.toPrecision(precision));
}
源码
/**
* @param {number[]} p1
* @param {number[]} p2
* @param {number[]} p3
* @param {number[]} p4
* @return {boolean}
*/
var validSquare = function(p1, p2, p3, p4) {
if((p1[0] === p2[0]) && (p2[0] === p3[0]) && (p3[0] === p4[0]) && (p1[1] === p2[1]) && (p2[1] === p3[1]) && (p3[1] === p4[1])){
return false;
}
function strip(num, precision = 12) {
return +parseFloat(num.toPrecision(precision));
}
let line1 = Math.sqrt(Math.pow((p1[0] - p2[0]), 2) + Math.pow((p1[1] - p2[1]), 2));
let line2 = Math.sqrt(Math.pow((p1[0] - p3[0]), 2) + Math.pow((p1[1] - p3[1]), 2));
let line3 = Math.sqrt(Math.pow((p1[0] - p4[0]), 2) + Math.pow((p1[1] - p4[1]), 2));
let list = [{
keyA: 1,
keyB: 2,
value: line1
}, {
keyA: 1,
keyB: 3,
value: line2
}, {
keyA: 1,
keyB: 4,
value: line3
}];
list.sort((a, b) => a.value - b.value);
if(strip(list[0].value) !== strip(list[1].value)){
return false;
}
if(strip(Math.sqrt(2) * list[1].value) !== strip(list[2].value)){
return false;
}
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
this.p4 = p4;
let point1 = this['p' + list[2].keyB];
let point2 = this['p' + list[0].keyB];
let point3 = this['p' + list[1].keyB];
let line4 = Math.sqrt(Math.pow((point1[0] - point2[0]), 2) + Math.pow((point1[1] - point2[1]), 2));
let line5 = Math.sqrt(Math.pow((point1[0] - point3[0]), 2) + Math.pow((point1[1] - point3[1]), 2));
if(strip(line4) !== strip(line5)){
return false;
}
let line6 = Math.sqrt(Math.pow((point1[0] - p1[0]), 2) + Math.pow((point1[1] - p1[1]), 2));
if(strip(line6) !== strip(list[2].value)){
return false;
}
return true;
};