{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE TypeFamilies #-}
module Graphics.Implicit.Primitives (
translate,
mirror,
scale,
outset,
complement, union, intersect, difference,
unionR, intersectR, differenceR,
shell,
getBox,
getImplicit,
getImplicit',
extrude,
extrudeM,
extrudeOnEdgeOf,
sphere,
cube, rect3,
circle,
cylinder,
cylinder2,
cone,
torus,
ellipsoid,
square, rect,
polygon,
rotateExtrude,
rotate3,
rotateQ,
rotate3V,
transform3,
pack3,
rotate,
transform,
pack2,
implicit,
emptySpace,
fullSpace,
withRounding,
_Shared,
pattern Shared,
Object(Space, canonicalize)) where
import Prelude(Applicative, Eq, Foldable, Num, abs, (<), otherwise, Num, (+), (-), (*), (/), (.), negate, Bool(True, False), Maybe(Just, Nothing), Either, fmap, ($), (**), sqrt)
import Graphics.Implicit.Canon (canonicalize2, canonicalize3)
import Graphics.Implicit.Definitions (ObjectContext, ℝ, ℝ2, ℝ3, Box2,
SharedObj(Empty,
Full,
Translate,
Empty,
Scale,
Complement,
Outset,
Mirror,
Shell,
UnionR,
DifferenceR,
IntersectR,
EmbedBoxedObj,
WithRounding
),
SymbolicObj2(
Square,
Circle,
Polygon,
Rotate2,
Transform2,
Shared2
),
SymbolicObj3(
Cube,
Sphere,
Cylinder,
Rotate3,
Transform3,
Extrude,
ExtrudeM,
RotateExtrude,
ExtrudeOnEdgeOf,
Shared3
),
ExtrudeMScale,
defaultObjectContext
)
import Graphics.Implicit.MathUtil (pack)
import Graphics.Implicit.ObjectUtil (getBox2, getBox3, getImplicit2, getImplicit3)
import Linear (M33, M44, V2(V2),V3(V3), axisAngle, Quaternion)
import Control.Lens (prism', Prism', preview, (#))
import Data.Kind (Type)
sphere ::
ℝ
-> SymbolicObj3
sphere :: ℝ -> SymbolicObj3
sphere = ℝ -> SymbolicObj3
Sphere
rect3
:: ℝ3
-> ℝ3
-> SymbolicObj3
rect3 :: ℝ3 -> ℝ3 -> SymbolicObj3
rect3 ℝ3
xyz1 ℝ3
xyz2 = forall obj (f :: * -> *) a. Object obj f a => f a -> obj -> obj
translate ℝ3
xyz1 forall a b. (a -> b) -> a -> b
$ ℝ3 -> SymbolicObj3
Cube forall a b. (a -> b) -> a -> b
$ ℝ3
xyz2 forall a. Num a => a -> a -> a
- ℝ3
xyz1
cube
:: Bool
-> ℝ3
-> SymbolicObj3
cube :: Bool -> ℝ3 -> SymbolicObj3
cube Bool
False ℝ3
size = ℝ3 -> SymbolicObj3
Cube ℝ3
size
cube Bool
True ℝ3
size = forall obj (f :: * -> *) a. Object obj f a => f a -> obj -> obj
translate (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. Num a => a -> a
negate forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Fractional a => a -> a -> a
/ ℝ
2)) ℝ3
size) forall a b. (a -> b) -> a -> b
$ ℝ3 -> SymbolicObj3
Cube ℝ3
size
cylinder2 ::
ℝ
-> ℝ
-> ℝ
-> SymbolicObj3
cylinder2 :: ℝ -> ℝ -> ℝ -> SymbolicObj3
cylinder2 ℝ
r1 ℝ
r2 ℝ
h
| ℝ
h forall a. Ord a => a -> a -> Bool
< ℝ
0 = forall obj (f :: * -> *) a. Object obj f a => f a -> obj -> obj
mirror (forall a. a -> a -> a -> V3 a
V3 ℝ
0 ℝ
0 ℝ
1) forall a b. (a -> b) -> a -> b
$ ℝ -> ℝ -> ℝ -> SymbolicObj3
cylinder2 ℝ
r1 ℝ
r2 (forall a. Num a => a -> a
abs ℝ
h)
| Bool
otherwise = ℝ -> ℝ -> ℝ -> SymbolicObj3
Cylinder ℝ
h ℝ
r1 ℝ
r2
cylinder ::
ℝ
-> ℝ
-> SymbolicObj3
cylinder :: ℝ -> ℝ -> SymbolicObj3
cylinder ℝ
r = ℝ -> ℝ -> ℝ -> SymbolicObj3
cylinder2 ℝ
r ℝ
r
cone ::
ℝ
-> ℝ
-> SymbolicObj3
cone :: ℝ -> ℝ -> SymbolicObj3
cone = ℝ -> ℝ -> ℝ -> SymbolicObj3
cylinder2 ℝ
0
torus :: ℝ -> ℝ -> SymbolicObj3
torus :: ℝ -> ℝ -> SymbolicObj3
torus ℝ
r1 ℝ
r2 = forall obj (f :: * -> *) a.
Object obj f a =>
(f a -> a) -> (f a, f a) -> obj
implicit
(\(V3 ℝ
x ℝ
y ℝ
z) -> let a :: ℝ
a = (forall a. Floating a => a -> a
sqrt (ℝ
xforall a. Floating a => a -> a -> a
**ℝ
2 forall a. Num a => a -> a -> a
+ ℝ
yforall a. Floating a => a -> a -> a
**ℝ
2) forall a. Num a => a -> a -> a
- ℝ
r1) in ℝ
aforall a. Floating a => a -> a -> a
**ℝ
2 forall a. Num a => a -> a -> a
+ ℝ
zforall a. Floating a => a -> a -> a
**ℝ
2 forall a. Num a => a -> a -> a
- ℝ
r2forall a. Floating a => a -> a -> a
**ℝ
2)
(forall a. a -> a -> a -> V3 a
V3 (-ℝ
r) (-ℝ
r) (-ℝ
r2), forall a. a -> a -> a -> V3 a
V3 ℝ
r ℝ
r ℝ
r2)
where
r :: ℝ
r = ℝ
r1 forall a. Num a => a -> a -> a
+ ℝ
r2
ellipsoid :: ℝ -> ℝ -> ℝ -> SymbolicObj3
ellipsoid :: ℝ -> ℝ -> ℝ -> SymbolicObj3
ellipsoid ℝ
a ℝ
b ℝ
c = forall obj (f :: * -> *) a.
Object obj f a =>
(f a -> a) -> (f a, f a) -> obj
implicit
(\(V3 ℝ
x ℝ
y ℝ
z) -> (ℝ
xforall a. Floating a => a -> a -> a
**ℝ
2forall a. Fractional a => a -> a -> a
/ℝ
aforall a. Floating a => a -> a -> a
**ℝ
2) forall a. Num a => a -> a -> a
+ (ℝ
yforall a. Floating a => a -> a -> a
**ℝ
2forall a. Fractional a => a -> a -> a
/ℝ
bforall a. Floating a => a -> a -> a
**ℝ
2) forall a. Num a => a -> a -> a
+ (ℝ
zforall a. Floating a => a -> a -> a
**ℝ
2forall a. Fractional a => a -> a -> a
/ℝ
cforall a. Floating a => a -> a -> a
**ℝ
2) forall a. Num a => a -> a -> a
- ℝ
1)
(forall a. a -> a -> a -> V3 a
V3 (-ℝ
a) (-ℝ
b) (-ℝ
c), forall a. a -> a -> a -> V3 a
V3 ℝ
a ℝ
b ℝ
c)
circle ::
ℝ
-> SymbolicObj2
circle :: ℝ -> SymbolicObj2
circle = ℝ -> SymbolicObj2
Circle
rect
:: ℝ2
-> ℝ2
-> SymbolicObj2
rect :: ℝ2 -> ℝ2 -> SymbolicObj2
rect ℝ2
xy1 ℝ2
xy2 = forall obj (f :: * -> *) a. Object obj f a => f a -> obj -> obj
translate ℝ2
xy1 forall a b. (a -> b) -> a -> b
$ ℝ2 -> SymbolicObj2
Square forall a b. (a -> b) -> a -> b
$ ℝ2
xy2 forall a. Num a => a -> a -> a
- ℝ2
xy1
square
:: Bool
-> ℝ2
-> SymbolicObj2
square :: Bool -> ℝ2 -> SymbolicObj2
square Bool
False ℝ2
size = ℝ2 -> SymbolicObj2
Square ℝ2
size
square Bool
True ℝ2
size = forall obj (f :: * -> *) a. Object obj f a => f a -> obj -> obj
translate (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. Num a => a -> a
negate forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Fractional a => a -> a -> a
/ ℝ
2)) ℝ2
size) forall a b. (a -> b) -> a -> b
$ ℝ2 -> SymbolicObj2
Square ℝ2
size
polygon
:: [ℝ2]
-> SymbolicObj2
polygon :: [ℝ2] -> SymbolicObj2
polygon = [ℝ2] -> SymbolicObj2
Polygon
class ( Applicative f
, Eq a
, Eq (f a)
, Foldable f
, Num a
, Num (f a))
=> Object obj f a | obj -> f a
where
type Space obj :: Type -> Type
_Shared :: Prism' obj (SharedObj obj f a)
getBox ::
obj
-> (f a, f a)
getImplicit'
:: ObjectContext
-> obj
-> (f a -> a)
canonicalize :: obj -> obj
getImplicit
:: Object obj f a
=> obj
-> (f a -> a)
getImplicit :: forall obj (f :: * -> *) a. Object obj f a => obj -> f a -> a
getImplicit = forall obj (f :: * -> *) a.
Object obj f a =>
ObjectContext -> obj -> f a -> a
getImplicit' ObjectContext
defaultObjectContext
pattern Shared :: (Object obj f a) => SharedObj obj f a -> obj
pattern $bShared :: forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
$mShared :: forall {r} {obj} {f :: * -> *} {a}.
Object obj f a =>
obj -> (SharedObj obj f a -> r) -> ((# #) -> r) -> r
Shared v <- (preview _Shared -> Just v)
where
Shared SharedObj obj f a
v = forall obj (f :: * -> *) a.
Object obj f a =>
Prism' obj (SharedObj obj f a)
_Shared forall t b. AReview t b -> b -> t
# SharedObj obj f a
v
translate
:: Object obj f a
=> f a
-> obj
-> obj
translate :: forall obj (f :: * -> *) a. Object obj f a => f a -> obj -> obj
translate f a
v obj
s = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. f a -> obj -> SharedObj obj f a
Translate f a
v obj
s
scale
:: Object obj f a
=> f a
-> obj
-> obj
scale :: forall obj (f :: * -> *) a. Object obj f a => f a -> obj -> obj
scale f a
v obj
s = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. f a -> obj -> SharedObj obj f a
Scale f a
v obj
s
complement
:: Object obj f a
=> obj
-> obj
complement :: forall obj (f :: * -> *) a. Object obj f a => obj -> obj
complement (Shared SharedObj obj f a
Empty) = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall obj (f :: * -> *) a. SharedObj obj f a
Full
complement (Shared SharedObj obj f a
Full) = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall obj (f :: * -> *) a. SharedObj obj f a
Empty
complement (Shared (Complement obj
s)) = obj
s
complement obj
s = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. obj -> SharedObj obj f a
Complement obj
s
emptySpace :: Object obj f a => obj
emptySpace :: forall obj (f :: * -> *) a. Object obj f a => obj
emptySpace = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall obj (f :: * -> *) a. SharedObj obj f a
Empty
fullSpace :: Object obj f a => obj
fullSpace :: forall obj (f :: * -> *) a. Object obj f a => obj
fullSpace = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall obj (f :: * -> *) a. SharedObj obj f a
Full
withRounding :: Object obj f a => ℝ -> obj -> obj
withRounding :: forall obj (f :: * -> *) a. Object obj f a => ℝ -> obj -> obj
withRounding ℝ
r = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall obj (f :: * -> *) a. ℝ -> obj -> SharedObj obj f a
WithRounding ℝ
r
mirror
:: Object obj f a
=> f a
-> obj
-> obj
mirror :: forall obj (f :: * -> *) a. Object obj f a => f a -> obj -> obj
mirror f a
v obj
s = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. f a -> obj -> SharedObj obj f a
Mirror f a
v obj
s
outset
:: Object obj f a
=> ℝ
-> obj
-> obj
outset :: forall obj (f :: * -> *) a. Object obj f a => ℝ -> obj -> obj
outset ℝ
v obj
s = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. ℝ -> obj -> SharedObj obj f a
Outset ℝ
v obj
s
shell
:: Object obj f a
=> ℝ
-> obj
-> obj
shell :: forall obj (f :: * -> *) a. Object obj f a => ℝ -> obj -> obj
shell ℝ
v obj
s = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. ℝ -> obj -> SharedObj obj f a
Shell ℝ
v obj
s
unionR
:: Object obj f a
=> ℝ
-> [obj]
-> obj
unionR :: forall obj (f :: * -> *) a. Object obj f a => ℝ -> [obj] -> obj
unionR ℝ
r [obj]
ss = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. ℝ -> [obj] -> SharedObj obj f a
UnionR ℝ
r [obj]
ss
differenceR
:: Object obj f a
=> ℝ
-> obj
-> [obj]
-> obj
differenceR :: forall obj (f :: * -> *) a.
Object obj f a =>
ℝ -> obj -> [obj] -> obj
differenceR ℝ
r obj
s [obj]
ss = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. ℝ -> obj -> [obj] -> SharedObj obj f a
DifferenceR ℝ
r obj
s [obj]
ss
{-# INLINABLE differenceR #-}
intersectR
:: Object obj f a
=> ℝ
-> [obj]
-> obj
intersectR :: forall obj (f :: * -> *) a. Object obj f a => ℝ -> [obj] -> obj
intersectR ℝ
r [obj]
ss = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. ℝ -> [obj] -> SharedObj obj f a
IntersectR ℝ
r [obj]
ss
implicit
:: Object obj f a
=> (f a -> a)
-> (f a, f a)
-> obj
implicit :: forall obj (f :: * -> *) a.
Object obj f a =>
(f a -> a) -> (f a, f a) -> obj
implicit f a -> a
a (f a, f a)
b = forall obj (f :: * -> *) a.
Object obj f a =>
SharedObj obj f a -> obj
Shared forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a.
(f a -> a, (f a, f a)) -> SharedObj obj f a
EmbedBoxedObj (f a -> a
a, (f a, f a)
b)
instance Object SymbolicObj2 V2 ℝ where
type Space SymbolicObj2 = V2
_Shared :: Prism' SymbolicObj2 (SharedObj SymbolicObj2 V2 ℝ)
_Shared = forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' SharedObj SymbolicObj2 V2 ℝ -> SymbolicObj2
Shared2 forall a b. (a -> b) -> a -> b
$ \case
Shared2 SharedObj SymbolicObj2 V2 ℝ
x -> forall a. a -> Maybe a
Just SharedObj SymbolicObj2 V2 ℝ
x
SymbolicObj2
_ -> forall a. Maybe a
Nothing
getBox :: SymbolicObj2 -> (ℝ2, ℝ2)
getBox = SymbolicObj2 -> (ℝ2, ℝ2)
getBox2 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall obj (f :: * -> *) a. Object obj f a => obj -> obj
canonicalize
getImplicit' :: ObjectContext -> SymbolicObj2 -> ℝ2 -> ℝ
getImplicit' ObjectContext
ctx = ObjectContext -> SymbolicObj2 -> ℝ2 -> ℝ
getImplicit2 ObjectContext
ctx forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall obj (f :: * -> *) a. Object obj f a => obj -> obj
canonicalize
canonicalize :: SymbolicObj2 -> SymbolicObj2
canonicalize = SymbolicObj2 -> SymbolicObj2
canonicalize2
instance Object SymbolicObj3 V3 ℝ where
type Space SymbolicObj3 = V3
_Shared :: Prism' SymbolicObj3 (SharedObj SymbolicObj3 V3 ℝ)
_Shared = forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' SharedObj SymbolicObj3 V3 ℝ -> SymbolicObj3
Shared3 forall a b. (a -> b) -> a -> b
$ \case
Shared3 SharedObj SymbolicObj3 V3 ℝ
x -> forall a. a -> Maybe a
Just SharedObj SymbolicObj3 V3 ℝ
x
SymbolicObj3
_ -> forall a. Maybe a
Nothing
getBox :: SymbolicObj3 -> (ℝ3, ℝ3)
getBox = SymbolicObj3 -> (ℝ3, ℝ3)
getBox3 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall obj (f :: * -> *) a. Object obj f a => obj -> obj
canonicalize
getImplicit' :: ObjectContext -> SymbolicObj3 -> ℝ3 -> ℝ
getImplicit' ObjectContext
ctx = ObjectContext -> SymbolicObj3 -> ℝ3 -> ℝ
getImplicit3 ObjectContext
ctx forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall obj (f :: * -> *) a. Object obj f a => obj -> obj
canonicalize
canonicalize :: SymbolicObj3 -> SymbolicObj3
canonicalize = SymbolicObj3 -> SymbolicObj3
canonicalize3
union :: Object obj f a => [obj] -> obj
union :: forall obj (f :: * -> *) a. Object obj f a => [obj] -> obj
union = forall obj (f :: * -> *) a. Object obj f a => ℝ -> [obj] -> obj
unionR ℝ
0
difference :: Object obj f a => obj -> [obj] -> obj
difference :: forall obj (f :: * -> *) a. Object obj f a => obj -> [obj] -> obj
difference = forall obj (f :: * -> *) a.
Object obj f a =>
ℝ -> obj -> [obj] -> obj
differenceR ℝ
0
intersect :: Object obj f a => [obj] -> obj
intersect :: forall obj (f :: * -> *) a. Object obj f a => [obj] -> obj
intersect = forall obj (f :: * -> *) a. Object obj f a => ℝ -> [obj] -> obj
intersectR ℝ
0
extrude
:: SymbolicObj2
-> ℝ
-> SymbolicObj3
extrude :: SymbolicObj2 -> ℝ -> SymbolicObj3
extrude = SymbolicObj2 -> ℝ -> SymbolicObj3
Extrude
extrudeM
:: Either ℝ (ℝ -> ℝ)
-> ExtrudeMScale
-> Either ℝ2 (ℝ -> ℝ2)
-> SymbolicObj2
-> Either ℝ (ℝ2 -> ℝ)
-> SymbolicObj3
extrudeM :: Either ℝ (ℝ -> ℝ)
-> ExtrudeMScale
-> Either ℝ2 (ℝ -> ℝ2)
-> SymbolicObj2
-> Either ℝ (ℝ2 -> ℝ)
-> SymbolicObj3
extrudeM = Either ℝ (ℝ -> ℝ)
-> ExtrudeMScale
-> Either ℝ2 (ℝ -> ℝ2)
-> SymbolicObj2
-> Either ℝ (ℝ2 -> ℝ)
-> SymbolicObj3
ExtrudeM
rotateExtrude
:: ℝ
-> Either ℝ2 (ℝ -> ℝ2)
-> Either ℝ (ℝ -> ℝ )
-> SymbolicObj2
-> SymbolicObj3
rotateExtrude :: ℝ
-> Either ℝ2 (ℝ -> ℝ2)
-> Either ℝ (ℝ -> ℝ)
-> SymbolicObj2
-> SymbolicObj3
rotateExtrude = ℝ
-> Either ℝ2 (ℝ -> ℝ2)
-> Either ℝ (ℝ -> ℝ)
-> SymbolicObj2
-> SymbolicObj3
RotateExtrude
extrudeOnEdgeOf :: SymbolicObj2 -> SymbolicObj2 -> SymbolicObj3
extrudeOnEdgeOf :: SymbolicObj2 -> SymbolicObj2 -> SymbolicObj3
extrudeOnEdgeOf = SymbolicObj2 -> SymbolicObj2 -> SymbolicObj3
ExtrudeOnEdgeOf
rotate3 :: ℝ3 -> SymbolicObj3 -> SymbolicObj3
rotate3 :: ℝ3 -> SymbolicObj3 -> SymbolicObj3
rotate3 (V3 ℝ
pitch ℝ
roll ℝ
yaw)
= Quaternion ℝ -> SymbolicObj3 -> SymbolicObj3
Rotate3
forall a b. (a -> b) -> a -> b
$ forall a. (Epsilon a, Floating a) => V3 a -> a -> Quaternion a
axisAngle (forall a. a -> a -> a -> V3 a
V3 ℝ
0 ℝ
0 ℝ
1) ℝ
yaw
forall a. Num a => a -> a -> a
* forall a. (Epsilon a, Floating a) => V3 a -> a -> Quaternion a
axisAngle (forall a. a -> a -> a -> V3 a
V3 ℝ
0 ℝ
1 ℝ
0) ℝ
roll
forall a. Num a => a -> a -> a
* forall a. (Epsilon a, Floating a) => V3 a -> a -> Quaternion a
axisAngle (forall a. a -> a -> a -> V3 a
V3 ℝ
1 ℝ
0 ℝ
0) ℝ
pitch
rotateQ
:: Quaternion ℝ
-> SymbolicObj3
-> SymbolicObj3
rotateQ :: Quaternion ℝ -> SymbolicObj3 -> SymbolicObj3
rotateQ = Quaternion ℝ -> SymbolicObj3 -> SymbolicObj3
Rotate3
rotate3V
:: ℝ
-> ℝ3
-> SymbolicObj3
-> SymbolicObj3
rotate3V :: ℝ -> ℝ3 -> SymbolicObj3 -> SymbolicObj3
rotate3V ℝ
w ℝ3
xyz = Quaternion ℝ -> SymbolicObj3 -> SymbolicObj3
Rotate3 forall a b. (a -> b) -> a -> b
$ forall a. (Epsilon a, Floating a) => V3 a -> a -> Quaternion a
axisAngle ℝ3
xyz ℝ
w
transform3
:: M44 ℝ
-> SymbolicObj3
-> SymbolicObj3
transform3 :: M44 ℝ -> SymbolicObj3 -> SymbolicObj3
transform3 = M44 ℝ -> SymbolicObj3 -> SymbolicObj3
Transform3
pack3
:: ℝ2
-> ℝ
-> [SymbolicObj3]
-> Maybe SymbolicObj3
pack3 :: ℝ2 -> ℝ -> [SymbolicObj3] -> Maybe SymbolicObj3
pack3 (V2 ℝ
dx ℝ
dy) ℝ
sep [SymbolicObj3]
objs =
let
boxDropZ :: (ℝ3,ℝ3) -> (ℝ2,ℝ2)
boxDropZ :: (ℝ3, ℝ3) -> (ℝ2, ℝ2)
boxDropZ (V3 ℝ
a ℝ
b ℝ
_,V3 ℝ
d ℝ
e ℝ
_) = (forall a. a -> a -> V2 a
V2 ℝ
a ℝ
b, forall a. a -> a -> V2 a
V2 ℝ
d ℝ
e)
withBoxes :: [(Box2, SymbolicObj3)]
withBoxes :: [((ℝ2, ℝ2), SymbolicObj3)]
withBoxes = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\SymbolicObj3
obj -> ( (ℝ3, ℝ3) -> (ℝ2, ℝ2)
boxDropZ forall a b. (a -> b) -> a -> b
$ SymbolicObj3 -> (ℝ3, ℝ3)
getBox3 SymbolicObj3
obj, SymbolicObj3
obj)) [SymbolicObj3]
objs
in case forall a.
(ℝ2, ℝ2) -> ℝ -> [((ℝ2, ℝ2), a)] -> ([(ℝ2, a)], [((ℝ2, ℝ2), a)])
pack (forall a. a -> a -> V2 a
V2 ℝ
0 ℝ
0,forall a. a -> a -> V2 a
V2 ℝ
dx ℝ
dy) ℝ
sep [((ℝ2, ℝ2), SymbolicObj3)]
withBoxes of
([(ℝ2, SymbolicObj3)]
a, []) -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. Object obj f a => [obj] -> obj
union forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(V2 ℝ
x ℝ
y,SymbolicObj3
obj) -> forall obj (f :: * -> *) a. Object obj f a => f a -> obj -> obj
translate (forall a. a -> a -> a -> V3 a
V3 ℝ
x ℝ
y ℝ
0) SymbolicObj3
obj) [(ℝ2, SymbolicObj3)]
a
([(ℝ2, SymbolicObj3)], [((ℝ2, ℝ2), SymbolicObj3)])
_ -> forall a. Maybe a
Nothing
rotate :: ℝ -> SymbolicObj2 -> SymbolicObj2
rotate :: ℝ -> SymbolicObj2 -> SymbolicObj2
rotate = ℝ -> SymbolicObj2 -> SymbolicObj2
Rotate2
transform
:: M33 ℝ
-> SymbolicObj2
-> SymbolicObj2
transform :: M33 ℝ -> SymbolicObj2 -> SymbolicObj2
transform = M33 ℝ -> SymbolicObj2 -> SymbolicObj2
Transform2
pack2
:: ℝ2
-> ℝ
-> [SymbolicObj2]
-> Maybe SymbolicObj2
pack2 :: ℝ2 -> ℝ -> [SymbolicObj2] -> Maybe SymbolicObj2
pack2 (V2 ℝ
dx ℝ
dy) ℝ
sep [SymbolicObj2]
objs =
let
withBoxes :: [(Box2, SymbolicObj2)]
withBoxes :: [((ℝ2, ℝ2), SymbolicObj2)]
withBoxes = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\SymbolicObj2
obj -> ( SymbolicObj2 -> (ℝ2, ℝ2)
getBox2 SymbolicObj2
obj, SymbolicObj2
obj)) [SymbolicObj2]
objs
in case forall a.
(ℝ2, ℝ2) -> ℝ -> [((ℝ2, ℝ2), a)] -> ([(ℝ2, a)], [((ℝ2, ℝ2), a)])
pack (forall a. a -> a -> V2 a
V2 ℝ
0 ℝ
0,forall a. a -> a -> V2 a
V2 ℝ
dx ℝ
dy) ℝ
sep [((ℝ2, ℝ2), SymbolicObj2)]
withBoxes of
([(ℝ2, SymbolicObj2)]
a, []) -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall obj (f :: * -> *) a. Object obj f a => [obj] -> obj
union forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(V2 ℝ
x ℝ
y,SymbolicObj2
obj) -> forall obj (f :: * -> *) a. Object obj f a => f a -> obj -> obj
translate (forall a. a -> a -> V2 a
V2 ℝ
x ℝ
y) SymbolicObj2
obj) [(ℝ2, SymbolicObj2)]
a
([(ℝ2, SymbolicObj2)], [((ℝ2, ℝ2), SymbolicObj2)])
_ -> forall a. Maybe a
Nothing