算法渣渣表示采用暴力判断,没有封装,看起来很丑。。。
简单的用沟谷定理判断直角,用两边相等判断非长方形。
不过这里不需要开根号,因为开根号导致精度问题后面反而会出错。
function cube(arr){ var len = arr.length; if(len != 4){ return false; } var commonLen; //判断后面一次过程的共同边长是否和前一次相同 var len1 = Math.pow((arr[0][0]-arr[1][0]),2) + Math.pow((arr[0][1]-arr[1][1]),2); var len2 = Math.pow((arr[1][0]-arr[2][0]),2) + Math.pow((arr[1][1]-arr[2][1]),2); var len3 = Math.pow((arr[0][0]-arr[2][0]),2) + Math.pow((arr[0][1]-arr[2][1]),2);
//随便取三个点判断是否有边长相等并且角为直角 if(len1 != len2 && len1 != len3 && len2 != len3){ return false; }else{ if(len1 == len2 && len1 != len3){ if(len1 +len2 != len3){ return false; }else{ commonLen = len1; } } else if(len1 == len3 && len1 != len2){ if(len1 + len3 != len2){ return false; }else{ commonLen = len1; } } else if(len3 == len2 && len3 != len1){ if(len3 + len2 != len1){ return false; }else{ commonLen = len3; } } else{ return false; } } var len4 = Math.pow((arr[1][0]-arr[2][0]),2) + Math.pow((arr[1][1]-arr[2][1]),2); var len5 = Math.pow((arr[1][0]-arr[3][0]),2) + Math.pow((arr[1][1]-arr[3][1]),2); var len6 = Math.pow((arr[3][0]-arr[2][0]),2) + Math.pow((arr[3][1]-arr[2][1]),2); if(len4 != len5 && len4 != len6 && len5 != len6){ return false; }else{ if(len4 == len5 && len4 != len6){ if(len4 + len5 != len6){ return false; }else if(len4 != commonLen){ return false; } } else if(len4 == len6 && len4 != len5){ if(len4 + len6 != len5){ return false; }else if(len4 != commonLen){ return false; } } else if(len5 == len6 && len5 != len4){ if(len5 + len6 != len4){ return false; }else if(len5 != commonLen){ return false; } } else{ return false; } } return true; } console.log(cube([[1,3],[2,1],[4,2],[3,4]]));