0votos

Detectando cuadrados en JavaScript

por josejuan hace 6 años

Se puede resolver sólo con sumas y comparaciones. Un cuadrado es un paralelogramo rectángulo, por tanto, cumple que un vértice es la suma de los vectores opuestos (es un paralelogramo) y las longitudes de las componentes opuestas de dichos vectores son iguales (forman un ángulo recto y por tanto es rectángulo).

Escribir una función que, tomando cuatro coordenadas en el plano entero Z^2, indique si forman un cuadrado o no.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function isSquare(p) { 
  var z = p.sort(function(a, b) {return (a.x - b.x) | (a.y - b.y)}); 
  return z[3].x == z[2].x + z[1].x - z[0].x && 
         z[3].y == z[2].y + z[1].y - z[0].y && 
         z[1].x - z[0].x == Math.abs(z[2].y - z[0].y) && 
         z[2].x - z[0].x == Math.abs(z[1].y - z[0].y); 
 
 
// *** testing ************************************************************************************ 
var test = [{s:  true, p: [{x: 0, y: 0}, {x: 0, y: 1}, {x: 1, y:  1}, {x: 1, y:  0}]}, 
            {s:  true, p: [{x: 0, y: 0}, {x: 2, y: 1}, {x: 3, y: -1}, {x: 1, y: -2}]}, 
            {s:  true, p: [{x: 0, y: 0}, {x: 1, y: 1}, {x: 0, y:  1}, {x: 1, y:  0}]}, 
            {s: false, p: [{x: 0, y: 0}, {x: 0, y: 2}, {x: 3, y:  2}, {x: 3, y:  0}]}, 
            {s: false, p: [{x: 0, y: 0}, {x: 6, y: 0}, {x: 3, y:  1}, {x: 3, y: -1}]}, 
            {s: false, p: [{x: 0, y: 0}, {x: 3, y: 4}, {x: 8, y:  4}, {x: 5, y:  0}]}, 
            {s: false, p: [{x: 0, y: 0}, {x: 0, y: 0}, {x: 1, y:  1}, {x: 0, y:  0}]}, 
            {s: false, p: [{x: 0, y: 0}, {x: 0, y: 0}, {x: 1, y:  0}, {x: 0, y:  1}]}]; 
 
test.forEach(function(t) { 
  if(isSquare(t.p) != t.s) { 
    console.log("Test FAIL!"); 
    console.log(t.p); 
}); 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.