{-# LANGUAGE FlexibleContexts #-}
module Graphics.Implicit.Export.Util (normTriangle, normVertex, centroid) where
import Prelude(Num, Applicative, Foldable, pure, (+), Fractional, (/), (-), realToFrac, length)
import Graphics.Implicit.Definitions (ℝ, ℝ3, Obj3, Triangle(Triangle), NormedTriangle(NormedTriangle))
import Linear ((*^), (^/), normalize, V3(V3))
import Data.List (foldl')
default (ℝ)
normTriangle :: ℝ -> Obj3 -> Triangle -> NormedTriangle
normTriangle :: ℝ -> Obj3 -> Triangle -> NormedTriangle
normTriangle ℝ
res Obj3
obj (Triangle (ℝ3
a,ℝ3
b,ℝ3
c)) =
((ℝ3, ℝ3), (ℝ3, ℝ3), (ℝ3, ℝ3)) -> NormedTriangle
NormedTriangle ((ℝ3
a, ℝ3 -> ℝ3
normify ℝ3
a'), (ℝ3
b, ℝ3 -> ℝ3
normify ℝ3
b'), (ℝ3
c, ℝ3 -> ℝ3
normify ℝ3
c'))
where
normify :: ℝ3 -> ℝ3
normify = ℝ -> Obj3 -> ℝ3 -> ℝ3
normVertex ℝ
res Obj3
obj
a' :: ℝ3
a' = (ℝ3
a forall a. Num a => a -> a -> a
+ ℝ
rforall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^ℝ3
b forall a. Num a => a -> a -> a
+ ℝ
rforall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^ℝ3
c) forall (f :: * -> *) a.
(Functor f, Fractional a) =>
f a -> a -> f a
^/ ℝ
1.02
b' :: ℝ3
b' = (ℝ3
b forall a. Num a => a -> a -> a
+ ℝ
rforall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^ℝ3
a forall a. Num a => a -> a -> a
+ ℝ
rforall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^ℝ3
c) forall (f :: * -> *) a.
(Functor f, Fractional a) =>
f a -> a -> f a
^/ ℝ
1.02
c' :: ℝ3
c' = (ℝ3
c forall a. Num a => a -> a -> a
+ ℝ
rforall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^ℝ3
b forall a. Num a => a -> a -> a
+ ℝ
rforall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^ℝ3
a) forall (f :: * -> *) a.
(Functor f, Fractional a) =>
f a -> a -> f a
^/ ℝ
1.02
r :: ℝ
r :: ℝ
r = ℝ
0.01
normVertex :: ℝ -> Obj3 -> ℝ3 -> ℝ3
normVertex :: ℝ -> Obj3 -> ℝ3 -> ℝ3
normVertex ℝ
res Obj3
obj ℝ3
p =
let
d :: ℝ3 -> ℝ
d :: Obj3
d ℝ3
v = ( Obj3
obj (ℝ3
p forall a. Num a => a -> a -> a
+ (ℝ
resforall a. Fractional a => a -> a -> a
/ℝ
100)forall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^ℝ3
v) forall a. Num a => a -> a -> a
- Obj3
obj (ℝ3
p forall a. Num a => a -> a -> a
- (ℝ
resforall a. Fractional a => a -> a -> a
/ℝ
100)forall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^ℝ3
v) ) forall a. Fractional a => a -> a -> a
/ (ℝ
resforall a. Fractional a => a -> a -> a
/ℝ
50)
dx :: ℝ
dx = Obj3
d (forall a. a -> a -> a -> V3 a
V3 ℝ
1 ℝ
0 ℝ
0)
dy :: ℝ
dy = Obj3
d (forall a. a -> a -> a -> V3 a
V3 ℝ
0 ℝ
1 ℝ
0)
dz :: ℝ
dz = Obj3
d (forall a. a -> a -> a -> V3 a
V3 ℝ
0 ℝ
0 ℝ
1)
in forall a (f :: * -> *).
(Floating a, Metric f, Epsilon a) =>
f a -> f a
normalize (forall a. a -> a -> a -> V3 a
V3 ℝ
dx ℝ
dy ℝ
dz)
centroid :: (Fractional a, Foldable t, Applicative f, Num (f a)) => t (f a) -> f a
centroid :: forall a (t :: * -> *) (f :: * -> *).
(Fractional a, Foldable t, Applicative f, Num (f a)) =>
t (f a) -> f a
centroid t (f a)
pts = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' forall a. Num a => a -> a -> a
(+) (forall (f :: * -> *) a. Applicative f => a -> f a
pure a
0) t (f a)
pts forall (f :: * -> *) a.
(Functor f, Fractional a) =>
f a -> a -> f a
^/ forall a b. (Real a, Fractional b) => a -> b
realToFrac (forall (t :: * -> *) a. Foldable t => t a -> Int
length t (f a)
pts)
{-# INLINABLE centroid #-}