Daniel Dennett once addressed how impressive the products of an algorithm, the underlying process always consists of nothing but a set of individually mindless steps succeeding each other without the help of intelligent supervision: they are “automatic” by definition: the workings of an automaton. This project states that algorithm is a new set of geometry, a new set of aesthetic with autonomous agents.
Low-poly Modeling
modularity to subdivision surface

low-poly modeling
Mesh vector field
extract vector field data for orienting planes

mesh vector field
Mesh initial processing
build vertex-colored meshes for scalar and vector data fields

mesh initial processing
- Left: mesh with vector value
- Right: mesh with scalar value
Agent System
a flocking agent system based on Craig Reynolds classical rules
public class AgentPlaneSimulation{ // .......................... fields
15 collapsed lines
//public double cNS; //public double cNT; public double PlaneRadius; public double NeighborhoodRadius; public double CohesionStrength; public double AlignmentStrength; public double SeparationStrength; public double FieldStrength; public double MaxForce; public double MeshSeekRadius; public double MeshStrength; public double SeekColorStrength; public double MaxSpeed;
public AgentPlane[] agentPlanes;
// .......................... constructor
public AgentPlaneSimulation(List<Point3d> P, List<Vector3d> V, double cNS, double cNT, double pR, double cI, double aI, double sI, double fI, double mF)21 collapsed lines
{
//this.cNS = cNS; //this.cNT = cNT; this.PlaneRadius = pR; this.CohesionStrength = cI; this.AlignmentStrength = aI; this.SeparationStrength = sI; this.FieldStrength = fI; this.MaxForce = mF; this.MaxSpeed = 0.3;
// build agent planes array agentPlanes = new AgentPlane[P.Count];
Parallel.For(0, P.Count, i => { agentPlanes[i] = new AgentPlane(P[i], V[i], this); });
}
public AgentPlaneSimulation(List<Point3d> P, List<Vector3d> V)11 collapsed lines
{ // build agent planes array agentPlanes = new AgentPlane[P.Count]; this.MaxSpeed = 0.1;
Parallel.For(0, P.Count, i => { agentPlanes[i] = new AgentPlane(P[i], V[i], this); });
}
// .......................... methods
public void Update()39 collapsed lines
{
// . . . . . . . . . . environmental and stigmergic interactions
// calculate field influence vector for agents
foreach(AgentPlane ag in agentPlanes) { // clear neighbour list ag.neighbours.Clear(); ag.neighTens.Clear();
// calculate field vector from mesh // Eventhandler function for RTree search EventHandler<RTreeEventArgs> rTreeCallback = (object sender, RTreeEventArgs args) => { ag.neighbours.Add(MEnvironment.Vertices[args.Id]); ag.neighTens.Add(TensorField[args.Id]); };
MeshRTree.Search(new Sphere(MEnvironment.ClosestPoint(ag.O), MeshSeekRadius), rTreeCallback);
// this resets the acceleration (or desired direction) // in case a different update sequence is implemented // remember to reset desired before calculating the new iteration ag.ResetDesired(); ag.SeekMeshNeighbours(); ag.SeekColor(); ag.ComputeFieldAlign(ag.ComputeFieldVector(),FieldStrength);
}
// . . . . . . . . . . peer-to-peer interaction FLockRTree();
// . . . . . . . . . . update position and direction UpdateAgentsDirection();
}
public void FLockRTree()27 collapsed lines
{ // declare RTree RTree rTree = new RTree();
// populate RTree for (int i = 0; i < agentPlanes.Length; i++) rTree.Insert(agentPlanes[i].O, i);
// find neighbours for each agent foreach (AgentPlane agent in agentPlanes) { List<AgentPlane> neighbours = new List<AgentPlane>();
EventHandler<RTreeEventArgs> rTreeCallback = (object sender, RTreeEventArgs args) => { if (agentPlanes[args.Id] != agent) neighbours.Add(agentPlanes[args.Id]); };
rTree.Search(new Sphere(agent.O, NeighborhoodRadius), rTreeCallback);
// compute desired vector for each agent agent.ComputeDesiredNeighbours(neighbours); }
}
public void UpdateAgentsDirection()9 collapsed lines
{ // here's one of my mods - update positions and velocities in parallel Parallel.For(0, agentPlanes.Length, i => { // update at max Force agentPlanes[i].UpdateDirectionAndPosition();
}); }}Code credit: Alessio Eriol
Isosurfacing line-base network geometries
discretize 3d space with Marching Cubes algorithm into voxels

agent pre setup

agent body 1

agent body 2

agent body 3

algorithms are modes of thought logic becomes an aesthetic operation
