{-# 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) = SymbolicObj3 -> (V3 ℝ, V3 ℝ)
forall obj (f :: * -> *) a. Object obj f a => obj -> (f a, f a)
getBox (ℝ -> [SymbolicObj3] -> SymbolicObj3
forall obj (f :: * -> *) a. Object obj f a => ℝ -> [obj] -> obj
unionR ℝ
0 (SymbolicObj3
objSymbolicObj3 -> [SymbolicObj3] -> [SymbolicObj3]
forall a. a -> [a] -> [a]
:[SymbolicObj3]
objs))
(V3 ℝ
x ℝ
y ℝ
z) = ℝ -> ℝ -> ℝ -> V3 ℝ
forall a. a -> a -> a -> V3 a
V3 (ℝ
x2ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-ℝ
x1) (ℝ
y2ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-ℝ
y1) (ℝ
z2ℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
-ℝ
z1)
in case OVal -> Maybe OVal -> OVal
forall a. a -> Maybe a -> a
fromMaybe (ℝ -> OVal
ONum ℝ
1) (Maybe OVal -> OVal) -> Maybe OVal -> OVal
forall a b. (a -> b) -> a -> b
$ Text -> VarLookup -> Maybe OVal
lookupVarIn Text
"$quality" VarLookup
vars of
ONum ℝ
qual | ℝ
qual ℝ -> ℝ -> Bool
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) ((ℝ
xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
yℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
zℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ℝ
qual)ℝ -> ℝ -> ℝ
forall a. Floating a => a -> a -> a
**(ℝ
1ℝ -> ℝ -> ℝ
forall 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) ((ℝ
xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
yℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
z)ℝ -> ℝ -> ℝ
forall a. Floating a => a -> a -> a
**(ℝ
1ℝ -> ℝ -> ℝ
forall 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) = SymbolicObj2 -> (V2 ℝ, V2 ℝ)
forall obj (f :: * -> *) a. Object obj f a => obj -> (f a, f a)
getBox (ℝ -> [SymbolicObj2] -> SymbolicObj2
forall obj (f :: * -> *) a. Object obj f a => ℝ -> [obj] -> obj
unionR ℝ
0 (SymbolicObj2
objSymbolicObj2 -> [SymbolicObj2] -> [SymbolicObj2]
forall a. a -> [a] -> [a]
:[SymbolicObj2]
objs))
(V2 ℝ
x ℝ
y) = V2 ℝ
p2 V2 ℝ -> V2 ℝ -> Diff V2 ℝ
forall (p :: * -> *) a. (Affine p, Num a) => p a -> p a -> Diff p a
.-. V2 ℝ
p1
in case OVal -> Maybe OVal -> OVal
forall a. a -> Maybe a -> a
fromMaybe (ℝ -> OVal
ONum ℝ
1) (Maybe OVal -> OVal) -> Maybe OVal -> OVal
forall a b. (a -> b) -> a -> b
$ Text -> VarLookup -> Maybe OVal
lookupVarIn Text
"$quality" VarLookup
vars of
ONum ℝ
qual | ℝ
qual ℝ -> ℝ -> Bool
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 ℝ
yℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ℝ
2) (ℝ -> ℝ
forall a. Floating a => a -> a
sqrt(ℝ
xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
yℝ -> ℝ -> ℝ
forall 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 ℝ
yℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ℝ
2) (ℝ -> ℝ
forall a. Floating a => a -> a
sqrt(ℝ
xℝ -> ℝ -> ℝ
forall a. Num a => a -> a -> a
*ℝ
y) ℝ -> ℝ -> ℝ
forall a. Fractional a => a -> a -> a
/ ℝ
30)
estimateResolution (VarLookup, [SymbolicObj2], [SymbolicObj3], [Message])
_ =
ℝ
1