implicit-0.0.1: Graphics/Implicit/Primitives.hs
-- Implicit CAD. Copyright (C) 2011, Christopher Olah (chris@colah.ca)
-- Released under the GNU GPL, see LICENSE
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, FlexibleContexts, TypeSynonymInstances, UndecidableInstances #-}
module Graphics.Implicit.Primitives (
sphere,
circle,
cylinder, cylinderC, cylinder2, cylinder2C,
rect3R, rectR,
regularPolygon,
polygonR,
zsurface
) where
-- Some type definitions :)
import Graphics.Implicit.Definitions
-- Most of the functions we're exporting come from here
-- They are methods of classes.
import Graphics.Implicit.Primitives.Definitions
-- These files implement the classes for types
-- corresponding to the name of the file.
import Graphics.Implicit.Primitives.Obj2
import Graphics.Implicit.Primitives.Obj3
import Graphics.Implicit.Primitives.BoxedObj2
import Graphics.Implicit.Primitives.BoxedObj3
import Graphics.Implicit.Primitives.SymbolicObj2
import Graphics.Implicit.Primitives.SymbolicObj3
-- We export a few functions modified by operations
-- for users conveniences...
import Graphics.Implicit.Operations
-- If you are confused as to how these functions work, please refer to
-- http://christopherolah.wordpress.com/2011/11/06/manipulation-of-implicit-functions-with-an-eye-on-cad/
cylinder :: (PrimitiveSupporter3 obj, BasicObj obj ℝ3) =>
ℝ -- ^ Radius of the cylinder
-> ℝ -- ^ Height of the cylinder
-> obj -- ^ Resulting cylinder
cylinder r h = cylinder2 r r h
cylinderC :: (PrimitiveSupporter3 obj, BasicObj obj ℝ3) =>
ℝ -- ^ Radius of the cylinder
-> ℝ -- ^ Height of the cylinder
-> obj -- ^ Resulting cylinder
cylinderC r h = translate (0,0,-h/2.0) $ cylinder r h
cylinder2C :: (PrimitiveSupporter3 obj, BasicObj obj ℝ3) =>
ℝ -- ^ Radius of the cylinder
-> ℝ -- ^ Second radius of the cylinder
-> ℝ -- ^ Height of the cylinder
-> obj -- ^ Resulting cylinder
cylinder2C r1 r2 h = translate (0,0,-h/2.0) $ cylinder2 r1 r2 h
regularPolygon ::
ℕ -- ^ number of sides
-> ℝ -- ^ radius
-> Obj2 -- ^ resulting regular polygon
regularPolygon sides r = polygonR 0 [ (r*cos(2*pi*m/sidesr), r*sin(2*pi*m/sidesr)) | m <- [0.. sidesr -1]]
where sidesr = fromIntegral sides
zsurface ::
(ℝ2 -> ℝ) -- ^ Description of the height of the surface
-> Obj3 -- ^ Resulting 3D object
zsurface f = \(x,y,z) -> f (x,y) - z
-- This function is commented out because it doesn't obey the magnitude requirement.
-- Refer to blog post.
-- It needs to be fixed at some point, but the math is somewhat non-trivial.
--ellipse :: ℝ -> ℝ -> Obj2
--ellipse a b
-- | a < b = \(x,y) -> sqrt ((b/a*x)**2 + y**2) - a
-- | otherwise = \(x,y) -> sqrt (x**2 + (a/b*y)**2) - b