-- Copyright 2017 Marcelo Garlet Millani -- This file is part of pictikz. -- pictikz is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- pictikz is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- You should have received a copy of the GNU General Public License -- along with pictikz. If not, see . module Pictikz.Geometry where import Data.Matrix data Shape a = Rectangle a a a a | Ellipsis a a a a deriving (Show, Eq) rotate a = fromList 3 3 [cos a, - sin a, 0 ,sin a, cos a, 0 , 0, 0, 1] translate x y = fromList 3 3 [1,0,x ,0,1,y ,0,0,1] skewx a = fromList 3 3 [1, tan a, 0 ,0, 1, 0 ,0, 0, 1] skewy a = fromList 3 3 [1 , 0, 0 ,tan a, 1, 0 ,0 , 0, 1] scale x y = fromList 3 3 [x,0,0 ,0,y,0 ,0,0,1] squareDistance (x0,y0) (Rectangle x y w h) = let dx | x0 >= x && x0 <= x + w = 0 | x0 >= x + w = x0 - (x+w) | x0 < x = x - x0 dy | y0 >= y && y0 <= y + h = 0 | y0 >= y + h = y0 - (y+h) | y0 < y = y - y0 in dx*dx + dy*dy squareDistance (x0,y0) (Ellipsis x1 y1 rx ry) = let dx = (x0 - x1) / rx dy = (y0 - y1) / ry sd = dx*dx + dy*dy in if sd < 1 then 0 else sd distance p0 p1 = sqrt $ squareDistance p0 p1