Material Computations

by denamolnar

I have always been interested in patterns that were capable of change. For my Computational Design Project, I chose to design a circular pattern that could deform in shape and size. Using Grasshopper, which is a plug-in for Rhino, I used pre-determined values and a code to generate a 3 dimensional cylinder that expands and contracts at its center. I then used the top views of the cylinder’s deformed surface to capture different radial shapes for laser cutting and embroidery design.

Grasshopper plug-in with Slider to adjust radial shapes

Shapes generated by moving the slider

Below is an image of one of the shapes imported into Ilustrator as a 2 dimensional vector file for use on the laser cutter and embroidery machines. When I imported the file, many layers of lines were produced as a result of the 2d image being a projection of a 3d object. I had to delete any duplicate lines in order to prevent the laser cutter from over etching a single line, and to prevent the embroidery program from crashing. Over etching in areas did produce some nice results as well however. The darkest lines seen in the design below (creating a circle) were over etched and caused the center circle to fall away from the etched border. This allowed me to mix and match different patterned/colored circles for the center of the design.

Once imported into the laser cutting program, I used felt as the base for the design to be etched onto.

Various shapes were pieced together with a fabric adhesive

Finished laser etched designs

Embroidery

Finished embroidery

Rhino/Grasshopper C# code

private void RunScript(OnCurve c1, OnCurve c2, On3dPoint pt, double dd, ref object A, ref object B)
{
int i = 0;
c1.SetDomain(0.0, 1.0);
c2.SetDomain(0.0, 1.0);
List<OnLine> l = new List<OnLine>();
List<On3dPoint> p1 = new List<On3dPoint>();
List<On3dPoint> p2 = new List<On3dPoint>();
int np = 100;
double dt = 1.0 / (np – 1.0);
for (i = 0; i < np; i++) {
p1.Add(c1.PointAt(i * dt));
p2.Add(c2.PointAt(i * dt));
}
int i1 = 0;
int i2 = 0;
int rep = np;
i1 = 5;
i2 = 0;
int s1 = 1;
int s2 = 0;
rep = 2 * np;
for (i = 0; i < rep; i++) {
if (i % 10 == 0) {
if (s1 == 0) {
s1 = 1;
s2 = 0;
}
else {
s1 = 0;
s2 = 1;
}
}
i1 += s1;
i2 += s2;
i1 %= np;
i2 %= np;
l.Add(new OnLine(p1[i1], p2[i2]));
}
OnMesh ms = new OnMesh();
for (i = 0; i < l.Count – 1; i++) {
OnMesh m = new OnMesh(2, 6, false, false);
m.SetVertex(0, l[i].from);
m.SetVertex(1, l[i + 1].from);
On3dPoint mp1 = (l[i].from + l[i].to) * 0.5;
On3dPoint mp2 = (l[i + 1].from + l[i + 1].to) * 0.5;
On3dVector dp1 = mp1 – pt;
dp1.Unitize();
dp1 *= dd;
On3dVector dp2 = mp2 – pt;
dp2.Unitize();
dp2 *= dd;
if (i % 2 == 0){
m.SetVertex(2, mp1 + dp1);
m.SetVertex(3, mp2 – dp2);
}
else {
m.SetVertex(2, mp1 – dp1);
m.SetVertex(3, mp2 + dp2);
}
m.SetVertex(4, l[i].to);
m.SetVertex(5, l[i + 1].to);
m.SetQuad(0, 0, 1, 3, 2);
m.SetQuad(1, 2, 3, 5, 4);
ms.Append(m);
}
A = l;
ms.ComputeVertexNormals();
B = ms;