import Data.List (sort, tails)
esCuadrado :: (Num a, Ord a) => (a,a) -> (a,a) -> (a,a) -> (a,a) -> Bool
esCuadrado p q r s = and [a == b, b == c, c == d, e == f, a + b == e]
where [a,b,c,d,e,f] = sort (distancias p q r s)
-- (distancias p q r s) es la lista de los cuadrados de las longitudes
-- de los lados y de las diagonales del cuadrilátero cuyos vértices son
-- los puntos p, q, r y s. Por ejemplo,
-- distancias (0,0) (0,1) (1,1) (1,0) == [1,2,1,1,2,1]
-- distancias (0,0) (3,4) (8,4) (5,0) == [25,80,25,25,20,25]
-- distancias (0,0) (0,2) (3,2) (3,0) == [4,13,9,9,13,4]
-- distancias (0,0) (0,0) (1,1) (0,0) == [0,2,0,2,0,2]
-- distancias (0,0) (0,0) (1,0) (0,1) == [0,1,1,1,1,2]
distancias :: Num a => (a,a) -> (a,a) -> (a,a) -> (a,a) -> [a]
distancias p q r s =
[l | (h:t) <- tails [p,q,r,s], l <- map (dist h) t]
-- (dist p q) es el cuadrado de la distancia del punto p al q. Por
-- ejemplo,
-- dist (6,4) (3,8) == 25
dist :: Num a => (a,a) -> (a,a) -> a
dist (x1,y1) (x2,y2) = (x2-x1)^2 + (y2-y1)^2 |
4 soluciones de “Vértices de un cuadrado”