{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Graphics.Implicit.ObjectUtil.GetImplicitShared (getImplicitShared, normalize) where
import {-# SOURCE #-} Graphics.Implicit.Primitives (Object(getImplicit'))
import Prelude (flip, (-), (*), (>), (<), (&&), (/), product, abs, (**), fmap, (.), negate, ($), const)
import Graphics.Implicit.Definitions
( objectRounding, ObjectContext, SharedObj(Empty, Full, Complement, UnionR, IntersectR, DifferenceR, Translate, Scale, Mirror, Shell, Outset, EmbedBoxedObj, WithRounding), ComponentWiseMultable((⋯/)), ℝ, minℝ )
import Graphics.Implicit.MathUtil (infty, rmax, rmaximum, rminimum, reflect)
import Graphics.Implicit.ObjectUtil.GetBoxShared (VectorStuff(elements, uniformV))
import Linear (Metric(dot))
normalize
:: forall f
. (VectorStuff (f ℝ), Metric f)
=> f ℝ
-> ℝ
normalize :: forall (f :: * -> *). (VectorStuff (f ℝ), Metric f) => f ℝ -> ℝ
normalize f ℝ
v =
let all1s :: f ℝ
all1s = forall vec. VectorStuff vec => ℝ -> vec
uniformV @(f ℝ) ℝ
1
in forall a. Num a => a -> a
abs (forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product (forall vec. VectorStuff vec => vec -> [ℝ]
elements f ℝ
v)) forall a. Floating a => a -> a -> a
** (ℝ
1 forall a. Fractional a => a -> a -> a
/ (f ℝ
all1s forall (f :: * -> *) a. (Metric f, Num a) => f a -> f a -> a
`dot` f ℝ
all1s))
getImplicitShared
:: forall obj f
. ( Object obj f ℝ
, VectorStuff (f ℝ)
, ComponentWiseMultable (f ℝ)
, Metric f
)
=> ObjectContext
-> SharedObj obj f ℝ
-> f ℝ
-> ℝ
getImplicitShared :: forall obj (f :: * -> *).
(Object obj f ℝ, VectorStuff (f ℝ), ComponentWiseMultable (f ℝ),
Metric f) =>
ObjectContext -> SharedObj obj f ℝ -> f ℝ -> ℝ
getImplicitShared ObjectContext
_ SharedObj obj f ℝ
Empty = forall a b. a -> b -> a
const forall t. Fractional t => t
infty
getImplicitShared ObjectContext
_ SharedObj obj f ℝ
Full = forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ -forall t. Fractional t => t
infty
getImplicitShared ObjectContext
ctx (Complement obj
symbObj) =
forall a. Num a => a -> a
negate forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
ctx obj
symbObj
getImplicitShared ObjectContext
ctx (UnionR ℝ
r [obj]
symbObjs) = \f ℝ
p ->
ℝ -> [ℝ] -> ℝ
rminimum ℝ
r forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> b -> a -> c
flip (forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
ctx) f ℝ
p) [obj]
symbObjs
getImplicitShared ObjectContext
ctx (IntersectR ℝ
r [obj]
symbObjs) = \f ℝ
p ->
ℝ -> [ℝ] -> ℝ
rmaximum ℝ
r forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> b -> a -> c
flip (forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
ctx) f ℝ
p) [obj]
symbObjs
getImplicitShared ObjectContext
ctx (DifferenceR ℝ
_ obj
symbObj []) =
forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
ctx obj
symbObj
getImplicitShared ObjectContext
ctx (DifferenceR ℝ
r obj
symbObj [obj]
symbObjs) =
let headObj :: f ℝ -> ℝ
headObj = forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
ctx obj
symbObj
in
\f ℝ
p -> do
let
maxTail :: ℝ
maxTail = ℝ -> [ℝ] -> ℝ
rmaximum ℝ
r
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> b -> a -> c
flip (forall obj (f :: * -> *).
(Object obj f ℝ, VectorStuff (f ℝ), ComponentWiseMultable (f ℝ),
Metric f) =>
ObjectContext -> SharedObj obj f ℝ -> f ℝ -> ℝ
getImplicitShared ObjectContext
ctx) f ℝ
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall obj (f :: * -> *) a. obj -> SharedObj obj f a
Complement) [obj]
symbObjs
if ℝ
maxTail forall a. Ord a => a -> a -> Bool
> -ℝ
minℝ Bool -> Bool -> Bool
&& ℝ
maxTail forall a. Ord a => a -> a -> Bool
< ℝ
minℝ
then ℝ -> ℝ -> ℝ -> ℝ
rmax ℝ
r (f ℝ -> ℝ
headObj f ℝ
p) ℝ
minℝ
else ℝ -> ℝ -> ℝ -> ℝ
rmax ℝ
r (f ℝ -> ℝ
headObj f ℝ
p) ℝ
maxTail
getImplicitShared ObjectContext
ctx (Translate f ℝ
v obj
symbObj) = \f ℝ
p ->
forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
ctx obj
symbObj (f ℝ
p forall a. Num a => a -> a -> a
- f ℝ
v)
getImplicitShared ObjectContext
ctx (Scale f ℝ
s obj
symbObj) = \f ℝ
p ->
forall (f :: * -> *). (VectorStuff (f ℝ), Metric f) => f ℝ -> ℝ
normalize f ℝ
s forall a. Num a => a -> a -> a
* forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
ctx obj
symbObj (f ℝ
p forall a. ComponentWiseMultable a => a -> a -> a
⋯/ f ℝ
s)
getImplicitShared ObjectContext
ctx (Mirror f ℝ
v obj
symbObj) =
forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
ctx obj
symbObj forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a.
(Num (f a), Fractional a, Metric f) =>
f a -> f a -> f a
reflect f ℝ
v
getImplicitShared ObjectContext
ctx (Shell ℝ
w obj
symbObj) = \f ℝ
p ->
forall a. Num a => a -> a
abs (forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
ctx obj
symbObj f ℝ
p) forall a. Num a => a -> a -> a
- ℝ
wforall a. Fractional a => a -> a -> a
/ℝ
2
getImplicitShared ObjectContext
ctx (Outset ℝ
d obj
symbObj) = \f ℝ
p ->
forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
ctx obj
symbObj f ℝ
p forall a. Num a => a -> a -> a
- ℝ
d
getImplicitShared ObjectContext
_ (EmbedBoxedObj (f ℝ -> ℝ
obj,(f ℝ, f ℝ)
_)) = f ℝ -> ℝ
obj
getImplicitShared ObjectContext
ctx (WithRounding ℝ
r obj
obj) = forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' (ObjectContext
ctx { objectRounding :: ℝ
objectRounding = ℝ
r }) obj
obj