Before proceeding to the assignment, this news: The wallpaper group demo program is running again (there were some problems in the past few days with reorganization of the jReality website). Also, to change groups use the submenu Wallpaper->Groups... If you get tired of painting, try the automatic option Wallpaper->Run (Wallpaper->Pause to stop).
In this assignment you are asked to familiarize yourself with frieze groups, introduced in the lectures this week. A Euclidean frieze group is a discrete group of motions of the plane that has exactly one independent translation. There are seven such groups (up to affine conjugacy).
Directions for Assignment 3
- Update from the SVN repository. Run the application gunn.Application3. Use the ‘h’ key to browse the on-line documentation. Note that the inspector panel has a combo box with the names of the 7 frieze groups. Your task is to activate this combo box, so that choosing a frieze group generates a pattern with the symmetries of the chosen group.
- Copy gunn.Assignment3 into your own package. Modify it in order to implement as many of the frieze groups as you can. The method updateCopies() has been prepared for this modification. This picture shows how these groups appear using the same ‘L’ motif as that in Assignment3:
- Creating the isometries. To help you generate the correct isometries, I have added a new class util.IsometryExamples. Run it and see that it displays isometries of the types needed for the frieze groups: translations, rotations of 180 degrees, reflections in horizontal and vertical lines, and glide reflections. Study the code to see how that is done. Notice that we are working the euclidean plane but the matrices are calculated in euclidean space, such that the z-coordinate is left unchanged. A reflection in a line in the (x,y) plane is specified as a reflection in the plane in 3-space containing the line and perpendicular to the (x,y) plane, etc.
- Strategy hint. Notice that all the groups above have translational subgroups, such that there are either 1, 2, or 4 conjugacy classes with respect to this translational subgroup. By adapting the existing translation code to implement the translational subgroup (which means, in general, using a translation either 2 or 4 times as long), one is left with the task of generating 1, 2, or 4 group elements to represent the conjugacy classes, and putting them into a single SceneGraphComponent where they can be acted on by the translation subgroup.
- Non-euclidean metrics. It is possible to extend the definition of frieze group to be valid also for the elliptic and hyperbolic plane, since the both cases the notion of one independent translation is valid. It is optional whether you maintain the non-euclidean metrics in your modified version. I encourage you to attempt to do so, since all the operations are well-defined also in the non-euclidean metrics. As we have seen, the MatrixBuilder class supports construction of isometries in all three metrics. If you follow the strategy hint above, the simplest (metric-neutral) way to find a generator of translation subgroup is probably to calculate the appropriate power of the original translation.
- Fundamental domain. Find the reference to the field fundamentalDomain in the method initCopies(). This node holds all the geometry contained in the displayed pattern, i. e., the frieze group acting on this SceneGraphComponent generates the pattern. This currently contains the single child representing the letter ‘L’. Create a SceneGraphComponent and fill it with geometry describing a pattern of your choosing, and add it to the fundamentalDomain instead of, or in addition to, elSGC.
- Painting tool. [Optional] Create a single polygon of the appropriate size and shape and attach it to fundamentalDomain. (For example, use the method Primitives.texturedQuadrilateral() to generate such a shape). Then, adapt the 3D painting tutorial example de.jreality.tutorial.tool.Paint3DToolExample to create a tool which you add to the scene graph using fundamentalDomain.addTool(). This tool will allow you paint a pattern on this geometry and have it instantly replicated over all the copies. Once you have a pattern you like, save it (using File->Export…->Image with size 1000 x 288) and I will add it to the cycling images used for the header of the blog.