Projeto Hs
Projeto Hs
import CodeWorld
import qualified Data.Text
-- DESENHO DE RETÂNGULOS
atualiza (KeyPress "R") (cs, st, _, pc) = (cs, st, Ret, pc)
-- DESENHO DE CÍRCULOS
atualiza (KeyPress "C") (cs, st, _, pc) = (cs, st, Cir, pc)
-- DESENHO LIVRE
atualiza (KeyPress "D") (cs, st, _, pc) = (cs, st, Dl, pc)
-- MOVIMENTO DE FIGURAS
atualiza (KeyPress "M") (cs, _, _, pc) =
case encontraFigura pc cs of
Just figura -> (cs, MovendoFigura figura, Movendo figura, pc)
Nothing -> (cs, NaoIniciado, Cir, pc)
-- OUTROS
atualiza _ w = w
-- FUNÇÕES AUXILIARES
-- Função que substitui uma figura antiga por uma nova na lista de figuras
replaceFigura :: Figura -> Figura -> [Figura] -> [Figura]
replaceFigura _ _ [] = []
replaceFigura figAntiga figNova (f:fs)
| f == figAntiga = figNova : fs
| otherwise = f : replaceFigura figAntiga figNova fs
-- Verifica se o ponto está dentro de uma figura (círculo, retângulo ou linha)
pontoDentroFigura :: Point -> Figura -> Bool
pontoDentroFigura p (Circulo c r) = vectorLength (vectorDifference p c) <= r
pontoDentroFigura p (Retangulo p1 p2) = dentroRetangulo p p1 p2
pontoDentroFigura p (Linha pontos) = pontoNaLinha p pontos
-- Verifica se o ponto está suficientemente próximo de uma reta definida por dois
pontos
pontoProximoDaReta :: Point -> Point -> Point -> Bool
pontoProximoDaReta (px, py) (x1, y1) (x2, y2) =
let area = abs ((x2 - x1) * (py - y1) - (y2 - y1) * (px - x1))
base = vectorLength (vectorDifference (x1, y1) (x2, y2))
in base /= 0 && area / base < 0.2 -- Verifica se está a uma distância menor
que 0.2 da linha