Moiré Pattern – Example 1.6
A slightly different approach to pattern making is something called a Moiré Pattern. These were mentioned in Stan Allen’s famous essay, “From Object to Field“, as a type of proto-complex field system, and a potential formal method for contemporary design. It is also related to the formal concept of creating complexity though the aggregation of layers, each layer contributing towards the overall composition. I will eventually show a project a student of mine did using this relatively simple strategy, and once I start writing more about theoretical explorations, I will come back to the Moiré Pattern again. For now though, I just wanted to show a potential Moiré pattern generator using some fairly basic tools in Grasshopper. This example is a bit more advanced than the other examples in Part 1, and it starts to introduce some concepts I will delve into further in part 3, but hopefully you can follow along! Step One – Isolating Points We are going to start with a simple four sided polygon, in this case a square. I am using the “Control Points” component to show the corner points of this shape (although some other components would work just as well). After this I use the “List Item component” to break out the four corners of the rectangle. You can see the point order for this particular shape. The point list runs counter-clockwise, 0, 1, 2, 3… Point 4 is actually the same as point 0, so I don’t necessarily want to list it. What we want to do is distort this original shape by moving the four corners left/right and up/down. Before we can move the points, however, we need to isolate them. The list item component is very handy. it takes out ALL particular items with a particular Index number. Here the “i” input uses the default “0”. To have “List Item” output more than the 0 items, you can zoom in really close and you will see “+” and “-” signs. This is an example of a component that you can add or take ports away from. In this particular case, however, the four points are listing separately the four points of interest.
Step Two – Moving a Point in Multiple dimensions With the points now isolated, we will use the first one. There is a fairly handy component, which I haven’t really used that much, but which can simplify the point movement operation significantly. The standard way to do this is to move each point with sliders for the X domain, and the do a second move with another slider for the Y domain. This gets quite complex after a while. Place the “MD Slider” Input on the canvas, right click it to set the X and Y domains (you can also use it for Z domains). What this does is it outputs a “point”. You can then use the “Addition” component to add this point to the points that we isolated. Now you can easily move the point in two dimensions.
Step Three – Repeat for the Other Points and Rebuild Curve Now just copy and paste for the other corners. I arranged the four graphs to correspond with their location in the square. Now to rebuild your curve, use the points and input them into the “Polyline” component. To do this, you hold down “Shift” (to input multiple wires into the same port) and then drag the wires not the Polyline in the proper order (0, 1, 2, 3)… For the “C” input of the polyline input a “True” value to close your shape. We now have two curves, our original curve, and our distorted curve. Step Four – Rotate distorted curve This is an optional step to make the script a bit more flexible, but I want to be able to “Rotate” my second curve around its own center point as an additional way of controlling the moiré. Make sure the “angle” input is in Degrees. Step Five – Convert to “Surfaces” and Divide I have now two Edge curves, and i want to fit a grid into each of them. This is another very common way to set up a starting grid, especially useful if your overall dimensions are fixed, but you want to play around with the number of divisions in the X and Y direction. The advantage of this is that if you expand one of the grids we looked at in the previous examples (Square Grid, Rectangle Grid) by adding columns or rows, it will get bigger spatially, so then you need to go back and reduce the cell size to keep it roughly the same size. However, If you have a fixed surface, (or project site) but want to test out the range of divisions of that surface, this is a good way. So now we have the two boundary rectangles we drew, the one we drew in Rhino, and the distorted one which we changed through Grasshopper. We use the “Boundary Surface” component to change these into surfaces. We now use two components to divide the surface. The first is the “Divide Domain2″ component. This has sliders for U and V values, which are sort of equivalent to X and Y but not quite, since they are relative to the surface, not to the world X and Y. In our first surface, they correspond exactly to X and Y, but in our distorted and rotated surface, you will see that this is not the case. This component creates the domain which is input into the the “Isotrim” component which is confusingly labeled SubSrf the the script image. Also compusing is that “Divide Domain2” outputs an “S” but this plugs into a “D” No worries though. You should definitely remember this setup though. It is very useful and I use it probably more than other Grid creation technique.
Step Six – Create “Cells” and Offset Isotrim/Subsrf outputs only “Surfaces”, no points, and no “Cells” like our Grid components. We can get these pretty easily though. Here i used the surface “Edges” component to get the edges of each sub-surface, and then I use the “Join” component to join these together into a single closed shape. Next, I use the “Offset” component to offset them towards the cell interior, which is a “Negative” direction, hence the “Negative” component. Step Seven – Match data and create Lofts Data structuring and data matching is an important topic in Grasshopper, but one of the things beginners and even intermediate users tend to quite dislike. If you work with Grasshopper long enough, you might start to like it as it is like solving a big puzzle, or you may just grin and bear it. Here I want to match two sets of data together to create a series of lofts. I will talk more about “Lofted” surfaces later, but they are our second type of “surface” (we already saw “Boundary Surface”) We need to create these surfaces to give our two grids thickness and color. If the data is not structured well, when you plug your curves into Loft, it will either do crazy things or nothing at all. In the first image above, I have grafted the “Curves” I joined together, and then grafted them again after the “Offset” operation. I want to create a loft, a surface which fits between 2 or more curves, from these two sets. When I plug the two into the “Loft” component (Hold down “Shift” and plug in the two wires), nothing happens. That is because the data, even though it has the same number of containers, doesn’t match perfectly and thus cannot be Merged. To do this, the number of levels of data has to be the same. You will notice a bunch of “layers” of data have accumulated through various operations. To solve this, we simply right click on the places where we graft, and at the same time we also click “Simplify” This gets rid of any necessary layers of information. There are a FEW cases where you don’t want to simplifiy, but generally, simpler is better, and in this case, required. Once you simplify the data can be merged. By the way, you can also merge two or more data streams using the “Merge” component before plugging it into the loft. This is a more “correct” way to to it. Step Eight – Color the Grids Repeat the process described above for the second grid. The loft, like a boundary surface, can be viewed with a color using the “Custom Preview” component and a color “Swatch” Variations In the first three variations here, I changed only the Rotation of the two grids. You can see even a small rotation will create a complex pattern. In the second three variations, I didn’t rotate the grid at all, I only distorted the four corners. In the third series of variations, I combined rotation with distortion, and then increased the number and proportion of cells. Lastly, for reference, here is the overall script.