I am trying to develop an architectural machine, that will help with the arrangement of certain rooms inside a building. There are rooms that need to be next to each other due to design rules that try to maximize the usability of a building. Walking distances for example have to be as small as possible for paths that are most frequently used. Other areas need to be as far apart from each other as possible. Work spaces shouldn’t be next to kitchens due to possible odor nuisance.
While manually developing the layout of a building based on aspects of urban planing, exposure to natural light and so on, we often tend to forget to apply these rules of usability in the first steps of the design process. What if we build a machine that inhabits a certain set of rules and that only lets us explore valid options, creating an interactive layout tool that helps us to consider more aspects than we could normally process in our creative minds?
This example is based on an office building with a variable amount of employees. Through the number of employees we are able to calculate the needed size of the room structures which are then displayed as circles with a diameter corresponding to their calculated area. These circles are in fact bounding boxes since the structures aren’t supposed to overlap each other. Between the areas that need a direct connection springs are applied. These springs each having a specific force try to attract the room structures that are connected to each other minimizing the walking distance between them. Rooms that need to be close to each other but don’t necessarily need a direct connection are able to attract themselves as well. Other areas that need a certain distance between them will repel.
The wohle program is based on the “generative design library” that adds certain features to the “processing” environment enabling me to easily implement a force directed layout into the machine by supplying basic objects for physical simulations. Rooms are described in nodes. Each node has different values such as position, size and strength. The strength determines the gravitational force between the nodes and can either create attraction or repulsion. The springs are actually elastic connections between two nodes. They differ in length, stiffness and damping. Spring and nodeforces usually antagonize each other to some degree.
Wanting to be able to influence how the forces interact with each other I chose to set up a gui, that gives you basic control over some of the values stated above. When you click and drag one of the nodes it will move along your mouse, giving you the opportunity to rearrange the whole layout of the building.
Once you have found a valid solution for the layout you can apply a simple tessellation in order to get the actual structure inside the building. For now I used the voronoi function to generate the rooms around the nodes. Although this rather popular method seems to go along with the idea of this program and is fairly easy to implement it doesn’t really fit all the needs. The voronoi function usually generates acute angles to some amount and that is probably something you don’t really want to see in a floor plan.
In the next step you are able to generate a patio that provides access to the rooms. A set of subnodes is connected to the nodes with springs. You can control gravitation or repulsion of the subnodes as well es the springs length, stiffness and the radius of the area around the subnodes in which the forces are applied.
In the last step everything is graphically bled together revealing the final structure of the building.
I implemented a simple way to save and load your settings, enabling you to discover more options as soon as you found a perfect mix of forces. Another thing to consider is the size and shape of the property in which the building is supposed to be located at. The property acts as a kind of bounding box so that none of the nodes lie outside of the building area.
Well, enough theory for now. Go ahead and try for yourself. (zip 3MB, mac, linux, win)
A big “thank you” goes out to pomax and jestermax at irc.freenode.org #processing for helping me with the load/save function.