Constructive Solid Geometry

Constructive Solid Geometry, or CSG for short, is yet another way of representing solids. A CSG solid is constructed from a few primitives with Boolean operators set unions, intersections and differences. Thus, a CSG solid can be written as a set equations and thus can also be considered a design methodology.

CSG Primitives

The standard CSG primitives consist of the block (i.e., cube), triangular prism, the sphere, the cylinder, the cone and the torus. These six primitives are in some normal or generic form and must be instantiated be the user to be used in his/her design. Moreover, the instantiated primitive may require transformations such as scaling, translation and rotation to be position at the desired place.

Suppose the block primitive is defined by its "lower left" corner < -1, -1, -1 > and "upper right" corner < 1, 1, 1 >. To produce a rectangular box with center at < 3, 2, 3 > and height and width 3 and length 5, the use may first scale the block primitive 1.5 times in the y- and z-direction and 2.5 times in the x-direction, and then translate the result to < 3, 2, 3 >. If the block primitive is called Block in a CSG system, the result may be obtained as follows:

translate(scale(Block, < 2.5, 1.5, 1.5 >), < 3, 2, 3 >)

In the above, the object to be transformed and the transformation data are the first argument and second argument.

Boolean Operators

We can combined two instantiated and perhaps transformed primitives into one with set union, set intersection and set difference operators. However, simple set operators may generate problems as will be discussed in regularized Boolean operators, modifications are required. Let us just use set operations on this page.

Given two sets, A and B, its union consists of all points from either A or B; its intersection consists of all points in both sets; and its difference, written as A - B (resp., B - A), consists of all points in A but not in B (resp., in B but not in A). In the following, A is the horizontal cylinder and B is the horizontal cylinder. From left to right, the four solids are union and intersection of A and B, A - B and B - A.

Therefore, a solid can be considered as the result of applying the Boolean operators to a set of instantiated and transformed CSG primitives.

Let us take a look at a simple example. We want to design a bracket-like shape with a hole shown on the right-most figure. We start start with two instantiations of blocks and one instantiation of a cylinder (the left-most figure). Then, the two blocks are scaled and one of them is rotated to a vertical position. The cylinder is also scaled so that its radius matches that of the hole (second). These three instantiations are than transformed to their desired positions. The final product is obtained by computing the union of the two blocks and then subtract from it the cylinder.

Please note that the design of the above solid is not unique. For example, the L shape can be constructed from subtract a cube from another one.

CSG Expressions

The design procedure of the above bracket can be written as an expression:

diff(union(trans(Block1), trans(Block2)), trans(Cylinder))
where union(A,B) and diff(A,B) are the union and difference of A and B, and trans() indicates appropriate transformations. Or, if we use +, ^ and - for set union, intersection and difference, the above function calls can be rewritten as a set expression as follows:

(trans(Block1) + trans(Block2)) - trans(Cylinder)
This expression can be convert to an expression tree, the CSG Expression, of the design:

In fact, every solid constructed using CSG technique has a corresponding CSG expression which in turn has an associated CSG tree. This expression of the CSG tree is a representation of the final design. Recall that the same solid may have different CSG expressions/trees. For example, one might punch a hole from Block1 first and then compute the union of this result with Block2. As a result, CSG representations are not unique.