The Fitting Puzzle
or
Thank goodness for CSG (Constructive Solid Geometry)
Written by Paul Bourke
December 1996
What single object can slide exactly through each of the holes
shown below without leaving gaps? That is, the object must
slip through each hole filling the hole completely.
The solution is the intersection of each of the outlines of the holes
extruded along each of the three orthogonal axes in 3 space. This
is where CSG based rendering engines come to the rescue,
generating this intersection in a facet based modeller
would be extremely difficult, it is trivial in a solid modeller.
The following show the three primitives that intersect, a cylinder,
a rectangle, and a plus sign. The plus sign is in turn made up of
the union of two rectangles.
Below is a transparent version of the above in an attempt
to illustrate the intersecting volume.
And finally the actual intersecting volume. It is circular in
along one axis (x), square along another axis (z) and a plus sign
along the last axis (y).
If you have good woodworking skills and make one of these,
probably from wood,
please let me know and perhaps send me a copy.
The base into which the object fits might
look something like the following.
Again using CSG this is particularly easy to generate using the same
forms as described earlier but subtracting them from a rectangular box.
Source
The images above were generated using the RayShade rendering
package, the geometric description for the union and intersecting
volume is given below.
eyep 1.5 -2 2
lookp 0 0 0
up 0 0 1
fov 60
screen 200 200
light 1 1 1 directional 1 -0.5 1.5
light 0.5 0.5 0.5 directional -1 -0.5 0.7
light 0.2 0.2 0.2 directional 1 0 0
surface surfx
ambient .2 .05 .05
diffuse .8 .05 .05
specular .05 .05 .05
specpow 20
surface surfy
ambient .2 .05 .05
diffuse .05 .8 .05
specular .05 .05 .05
specpow 20
surface surfz
ambient .2 .05 .05
diffuse .05 .05 .8
specular .05 .05 .05
specpow 20
/* Plus sign along the x axis */
name xobject
union
box surfx -0.16666667 -1 -0.5 0.16666667 1 0.5
box surfx -0.5 -1 -0.16666667 0.5 1 0.16666667
end
/* Cylinder along the y axis */
name yobject
list
cylinder surfy .5 -1 0.0 0.0 1 0.0 0.0
disc surfy .5 -1 0.0 0.0 -1.0 0.0 0.0
disc surfy .5 1 0.0 0.0 1.0 0.0 0.0
end
/* Box along the z axis */
name zobject
list
box surfz -0.5 -0.5 -1 0.5 0.5 1
end
/* Create the unio of the three extruded forms */
name solidobject
list
object xobject
object yobject
object zobject
end
/* Create the intersecting volume
name solidobject
intersect
object xobject
intersect
object yobject
object zobject
end
end
*/
/* Create the base
name solidobject
difference
box surfa -2.5 -1 -0.25 2.5 1 0.25
union
object xobject rotate 1 0 0 90
union
object yobject
object zobject
end
end
end */
|