{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}
module Graphics.Implicit.Export.Resolution (estimateResolution) where
import Prelude (min, minimum, sqrt, ($), (*), (**), (-), (/), (>))
import Data.Maybe (Maybe (Just), fromMaybe)
import Graphics.Implicit (unionR)
import Graphics.Implicit.Definitions (SymbolicObj2, SymbolicObj3, ℝ)
import Graphics.Implicit.ExtOpenScad.Definitions (Message, OVal (ONum), VarLookup, lookupVarIn)
import Graphics.Implicit.Primitives (Object (getBox))
import Linear (V2 (V2), V3 (V3))
import Linear.Affine ((.-.))
estimateResolution :: (VarLookup, [SymbolicObj2], [SymbolicObj3], [Message]) -> ℝ
estimateResolution :: (VarLookup, [SymbolicObj2], [SymbolicObj3], [Message]) -> ℝ
estimateResolution (Text -> VarLookup -> Maybe OVal
lookupVarIn Text
"$res" -> Just (ONum ℝ
res), [SymbolicObj2]
_, [SymbolicObj3]
_, [Message]
_) =
ℝ
res
estimateResolution (VarLookup
vars, [SymbolicObj2]
_, SymbolicObj3
obj:[SymbolicObj3]
objs, [Message]
_) =
let
(V3 ℝ
x1 ℝ
y1 ℝ
z1, V3 ℝ
x2 ℝ
y2 ℝ
z2) = forall obj (f :: * -> *) a. Object obj f a => obj -> (f a, f a)
getBox (forall obj (f :: * -> *) a. Object obj f a => ℝ -> [obj] -> obj
unionR ℝ
0 (SymbolicObj3
objforall a. a -> [a] -> [a]
:[SymbolicObj3]
objs))
(V3 ℝ
x ℝ
y ℝ
z) = forall a. a -> a -> a -> V3 a
V3 (ℝ
x2forall a. Num a => a -> a -> a
-ℝ
x1) (ℝ
y2forall a. Num a => a -> a -> a
-ℝ
y1) (ℝ
z2forall a. Num a => a -> a -> a
-ℝ
z1)
in case forall a. a -> Maybe a -> a
fromMaybe (ℝ -> OVal
ONum ℝ
1) forall a b. (a -> b) -> a -> b
$ Text -> VarLookup -> Maybe OVal
lookupVarIn Text
"$quality" VarLookup
vars of
ONum ℝ
qual | ℝ
qual forall a. Ord a => a -> a -> Bool
> ℝ
0 -> forall a. Ord a => a -> a -> a
min (forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [ℝ
x,ℝ
y,ℝ
z]forall a. Fractional a => a -> a -> a
/ℝ
2) ((ℝ
xforall a. Num a => a -> a -> a
*ℝ
yforall a. Num a => a -> a -> a
*ℝ
zforall a. Fractional a => a -> a -> a
/ℝ
qual)forall a. Floating a => a -> a -> a
**(ℝ
1forall a. Fractional a => a -> a -> a
/ℝ
3) forall a. Fractional a => a -> a -> a
/ ℝ
22)
OVal
_ -> forall a. Ord a => a -> a -> a
min (forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [ℝ
x,ℝ
y,ℝ
z]forall a. Fractional a => a -> a -> a
/ℝ
2) ((ℝ
xforall a. Num a => a -> a -> a
*ℝ
yforall a. Num a => a -> a -> a
*ℝ
z)forall a. Floating a => a -> a -> a
**(ℝ
1forall a. Fractional a => a -> a -> a
/ℝ
3) forall a. Fractional a => a -> a -> a
/ ℝ
22)
estimateResolution (VarLookup
vars, SymbolicObj2
obj:[SymbolicObj2]
objs, [SymbolicObj3]
_, [Message]
_) =
let
(V2 ℝ
p1,V2 ℝ
p2) = forall obj (f :: * -> *) a. Object obj f a => obj -> (f a, f a)
getBox (forall obj (f :: * -> *) a. Object obj f a => ℝ -> [obj] -> obj
unionR ℝ
0 (SymbolicObj2
objforall a. a -> [a] -> [a]
:[SymbolicObj2]
objs))
(V2 ℝ
x ℝ
y) = V2 ℝ
p2 forall (p :: * -> *) a. (Affine p, Num a) => p a -> p a -> Diff p a
.-. V2 ℝ
p1
in case forall a. a -> Maybe a -> a
fromMaybe (ℝ -> OVal
ONum ℝ
1) forall a b. (a -> b) -> a -> b
$ Text -> VarLookup -> Maybe OVal
lookupVarIn Text
"$quality" VarLookup
vars of
ONum ℝ
qual | ℝ
qual forall a. Ord a => a -> a -> Bool
> ℝ
0 -> forall a. Ord a => a -> a -> a
min (forall a. Ord a => a -> a -> a
min ℝ
x ℝ
yforall a. Fractional a => a -> a -> a
/ℝ
2) (forall a. Floating a => a -> a
sqrt(ℝ
xforall a. Num a => a -> a -> a
*ℝ
yforall a. Fractional a => a -> a -> a
/ℝ
qual) forall a. Fractional a => a -> a -> a
/ ℝ
30)
OVal
_ -> forall a. Ord a => a -> a -> a
min (forall a. Ord a => a -> a -> a
min ℝ
x ℝ
yforall a. Fractional a => a -> a -> a
/ℝ
2) (forall a. Floating a => a -> a
sqrt(ℝ
xforall a. Num a => a -> a -> a
*ℝ
y) forall a. Fractional a => a -> a -> a
/ ℝ
30)
estimateResolution (VarLookup, [SymbolicObj2], [SymbolicObj3], [Message])
_ =
ℝ
1