ConstructiveGeometry.jl Documentation
This package provides tools for describing 3d objects in Julia. For example, this is the Julia code used to draw the logo of this page:
using ConstructiveGeometry
using CairoMakie
using Colors
hexagon = polygon([[cospi(t/3),sinpi(t/3)] for t in 0:5])
c1, c2, c3 = colorant"#cb3c33", colorant"#9558b2", colorant"#389826"
bolt = linear_extrude(5)*(8*hexagon) ∪ cylinder(15,4) ∪
rotate_extrude(7*360, slide=14)*translate([1,0])*square(4,1)
m = union(c1*bolt, [20,0,0]+c2*bolt, [10,17,0]+c3*bolt)
save("logo.png", Makie.plot(m))Overview
Drawing an object is generally done in two steps. First, an abstract, “ideal” geometric object (in either two or three dimensions) is defined using the following constructions:
- primitive geometric objects, such as cubes, spheres, explicit polygons, etc.;
- geometric transformations acting on one object, such as (invertible) affine transformations, extrusions, projections, color-change, etc.;
- CSG operations combining several objects, such as boolean operations or Minkowski sum.
Such an abstract object is stored as a tree with primitive objects as leaves:
julia> display(bolt)
union
├─ Prism
│ └─ AffineTransform
│ └─ ShapeMesh # 1 polygon(s), 6 vertices
├─ Prism
│ └─ Circle
└─ Revolution
└─ AffineTransform
└─ SquareAny geometric object defined in this way can then be instantiated as an explicit mesh. The mesh may be visualized directly within Julia (using Makie) or exported in several formats, including as an STL (for 3d objects) or SVG (for 2d objects) file.
The documentation about extending ConstructiveGeometry also contains some explanations about the internals.