Author Archives: heath

parametric lace_heath west

081211_layout_08

081211_layout_04

081211_layout_05

081211_layout_06

081211_layout_07

081211_layout_03

081211_layout_02

081211_layout_09

081211_layout_01

Option Explicit

Call distanceBasedRecursion()
Sub distanceBasedRecursion()

Dim strSrf : strSrf = Rhino.GetObjects (“Select surfaces”,8)
Dim arrPts : arrPts = Rhino.GetObjects (“Select points”,1)
Dim arrParameters : arrParameters = array(“Fall Off Distance from Points”, “Minimum Division Length”, “Maximum Division Length”)
Dim arrValues: arrValues = array(“2”, “2”, “4”)
Dim arrResults : arrResults = Rhino.PropertyListBox(arrParameters, arrValues, “Parameters”, “Distance Based Recursion” )
Dim fallOffDist, minLen, maxLen

If IsArray(arrResults) Then
fallOffDist = FormatNumber(arrResults(0))
fallOffDist = fallOffDist
minLen = FormatNumber(arrResults(1))
minLen = minLen
maxLen = FormatNumber(arrResults(2))
maxLen = maxLen
End If

Dim triangle
Call Rhino.Command (“selsrf “)
Dim arrTriangle : arrTriangle = Rhino.SelectedObjects
Rhino.EnableRedraw False
For Each triangle In arrTriangle
subdivideTriangle triangle
Next
Rhino.EnableRedraw True
End Sub

Function subdivideTriangle(triangle)
Dim triangleLength, vertexPts, centerPt, triangleCrv, srfParam, srfNormal, arrTri, nMin, nMax, i, j
arrTri = Rhino.DuplicateSurfaceBorder (triangle)

For Each triangleCrv In arrTri
triangleLength = Rhino.CurveLength(triangleCrv)

For i=0 To UBound(arrTri)
If (triangleLength > 1.5) Then

centerPt = Rhino.CurveAreaCentroid(triangleCrv)
srfParam = Rhino.SurfaceClosestPoint(triangle, centerPt(0))
srfNormal = Rhino.SurfaceNormal(triangle, srfParam)
vertexPts = Rhino.PolylineVertices(triangleCrv)

Dim midpt0, midpt1, midpt2, midpt3, midpt4, midmid3, midmid4, quarterPt0, quarterPt1, quarterPt2, quarterPt3, quarterPt4
Dim triangle0, triangle1, triangle2, triangle3, triangle4, triangle5, triangle6, triangle7

midPt0 = Array(((vertexPts(1)(0) + vertexPts(0)(0)))/2, ((vertexPts(1)(1) + vertexPts(0)(1)))/2, ((vertexPts(1)(2) + vertexPts(0)(2)))/2)
midPt1 = Array(((vertexPts(2)(0) + vertexPts(1)(0)))/2, ((vertexPts(2)(1) + vertexPts(1)(1)))/2, ((vertexPts(2)(2) + vertexPts(1)(2)))/2)
midPt2 = Array(((vertexPts(0)(0) + vertexPts(2)(0)))/2, ((vertexPts(0)(1) + vertexPts(2)(1)))/2, ((vertexPts(0)(2) + vertexPts(2)(2)))/2)
‘midPt3 = Array((vertexPts(3) (0) + vertexPts(4) (0))/2,(vertexPts(3) (1) + vertexPts(4) (1))/2, (vertexPts(3) (2) + vertexPts (4) (2))/2)
‘midPt4 = Array((vertexPts(4) (0) + vertexPts(0) (0))/2,(vertexPts(4) (1) + vertexPts(0) (1))/2, (vertexPts(4) (2) + vertexPts (0) (2))/2)

quarterPt0= Array((midPt0(0) + centerPt(0)(0))/2, (midPt0(1) + centerPt(0)(1))/2, (midPt0(2) + centerPt(0)(2))/2)
quarterPt1= Array((midPt1(0) + centerPt(0)(0))/2, (midPt1(1) + centerPt(0)(1))/2, (midPt1(2) + centerPt(0)(2))/2)
quarterPt2= Array((midPt2(0) + centerPt(0)(0))/2, (midPt2(1) + centerPt(0)(1))/2, (midPt2(2) + centerPt(0)(2))/2)
‘quarterPt3= Array((midPt3(0) + centerPt(0)(0))/2, (midPt3(1) + centerPt(0)(1))/2, (midPt3(2) + centerPt(0)(2))/2)
‘quarterPt4= Array((midPt4(0) + centerPt(0)(0))/2, (midPt4(1) + centerPt(0)(1))/2, (midPt4(2) + centerPt(0)(2))/2)

triangle4 = Rhino.AddSrfPt(Array(vertexPts(0), quarterPt0, quarterPt2))
triangle5 = Rhino.AddSrfPt(Array(vertexPts(1), quarterPt1, quarterPt0))
triangle6 = Rhino.AddSrfPt(Array(vertexPts(2), quarterPt2, quarterPt1))
‘triangle7 = Rhino.AddSrfPt(Array(quarterPt0, quarterPt1, quarterPt2, quarterPt0))

subdivideTriangle triangle4
subdivideTriangle triangle5
subdivideTriangle triangle6
‘subdivideTriangle triangle7’comment out this line to produce a sierpiński triangle

Rhino.DeleteObjects(Array(triangle, triangleCrv))
End If
Next

For j=0 To UBound(arrTri)
If (triangleLength > 3) Then

midPt0 = Array((vertexPts(0) (0) + vertexPts(1) (0))/2,(vertexPts(0) (1) + vertexPts(1) (1))/2, (vertexPts(0) (2) + vertexPts (1) (2))/2)
midPt1 = Array((vertexPts(1) (0) + vertexPts(2) (0))/2,(vertexPts(1) (1) + vertexPts(2) (1))/2, (vertexPts(1) (2) + vertexPts (2) (2))/2)
midPt2 = Array((vertexPts(2) (0) + vertexPts(3) (0))/2,(vertexPts(2) (1) + vertexPts(3) (1))/2, (vertexPts(2) (2) + vertexPts (3) (2))/2)
‘midPt3 = Array((vertexPts(3) (0) + vertexPts(4) (0))/2,(vertexPts(3) (1) + vertexPts(4) (1))/2, (vertexPts(3) (2) + vertexPts (4) (2))/2)
‘midPt4 = Array((vertexPts(4) (0) + vertexPts(0) (0))/2,(vertexPts(4) (1) + vertexPts(0) (1))/2, (vertexPts(4) (2) + vertexPts (0) (2))/2)

triangle0 = Rhino.AddSrfPt(Array(vertexPts(0), midPt0, midPt2))
triangle1 = Rhino.AddSrfPt(Array(vertexPts(1), midPt1, midPt0))
triangle2 = Rhino.AddSrfPt(Array(vertexPts(2), midPt2, midPt1))
triangle3 = Rhino.AddSrfPt(Array(midPt0, midPt1, midPt2, midPt0))

subdivideTriangle triangle0
subdivideTriangle triangle1
subdivideTriangle triangle2
subdivideTriangle triangle3’comment out this line to produce a sierpiński triangle

Rhino.DeleteObjects(Array(triangle, triangleCrv))
End If
Next
Next
End Function

Function RandomNumber(nMin, nMax)
RandomNumber = Null

If Not IsNumeric(nMin) Then Exit Function
If Not IsNumeric(nMax) Then Exit Function

If nMin >= nMax Then Exit Function
Randomize

RandomNumber = Int((nMax – nMin + 1) * Rnd + nMin)
End Function

Advertisements

parametric lace_distanceBasedRecursion

080731_layout_1 080731_layout_1

This rhinoscript subdivides triangular surfaces from multiple point attractors. There are two types of subdivision patterns which may be called; one derives from the mid points of each triangle, while the other divides from the quarter points. Both may be called at the sametime, or separately, within the function subdivideTriangle, the triangleLength for i & j may be adjusted for such calls.

Option Explicit
‘Script written by heath west & mark bearak
‘Script version 17 November 2008 13:57:37

Call distanceBasedRecursion()
Sub distanceBasedRecursion()

Dim triangle, fallOffDist, intPts
Dim j, k, strAttractor, strTriangle, arrPt, arrAttractor, testDistance, dblDistance, strCrv, arrCrvs, dblCrvLength, dblCurrentLength
Dim triangleLength, vertexPts, i, centerPt, triangleCrv, srfParam, srfNormal, arrTri, arrAttPt, arrCrvCnt, dblDist

Dim arrtriangle : arrtriangle = Rhino.GetObjects(“select the triangles”,8)
Dim arrStrAttractors : arrStrAttractors = Rhino.GetObjects (“select the points”,1)
Dim arrParameters: arrParameters = array(“Fall Off Distance”)
Dim arrValues: arrValues = array(“2”)
Dim arrResults: arrResults = Rhino.PropertyListBox(arrParameters, arrValues, “Distance Based Recursion” )

If IsArray(arrResults) Then
fallOffDist = arrResults(0)
End If

Call Rhino.enableredraw (False)
ReDim arrAttractors(UBound(arrStrAttractors ))
k=0

For Each strAttractor In arrStrAttractors
arrAttractors(k) = Rhino.PointCoordinates (strAttractor)
k=k+1
Next

For Each strTriangle In arrtriangle
arrPt = Rhino.SurfaceAreaCentroid (strTriangle)
arrCrvs    = Rhino.DuplicateSurfaceBorder (strTriangle)
dblCrvLength = 0

For j = 0 To Ubound(arrCrvs)
dblCurrentLength = Rhino.CurveLength (arrCrvs(j))
dblCrvLength = dblCrvLength + dblCurrentLength
Next

dblDistance = fallOffDist

For Each arrAttractor In arrAttractors
testDistance = Rhino.Distance (arrPt(0), arrAttractor)
If testDistance < dblDistance Then
dblDistance = testDistance
End If
Next

arrTri = Rhino.DuplicateSurfaceBorder (strTriangle)

For Each triangleCrv In arrTri
triangleLength = Rhino.CurveLength(triangleCrv)
arrAttPt = Rhino.PointCoordinates(arrStrAttractors(0))
arrCrvCnt = Rhino.CurveAreaCentroid (triangleCrv)
dblDist = Rhino.Distance (arrCrvCnt(0),arrAttPt)

If dblDistance < fallOffDist+0.1 Then
subdivideTriangle(strTriangle)
Else
End If
Next
Next
Rhino.EnableRedraw (True)
End Sub

Function subdivideTriangle(strTriangle)
Dim triangleLength, vertexPts, centerPt, triangleCrv, srfParam, srfNormal, arrTri, nMin, nMax, i, j, fallOffDist
arrTri = Rhino.DuplicateSurfaceBorder (strTriangle)

For Each triangleCrv In arrTri

Dim midpt0, midpt1, midpt2, midpt3, midpt4, midmid3, midmid4, quarterPt0, quarterPt1, quarterPt2, quarterPt3, quarterPt4
Dim triangle0, triangle1, triangle2, triangle3, triangle4, triangle5, triangle6, triangle7
triangleLength = Rhino.CurveLength(triangleCrv)
centerPt = Rhino.CurveAreaCentroid(triangleCrv)
srfParam = Rhino.SurfaceClosestPoint(strTriangle, centerPt(0))
srfNormal = Rhino.SurfaceNormal(strTriangle, srfParam)
vertexPts = Rhino.PolylineVertices(triangleCrv)

midPt0 = Array(((vertexPts(1)(0) + vertexPts(0)(0)))/2, ((vertexPts(1)(1) + vertexPts(0)(1)))/2, ((vertexPts(1)(2) + vertexPts(0)(2)))/2)
midPt1 = Array(((vertexPts(2)(0) + vertexPts(1)(0)))/2, ((vertexPts(2)(1) + vertexPts(1)(1)))/2, ((vertexPts(2)(2) + vertexPts(1)(2)))/2)
midPt2 = Array(((vertexPts(0)(0) + vertexPts(2)(0)))/2, ((vertexPts(0)(1) + vertexPts(2)(1)))/2, ((vertexPts(0)(2) + vertexPts(2)(2)))/2)

quarterPt0= Array((midPt0(0) + centerPt(0)(0))/2, (midPt0(1) + centerPt(0)(1))/2, (midPt0(2) + centerPt(0)(2))/2)
quarterPt1= Array((midPt1(0) + centerPt(0)(0))/2, (midPt1(1) + centerPt(0)(1))/2, (midPt1(2) + centerPt(0)(2))/2)
quarterPt2= Array((midPt2(0) + centerPt(0)(0))/2, (midPt2(1) + centerPt(0)(1))/2, (midPt2(2) + centerPt(0)(2))/2)

For i=0 To UBound(arrTri)
If (triangleLength > RandomNumber(2,3)) Then

triangle0 = Rhino.AddSrfPt(Array(vertexPts(0), quarterPt0, quarterPt2))
triangle1 = Rhino.AddSrfPt(Array(vertexPts(1), quarterPt1, quarterPt0))
triangle2 = Rhino.AddSrfPt(Array(vertexPts(2), quarterPt2, quarterPt1))
triangle3 = Rhino.AddSrfPt(Array(quarterPt0, quarterPt1, quarterPt2, quarterPt0))

subdivideTriangle triangle0
subdivideTriangle triangle1
subdivideTriangle triangle2
subdivideTriangle triangle3

Rhino.DeleteObjects(Array(strTriangle, triangleCrv))
End If
Next

For j=0 To UBound(arrTri)
If (triangleLength > RandomNumber(3,4)) Then

triangle4 = Rhino.AddSrfPt(Array(vertexPts(0), midPt0, midPt2))
triangle5 = Rhino.AddSrfPt(Array(vertexPts(1), midPt1, midPt0))
triangle6 = Rhino.AddSrfPt(Array(vertexPts(2), midPt2, midPt1))
triangle7 = Rhino.AddSrfPt(Array(midPt0, midPt1, midPt2, midPt0))

subdivideTriangle triangle4
subdivideTriangle triangle5
subdivideTriangle triangle6
subdivideTriangle triangle7’comment out this line to produce a sierpiński triangle

Rhino.DeleteObjects(Array(strTriangle, triangleCrv))
End If
Next
Next
End Function

Function RandomNumber(nMin, nMax)

RandomNumber = Null

If Not IsNumeric(nMin) Then Exit Function
If Not IsNumeric(nMax) Then Exit Function

If nMin >= nMax Then Exit Function
Randomize

RandomNumber = Int((nMax – nMin + 1) * Rnd + nMin)

End Function

parametric lace_prototyping

081105_lace edge detail

081105_study model details

081029_layout_00

081112_pattern test

pseudo code:

1) select pattern for recursive subdivision

2) select point(s) to initialize distance based recursion

3) assign fall off distance from point

4) subdivide pattern based on distance from point(s) & length of curves in the pattern.

and the (work in progress) rhinoscript…

Option Explicit
‘Script written by heath west & mark bearak
‘Script version 11 November 2008 13:57:37

Call distanceBasedRecursion()
Sub distanceBasedRecursion()
Dim triangle
Dim arrtriangle : arrtriangle = Rhino.GetObjects(“select the triangles”,8)
Dim arrLoc : arrLoc = Rhino.GetObjects (“select the points”,1)

Rhino.EnableRedraw False
For Each triangle In arrtriangle
subdivideTriangle(triangle)
Next
Rhino.EnableRedraw True
End Sub

Function subdivideTriangle(triangle)

Dim triangleLength, vertexPts, i, centerPt, triangleCrv, srfParam, srfNormal, arrTri, arrAttPt, arrCrvCnt, dblDist, arrpts, arrLoc()
arrTri = Rhino.DuplicateSurfaceBorder (triangle)

For Each triangleCrv In arrTri
triangleLength = Rhino.CurveLength(triangleCrv)
‘arrAttPt = Rhino.PointCoordinates(arrLoc(0))
arrCrvCnt = Rhino.CurveAreaCentroid (triangleCrv)
‘dblDist = Rhino.Distance (arrCrvCnt(0),arrAttPt)
‘dblDist = dblDist/2.1
Dim intPts : intPts = 30
arrpts = Rhino.DivideCurve (triangleCrv,intPts)

If (triangleLength > 3.5) Then
centerPt = rhino.CurveAreaCentroid(triangleCrv)

srfParam = Rhino.SurfaceClosestPoint(triangle, centerPt(0))
srfNormal = Rhino.SurfaceNormal(triangle, srfParam)
vertexPts = Rhino.PolylineVertices(triangleCrv)

Dim midpt0, midpt1, midpt2, triangle0, triangle1, triangle2, triangle3
midPt0 = Array(((vertexPts(1)(0) + vertexPts(0)(0)))/2, ((vertexPts(1)(1) + vertexPts(0)(1)))/2, ((vertexPts(1)(2) + vertexPts(0)(2)))/2)
midPt1 = Array(((vertexPts(2)(0) + vertexPts(1)(0)))/2, ((vertexPts(2)(1) + vertexPts(1)(1)))/2, ((vertexPts(2)(2) + vertexPts(1)(2)))/2)
midPt2 = Array(((vertexPts(0)(0) + vertexPts(2)(0)))/2, ((vertexPts(0)(1) + vertexPts(2)(1)))/2, ((vertexPts(0)(2) + vertexPts(2)(2)))/2)

srfNormal = Rhino.VectorUnitize(srfNormal)
srfNormal = Rhino.VectorScale(srfNormal, triangleLength * 0.00)

midPt0 = Rhino.VectorAdd(midPt0, srfNormal)
midPt1 = Rhino.VectorAdd(midPt1, srfNormal)
midPt2 = Rhino.VectorAdd(midPt2, srfNormal)

triangle0 = Rhino.AddSrfPt(Array(vertexPts(0), midPt0, midPt2))
triangle1 = Rhino.AddSrfPt(Array(vertexPts(1), midPt1, midPt0))
triangle2 = Rhino.AddSrfPt(Array(vertexPts(2), midPt2, midPt1))
triangle3 = Rhino.AddSrfPt(Array(midPt0, midPt1, midPt2, midPt0))

subdivideTriangle triangle0
subdivideTriangle triangle1
subdivideTriangle triangle2
subdivideTriangle triangle3 ‘comment out this line to produce a sierpiński triangle

Rhino.DeleteObjects(Array(triangle, triangleCrv))
End If
Next
End Function

Function RandomNumber(nMin, nMax)

RandomNumber = Null

If Not IsNumeric(nMin) Then Exit Function
If Not IsNumeric(nMax) Then Exit Function

If nMin >= nMax Then Exit Function
Randomize

RandomNumber = Int((nMax – nMin + 1) * Rnd + nMin)

End Function

parametric lace shelving system_heath west

the following slides make up the presentation for the two-thirds review of the anzalone & tiazzoldi studio, which will be presented wednesday, novemeber 5th. we; sam, karen, jay, and myself are building, at full scale, 8′ x 12′, a shelving system within a lace pattern. the primary material is limited to wood, secondary materials consit of waterjet cut aluminum, for connection plates within the modules. the rhinoscript i am using to address design issues responds not only to material thicknesses, but also to programmatic intentions, which consists of height, width, depth, transparency, opacity, and shelving availabilty for storage. as a spatial divider, portions of the lace will become intentionally too small for any form of storage, underlining the ability of lace aesthetic to produce ‘other’ functions, such as atmospheres from light and shadows. this will derive from an internal lighting system that is under development.

081105_cover_00

080731_layout_1

081029_layout_00

081105_connection reveal

081105_assembly photos_a

081029_layout_00

081029_layout_00

081029_layout_00

081029_layout_00

081105_new patterns_a

080731_layout_1

Option Explicit
‘Script written by mark bearak & heath west
‘Script version 11 03 2008 16:30:55

Call SubdivideCrvs()
Sub SubdivideCrvs()
Dim dblDist, strCrv, arrExpCrvs, arrDirection, arrpts, i, intDivPt, strTempLn, arrCCX,j,k,l, arrPt(), arrCrvCnt, arrAttPt
Dim arrLoc : arrLoc = Rhino.GetObjects (“select the points”, 1)
Dim arrCrvs : arrCrvs = Rhino.GetObjects (“select the polygons to fracture”, 4)

For Each strCrv In arrCrvs
arrAttPt = Rhino.PointCoordinates(arrLoc(0))
arrCrvCnt = Rhino.CurveAreaCentroid (strCrv)
dblDist = Rhino.Distance (arrCrvCnt(0),arrAttPt)
dblDist = dblDist/2.1
arrDirection =  Array(0,0,0)
Dim intPts : intPts = 30
arrpts = Rhino.DivideCurve (strCrv,intPts)

For l = 0 To dblDist+1
intDivPt = fix(RandomNumber(1, intPts-1))
strTempLn = Rhino.AddLine (array(arrpts(intDivpt)(0)-100,arrpts(intDivpt)(1),arrpts(intDivpt)(2)),array(arrpts(intDivpt)(0)+100,arrpts(intDivpt)(1),arrpts(intDivpt)(2)))
arrCCX = Rhino.CurveCurveIntersection (strTempLn,strCrv)

For k = 0 To UBound(arrCCX)
ReDim Preserve arrPt(k)
arrPt(k) = arrCCX(k,1)
Call Rhino.AddCurve (arrPt)
Dim arrOffset: arrOffset = Rhino.OffsetCurve (strCrv, arrDirection, 0.04,,3)
Call Rhino.ObjectColor(arrCrvs, RGB(127, 255, 0))
Call Rhino.DeleteObject (strTempLn)
Next
Next
Next
Call Rhino.Command (“seldup “)
Call Rhino.Command (“delete “)
Call Rhino.DeleteObjects(arrCrvs)
End Sub

Function RandomNumber(nMin, nMax)

RandomNumber = Null

If Not IsNumeric(nMin) Then Exit Function
If Not IsNumeric(nMax) Then Exit Function

If nMin >= nMax Then Exit Function
Randomize

RandomNumber = Int((nMax – nMin + 1) * Rnd + nMin)

End Function

heath west: 081026_twistedVase

the design of this series of vases is based upon the controlled randomness of radial dimensions inserted into the logistics of the rhinoscript. in theory, each vase will be unique when compared to its neighbor. the material make up of the series may be easily 3d printed, as each form is a closed polysurface. yet, cnc processes of manufacturing such as molding, makes the series available for a variety of material possibilities.

Option Explicit
‘Script modified by heath west
‘Script written by mark.bearak
‘Script copyrighted by dtls.Architecture
‘Script version Tuesday, October 28, 2008 1:48:31 PM

Call Main()
Sub Main()
Dim arrPlane, i, j, strCrv(), strInnerCrv(), intRadius, dblTwist, arrDomain, strSrf1, strSrf2, arrLftSrf1, arrLftSrf2, arrLftSrf3
For j = 0 To 5
For i = 0 To 10
ReDim Preserve strCrv(i)
ReDim Preserve strInnerCrv(i)
intRadius = RandomNumber(2,10)
arrPlane = Rhino.PlaneFromPoints (array(0,j*25,i*7), array(1,j*25,i*7), array(0,j*25+1,i*7))
strCrv(i) = Rhino.AddCircle (arrPlane, intRadius)
strInnerCrv(i) = Rhino.AddCircle (arrPlane, intRadius-1)
arrDomain = Rhino.CurveDomain(strCrv(i))
dblTwist = arrDomain(0) + (arrDomain(1)/10)*i
Rhino.CurveSeam strCrv(i), dblTwist
If i = 0 Then
Call rhino.MoveObject (strInnerCrv(i),array(0,0,0),array(0,0,1))
End If
If i = 0 Then
strSrf1 = Rhino.AddPlanarSrf (strCrv)
strSrf2 = Rhino.AddPlanarSrf (strInnerCrv)
End If
If i = 10 Then
arrLftSrf1 = Rhino.AddLoftSrf (array(strCrv(i),strInnerCrv(i)))
End If
Next
arrLftSrf2 = Rhino.AddLoftSrf (strCrv,,,1)
arrLftSrf3 = Rhino.AddLoftSrf (strInnerCrv,,,1)
Call Rhino.JoinSurfaces (array(arrLftSrf1(0),arrLftSrf2(0),arrLftSrf3(0),strsrf1(0),strsrf2(0)),True)
Call Rhino.deleteobjects (strCrv)
Call Rhino.DeleteObjects (strInnerCrv)
Next
End Sub

Function RandomNumber(nMin, nMax)

RandomNumber = Null

If Not IsNumeric(nMin) Then Exit Function
If Not IsNumeric(nMax) Then Exit Function

If nMin >= nMax Then Exit Function
Randomize

RandomNumber = Int((nMax – nMin + 1) * Rnd + nMin)

End Function