<?xml version="1.0" encoding="UTF-8"?>
<posts type="array">
  <post>
    <content>A reproduction of a well-known simulation demonstrating how particles in Brownian motion can grow crystalline structures. This example is often used to show how order can result from a seemingly randomized or chaotic process.

&lt;a href="#" onclick="new Ajax.Request('/assets/74/applet', {asynchronous:true, evalScripts:true, method:'get', parameters:'authenticity_token=' + encodeURIComponent('58ad05c927d712f3433ae90db38e2eabca0f0756')}); return false;"&gt;View this applet&lt;/a&gt;

The rules are: In this 500 px by 500 px applet, there are 50,000 particles that have equal probability of moving one pixel in any of the 8 potential directions each animation frame. There is one particle, the "seed," stationary at the start. If a moving particle hits a stationary particle, the moving one stops.

Click or click-and-drag to make more seed particles as the crystal grows. Just to warn you: this applet takes quite a bit of CPU power because of the number of particles. The simulation gets faster as the crystals grow because of the decreasing number of moving particles. The source code is linked to the right.</content>
    <created-at type="datetime">2009-08-14T01:04:02Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">32</id>
    <order-column type="integer">32</order-column>
    <permalink>Brownian_Crystal_Growth_1</permalink>
    <post-type>project</post-type>
    <section-id type="integer">5</section-id>
    <status>published</status>
    <title>Brownian Crystal Growth 1</title>
    <updated-at type="datetime">2009-08-14T01:04:41Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>&lt;a href="#" onclick="new Ajax.Request('/assets/60/applet', {method:'get', asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + encodeURIComponent('2ba7e7039c259d52f69ed274d36f22c0d5f6cddd')}); return false;"&gt;!/uploads/assets/0000/0066/fishes_screenshot_01.png!&lt;/a&gt;

p(first). This is a Processing sketch of a simple, agent-based simulation of fish. It demonstrates how to create a distributed system that mimics a complex, natural swarm behavior.

&lt;a href="#" onclick="new Ajax.Request('/assets/60/applet', {method:'get', asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + encodeURIComponent('2ba7e7039c259d52f69ed274d36f22c0d5f6cddd')}); return false;"&gt;View this applet&lt;/a&gt;

Each agent has a set of rules that govern how it responds to the fish immediately around it, specifically the direction and speed of the fish. 

A fish will ...

# ... turn towards the center of the group around it, which causes the fish to cluster, the first piece of "schooling" behavior,
# ... turn towards the average direction of the fish immediately around it (the last piece of schooling),
# ... turn away from a fish too close to it and speed up (to disperse the fish a bit),
# ... and turn towards and speed up to any source of "food" (the user's mouse after clicking once).

When running the applet, click once to turn your mouse into food. There's an error with the calculation of the angle that makes the fish turn suddenly and swirl to the left when the atan2 function skips between -PI and PI at the outside of the function's range. It was so fascinating I decided not to fix it for this quick sketch.

The source code is linked to the right. </content>
    <created-at type="datetime">2009-08-13T22:17:48Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">31</id>
    <order-column type="integer">31</order-column>
    <permalink>Fish_Agent_Simulation</permalink>
    <post-type>project</post-type>
    <section-id type="integer">5</section-id>
    <status>published</status>
    <title>Fish Agent Simulation</title>
    <updated-at type="datetime">2009-08-13T22:39:21Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>I would like to present an idea regarding computational design in architecture, that architects should be working at a higher conceptual and implementation level than parametric geometry. Some of the literature about performative design probably supports this assertion, especially the assertions about topological modeling, where the relationships between parts and assemblies, either heirarchical or not, are made explicit and mutable through a piece of software.

I could assert that existing software is inadequate to implement these two evolving concepts: topological and systemic modeling and simulation.

If systems are one version of a "higher-level" concept of architecture, in order to see how systems interact and result in a building, we need a tool to conflate different systems (of rules) against each other. Architecture still needs geometry as its primary means of documentation and representation, as a means of communicating the formal results of systems to others for fabrication, simulation, engineering, etc. So any system must ultimately affect the geometric results of the process.

Geometries, parts, and assemblies of parts can be linked to each other through parameterized rules. These parameters however need not be geometric, nor do they need to be translated immediately into geometric properties. One system can affect the parameters of another system, which can ultimately affect the geometry in question. Thus intermediary systems and their respective rules can be place at several degress of separation from each other. A network of systems then, with nonlinear relationships built upon one another, can ultimately affect a geometric result.

geometry &lt; parameter &lt; system &lt; parameter &lt; system &lt; ...

These systems can consist of sets of rules that govern different aspects of a design. It is the motivation of these systems and their constraints, restraints, limitations, rules, and parameters that form the basis for the affectation of other systems and geometry. Systems like structural rules, the rules of site geometry, air-flow mechanical requirements, efficient circulation of users, performance and geometry of facades, etc.

We need ways to encode these rules and parameters and a common data structure and language to allow computation to formulate and render the consequences of those rules. The cut-and-fill rules of site, for instance, and their economic and geometric consequences can filter through the structural rules to enhance and to limit the possible results.

The directedness of these rules and the full set of parameters need not be reconstructed with every building, nor need they be explicitly stated. I propose that artificial intelligence and artificial life algorithms, algorithms based on decision theory, can manage the fuzzy, compromise-laden relationships that occur in a building design process. The simulation of the building then, is not just an engineering method to analyze the performance of an incomplete yet explicitly modeled, detailed geometric proposition. But rather, the computational process can simulate the process of design through mimicking decisions through computational decision mechanisms.</content>
    <created-at type="datetime">2009-08-12T19:09:47Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">30</id>
    <order-column type="integer">30</order-column>
    <permalink>Notes_on_System-Based_Design</permalink>
    <post-type>researchentry</post-type>
    <section-id type="integer">3</section-id>
    <status>published</status>
    <title>Notes on System-Based Design</title>
    <updated-at type="datetime">2009-08-12T19:11:40Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>Metron is intended to be a parametric, system-oriented, computational, topological modeler that fills a perceived gap in the available tools for architectural design. It is a response to the research notes that I've started writing in the post ["Notes on System Based Design":/posts/Notes_on_System-Based_Design].

The software take some of the best ideas from existing popular software used in architecture, like Grasshopper, Rhino, Revit, etc., and imbues it with a powerful scripting interface to give it the flexibility of Processing. It thus far has basic animation and parametric frameworks that allow a user to gives parts and geometries animate behaviors and rules.

Metron uses the ["OpenNURBS":http://www.opennurbs.com] library to model precise geometry and also to give it import/export compatibility with Rhino. It is a native Mac Cocoa app, using ["MacRuby":http://www.macruby.org] to give it a scripting interface using ["Ruby":http://www.ruby-lang.org].
</content>
    <created-at type="datetime">2009-08-12T19:06:20Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">29</id>
    <order-column type="integer">29</order-column>
    <permalink>Metron_Development</permalink>
    <post-type>researchentry</post-type>
    <section-id type="integer">3</section-id>
    <status>published</status>
    <title>Metron Development</title>
    <updated-at type="datetime">2009-08-12T19:32:36Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>This is the card I recently designed with others from the Anomalus Design Studio, letter-pressed by Mathew Ford. Just the logo, some websites, and contact info that won't change very often.</content>
    <created-at type="datetime">2009-07-28T01:56:57Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">27</id>
    <order-column type="integer">27</order-column>
    <permalink>ImaginationFeed_Business_Card</permalink>
    <post-type>project</post-type>
    <section-id type="integer">2</section-id>
    <status>published</status>
    <title>ImaginationFeed Business Card</title>
    <updated-at type="datetime">2009-07-28T03:29:20Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>Just a growing list of commands for git, the version control system, that I use most often in my workflow. Documentation for git is so bad on the web, that I'm going to try and make a set of instructions that make it easier for new users to understand it.

GENERAL

Adding new files and all changes to the index.
*git add -A* (adds everything)
*git add [filename]*

Removing files from the index
*git rm [filename]*

Commit the index.
*git commit -m "Put a message here."*

Pushing changes to a remote repository
*git push [repository] [branch]*
*git push* (if the repo is 'origin' and the branch already known, like 'master')


CONFIGURATION

Setting the global user name and email for your local machine. This sets the user name and email for all projects on a machine that use git.
*git config --global user.name "Your Name Comes Here"*
*git config --global user.email you@yourdomain.example.com*

Makes TextMate the default editor for all projects. The -wl1 makes TextMate wait (-w) for the commit message and places the cursor in the proper place (l1). Other editors can be used, like "nano".
*git config --global core.editor "mate -wl1"*

Enabling all the default colors.
*git config --global color.ui "auto"*


CONFLICTS

When merging, with git merge for instance, or git pull, conflicts show up in the files in question with the two versions of data that conflict. Just remove the extraneous lines to make the file look exactly as it should.


BRANCHES

Track a branch someone else created on the remote repo origin
*git branch -b branchname origin/branchname*

Track a branch you created already (it already exists as a local branch). Here, the branch is called 'tagging'...
*git config branch.tagging.remote origin*
*git config branch.tagging.merge refs/heads/tagging*

To delete a branch on the remote repo (careful! the colon does the trick):
*git push origin :branchname*

To delete a local branch:
*git branch -d branchname*


REBASING

To rebase a branch onto another (e.g. branch 'experimental' onto 'master'), making it look as if new commits on a root branch were already in place as commits were made on a working branch.
*git rebase master* (if current branch is 'experimental')
*git rebase master experimental*

pre.. 
      A---B---C experimental
     /
D---E---F---G master

p. to

pre.. 
              A'--B'--C' experimental
             /
D---E---F---G master

p. To continue a rebase after conflicts.
*git rebase --continue*

To abort and undo a rebase.
*git rebase --abort*


CLEANUP

To clean up the repository, including deleting references to remote branches that may no longer exist:
*git gc*

To delete all the new files in the current tree (d = directories too, f = force / n = dry run).
*git clean -df*


STASH

Stash changes for later
*git stash save*

... with a message to describe what's in it:
*git stash save "Message here."*

Get a list of all the stashes.
*git stash list*

Apply the latest stash. Or you can give it a stash as one of the arguments and it will apply that one instead.
*git stash apply*

Apply stash@{0} and remove it from the stashes.
*git stash pop*

Clean the stash of all saved changes.
*git stash clear*


WORKFLOW

1) work on personal branch
2) fetch any changes from remote repository
3) if changes exist on master, then stash* changes, merge in master, and apply stash
4) if a small team, and you're ready to contribute the change to the master, then merge branch into master, push...

==*== If commits have been made, you have to rebase instead of stash. If uncommitable changes exist, then pull, stash, rebase, unstash.


PATCHES

Creating a patch for a specific commit only and putting it in a single file to email it, etc. The long hex string is the unique commit SHA for which you want to generate a patch. Get it by running *git log* and copy/paste.
*git format-patch -1 55751280638afe447e3c3e9c7c4b833401f24aa9 --stdout &gt; patch-file-name.diff*

Applying a received patch. I've discovered this doesn't have to be the same repository. Good for maintaining multiple parallel apps based on the same code.
*git am &lt; patch-file-name.diff*


</content>
    <created-at type="datetime">2009-05-24T04:30:24Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">26</id>
    <order-column type="integer">26</order-column>
    <permalink>Git_Quick_Reference</permalink>
    <post-type>project</post-type>
    <section-id type="integer">6</section-id>
    <status>published</status>
    <title>Git Quick Reference</title>
    <updated-at type="datetime">2009-08-14T00:04:21Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>This is just a simple script for Rhino that draws a tree recursively. It's just a demonstration of how to use a recursive algorithm to produce complex symmetry from a simple rule.

pre.. Option Explicit
'Script written by &lt;insert name&gt;
'Script copyrighted by &lt;insert company name&gt;
'Script version Saturday, April 04, 2009 11:46:36 AM

Call RecursiveTree()
Sub RecursiveTree()
    
    Dim arrPlantingPoint
    arrPlantingPoint = Rhino.GetPoint( "Enter a point to plant a tree" )
    
    ' Draw a line straight up and save it.
    Dim strTrunk
    strTrunk = Rhino.AddLine( arrPlantingPoint, Rhino.PointAdd( arrPlantingPoint, Array(0,0,10) ) )
    
    Rhino.EnableRedraw False ' Don't show me the drawing (for speed).
    
    ' Start the recursion. Pass it the line we just created, the number of
    ' levels of the tree (4), the angle for each set of branches (60 degrees),
    ' and the number of branches in each level (or generation) = 5.
    RecursiveBranches strTrunk, 4, 60, 5
    
    Rhino.EnableRedraw True ' Draw everything at once at the end.
    
End Sub


Function RecursiveBranches( strLine, intGenerations, intBranchAngle, intNumBranches )
    ' Check to see if we've reached the end of the tree, that is, the number of
    ' remaining generations (i.e. branches) equals 0.
    If intGenerations &lt;= 0 Then Exit Function
    
    ' Create a vector that describes the direction of the branch that we're
    ' drawing from, the branch (or trunk) that was passed in strLine.
    Dim vecDir
    vecDir = Rhino.VectorCreate( Rhino.CurveEndPoint(strLine), Rhino.CurveStartPoint(strLine) )
    
    ' Scale the vector down, so the next generation of branches is shorter
    ' than the last. Here, shortened by 10%, or 90% of the original length.
    vecDir = Rhino.VectorScale( vecDir, 0.9 )
    
    ' To rotate the new branch into place, we need axes to rotate about. The
    ' easiest way is to create a plane and use the axes it calculates. To 
    ' create a plane, we need a point and a vector, so here we grab the 
    ' endpoint of the line that was passed to the function.
    Dim ptEnd
    ptEnd = Rhino.CurveEndPoint(strLine)
    
    ' Create the plane.
    Dim arrPlane
    arrPlane = Rhino.PlaneFromNormal( ptEnd, vecDir )
    
    ' Variables we need for iteration. i is the counter, theta and phi are 
    ' angles used for rotates, vecNew is the new rotated vector (i.e. the new
    ' branch)
    Dim i, theta, phi, vecNew
    
    For i = 1 To intNumBranches
        ' Randomly create the two angles for rotation. 
        theta = Rnd() * intBranchAngle ' Drops the branch down.
        phi = Rnd() * 360 ' Spins the branch around the original axis.
        
        ' Create the new vector by rotating the original vector.
        vecNew = Rhino.VectorRotate( vecDir, theta, arrPlane(1) )
        vecNew = Rhino.VectorRotate( vecNew, phi, arrPlane(3) )
        
        ' Draw the new branch.
        Dim newBranch
        newBranch = DrawVector( arrPlane(0), vecNew )
        
        ' Draw another tree at the end of the branch we just drew. This is 
        ' the recursive part of the function...
        RecursiveBranches newBranch, intGenerations - 1, intBranchAngle, intNumBranches
    Next
    
End Function


' This is a convenience method for drawing vectors. You give it an
' origin point (the end of the vector), and it draws a line towards
' the tip of the vector, given as the second argument.
Function DrawVector( arrOrigin, arrVector )
    ' We need a variable that contains the tip of the vector.
    Dim arrVectorTip
    ' Get the vector's tip by adding the given vector to the
    ' origin point. Remember, the vector given only describes
    ' direction and magnitude.
    arrVectorTip = Rhino.PointAdd( arrOrigin, arrVector )
    
    ' Draw the vector's stem and keep track of the object id.
    Dim strVectorStem
    strVectorStem = Rhino.AddLine( arrOrigin, arrVectorTip )
    
    ' This method draws the curve annotation arrows built in
    ' to Rhino to make the line we just created look like an
    ' arrow. The '2' means draw the arrowhead at the end of
    ' the curve. '1' = the beginning, '3' = both.
    Rhino.CurveArrows strVectorStem, 2
    
    ' Return the drawn line.
    DrawVector = strVectorStem
End Function</content>
    <created-at type="datetime">2009-05-23T06:09:28Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">25</id>
    <order-column type="integer">9</order-column>
    <permalink>Recursive_Tree_in_RhinoScript</permalink>
    <post-type>page</post-type>
    <section-id type="integer">6</section-id>
    <status>published</status>
    <title>Recursive Tree in RhinoScript</title>
    <updated-at type="datetime">2009-07-28T03:22:34Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>This is a web application that uses Amazon EC2 to launch an instance of Maxwell Render.

Find this project at ["http://maxwellcloud.com/":http://maxwellcloud.com/].


&lt;a class="none" href="#" onclick="new Ajax.Request('/uploads/assets/10/lightbox', {asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + encodeURIComponent('d1de1e091bb62fe6d74d87180f8f9233f7585e40')}); return false;"&gt;&lt;img alt="Sculpture_large" src="/uploads/assets/0000/0010/sculpture_large.png?1243018225" /&gt;&lt;/a&gt;

</content>
    <created-at type="datetime">2009-03-27T23:23:34Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">1</id>
    <order-column type="integer">8</order-column>
    <permalink>Maxwell_Cloud</permalink>
    <post-type>project</post-type>
    <section-id type="integer">2</section-id>
    <status>published</status>
    <title>Maxwell Cloud</title>
    <updated-at type="datetime">2009-07-28T03:22:33Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>A dual-screen multi-touch interface to enhance the process of designing buildings parametrically. This technology can be expanded to include analysis tools for structural and environmental design, as well as building information modeling requirements for cost estimation, construction scheduling, fabrication, and manufacturing.

The purpose of the dual-screen is to give the designer access to the plan and section of a building at the same time. It also allows the architect to interact with the section and the object of design simultaneously with ease.

The first extension to this system will include a generative, parametric engine to activate the object with behaviors and quantified relationships. The next extension will include a structural analysis engine.</content>
    <created-at type="datetime">2009-04-03T22:25:31Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">8</id>
    <order-column type="integer">7</order-column>
    <permalink>MultiTouch_Interface_for_Parametric_Architectural_Design</permalink>
    <post-type>researchentry</post-type>
    <section-id type="integer">3</section-id>
    <status>published</status>
    <title>Multi-Touch Interface for Parametric Architectural Design</title>
    <updated-at type="datetime">2009-07-28T03:22:34Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>A selection of interactive tools built with Processing for architecture students learning statics and strength of materials. The purpose of these tools is to remove the tedious mathematics out of learning statics so architecture students can focus on form-making and learning the relationships between geometry and material strength.

Find it at ["http://interactivestructures.org":http://interactivestructures.org].

For designers, the labor of hand mathematics often gets in the way of a higher-level understanding of how structures work and how small changes in geometry can result in large changes in internal forces. Architects should know where the outer limits of structural plausibility lie and the implications that certain scales and shapes have on material selection, structural systems, and construction methods.

</content>
    <created-at type="datetime">2009-04-01T14:50:42Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">6</id>
    <order-column type="integer">6</order-column>
    <permalink>Interactive_Structures</permalink>
    <post-type>project</post-type>
    <section-id type="integer">5</section-id>
    <status>published</status>
    <title>Interactive Structures</title>
    <updated-at type="datetime">2009-07-28T03:22:34Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>This is an attempt to improve the graphics of driving directions generated by Google Maps by making the importance of instructions evident at a glance through their graphic treatment. </content>
    <created-at type="datetime">2009-04-03T14:05:07Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">7</id>
    <order-column type="integer">5</order-column>
    <permalink>Visual_Directions</permalink>
    <post-type>project</post-type>
    <section-id type="integer">2</section-id>
    <status>published</status>
    <title>Visual Directions</title>
    <updated-at type="datetime">2009-07-28T03:22:34Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
  <post>
    <content>Addimus is a financial planning web application built around cash-flow forecasting. It is a better way to manage finances than "tracking" and categorizing, because it looks into your future with your calendar and regular expenses to show you how financial decisions today will affect you months from now.

Find this at ["http://addimus.com":http://addimus.com].</content>
    <created-at type="datetime">2009-04-01T08:25:47Z</created-at>
    <deleted-at type="datetime" nil="true"></deleted-at>
    <id type="integer">5</id>
    <order-column type="integer">4</order-column>
    <permalink>Addimus</permalink>
    <post-type>project</post-type>
    <section-id type="integer">2</section-id>
    <status>published</status>
    <title>Addimus</title>
    <updated-at type="datetime">2009-07-28T03:22:34Z</updated-at>
    <user-id type="integer">1</user-id>
  </post>
</posts>
