Phyllotaxis for facade panel pattern


#1

I’ve just completed Gerard Nicholson’s Gherkin Dynamo Graph tutorial (which I recommend). See links below and graph attached.
https://www.autodesk.com/autodesk-university/class/Gherkin-Cloud-Fusion-360-Dynamo-Revit-Workflow-2018Gherkin_2019.02.21.dyn (50.9 KB)

I’m now wondering how the panels can be adapted to take on a Phyllotactic pattern rather than the diamond pattern in which all points are clearly horizontally and vertically aligned/ stacked. In other words, I’m trying to modify the graph to look more like a pineapple or pinecone, following the fibonacci series with no clear vertical or horizontal datums.

I’m starting with the dynamo primer exercise/graph on Phyllotaxis and hoping to apply it to a 3D lofted surface rather than the single flat plane in the original exercise. I would greatly appreciate any initial guidance/links anyone can provide and I will keep posting my progress on a working graph in the comments below. Thanks!

http://primer.dynamobim.org/04_The-Building-Blocks-of-Programs/4-2_math.html
Building Blocks of Programs - Math.dyn (55.9 KB)


#2

Phyllotactic_Gherkin_2019.02.21.dyn (86.4 KB)


#3

To place adaptive panels you need a list of points organized in this way
List
0 List
1
2
3
4
1 List
1
2
3
4
Start this exercise by using a Conceptual mass family.


#4

I will try to make a list of points that corresponds to these cylindrical diagrams:



#5

Referred to this to come up with the script below.
A Code to Node exercise should get you started.

//Gherkin Surface
sr01 = Surface.ByLoft(Circle.ByCenterPointRadius
(Point.ByCoordinates(0,0,[0,85,168,173,175]),[25,28,11,7,3]));

//Density
n = 1000;

//Alpha
a = 137.5;

//Phyllotactic Points
pt01 = Point.ByCylindricalCoordinates(CoordinateSystem.Identity(),
(0..n)*a,0, Math.Sqrt(0..n));

//Determining Point Parameters to map to surface
pg01 = Polygon.RegularPolygon(Circle.ByCenterPointRadius(Point.Origin(),
Math.Sqrt(n)),4).Rotate(Point.Origin(),Vector.ZAxis(),45);

pr01 = pg01.Patch().UVParameterAtPoint(List.FilterByBoolMask
(pt01,pg01.ContainmentTest(pt01))["in"]);

pt02 = sr01.PointAtParameter(pr01.U,pr01.V);

sp01 = [sr01,Sphere.ByCenterPointRadius(pt02,5)];

#6

wow! thank you for sharing