during the course of my investigation of simplistic model ideas with large number of different outcomes, I found myself working on a circular stack of triangles which are defined by few simple parameters. each parameter was originally defined by the user (the coding was left within the script but deactivated), however, as I was going through different settings to get shapes which are very different from each other for testing purposes, I decided to fully randomise the script. I have settled for the boundary condition of 20 units randomly picked to speed up the process of the shape search. within a matter of several minutes I have generated some 30 random shapes which were eventually dubbed 'spider evolution'. I'm now planning to expand the script or modify it for other purposes.

.:script:.

Option Explicit

'Script written by shane gregoran

'Script version 30 August 2010 00:20:56 updated 28 October 2010

Call p04TriangularSomethings()

Sub p04TriangularSomethings()

'for this purpose all random numbers have been set to max of 20

'Dim nPts : nPts = Rhino.GetReal("how many segments", 12)

Dim nPts : nPts = Floor(rnd*20)

If nPts < 3 Then

nPts = 3

End If

Dim cp : cp = Rhino.WorldXYPlane

cp(0)(2) = Floor(rnd*10)

'Dim iR : iR = Rhino.GetReal("length of short triangulation",10)

Dim iR : iR = Floor(rnd*20)

If iR < 1 Then

iR = 1

End If

'Dim R : R = Rhino.GetReal("length of segments",15)

Dim R : R = Floor(rnd*20)

If R < 1 Then

R = 1

End If

Dim iCirc, iLength, iPts

ReDim iPts(nPts)

iCirc = Rhino.AddCircle (cp,iR)

If Rhino.IsCurve(iCirc) Then

iLength = Rhino.CurveLength(iCirc)

End If

Dim i, S, iSc

For i = 0 To (nPts-1)

iSc = iLength/nPts

If i=0 Then

S=0

Else

S = iSc*i

End If

iPts(i) = Rhino.CurveArcLengthPoint(iCirc, S)

Next

Dim oCirc, oLength, oPts

ReDim oPts(nPts)

cp(0)(2) = Floor(rnd*10)

oCirc = Rhino.AddCircle (cp,R)

If Rhino.IsCurve(oCirc) Then

oLength = Rhino.CurveLength(oCirc)

End If

Dim outS, oSc

For i = 0 To (nPts-1)

oSc = oLength/nPts

If i=0 Then

outS=0

Else

outS = oSc*i

End If

oPts(i) = Rhino.CurveArcLengthPoint(oCirc, outS)

Next

'Dim apxH : apxH = Rhino.GetReal("height of apex guide curvature points", 6)

Dim apxH : apxH = Floor(rnd*20)

Dim Origin, Direction, Normal, hPlane

Origin = array(0,0,apxH)

If IsArray(Origin) Then

Direction = array(0,0,apxH+1)

If IsArray(Direction) Then

Normal = VectorCreate(Direction, Origin)

Normal = VectorUnitize(Normal)

hPlane = Rhino.PlaneFromNormal(Origin, Normal)

End If

End If

'Dim apxR : apxR = Rhino.GetReal("distance of apex point from base", 5)

Dim apxR : apxR = Floor(rnd*20)

If apxR < 1 Then

apxR = 1

End If

Dim hCirc, hLength, hPts

ReDim hPts(nPts-1)

hCirc = Rhino.AddCircle (hPlane,apxR)

If Rhino.IsCurve(hCirc) Then

hLength = Rhino.CurveLength(hCirc)

End If

Dim hS, hSc

For i = 0 To (nPts-1)

hSc = hLength/nPts

If i=0 Then

hS=hSc/2

Else

hS = (hSc/2)+(hSc*i)

End If

hPts(i) = Rhino.CurveArcLengthPoint(hCirc, hS)

Next

Dim wo : wo = array (0,0,(apxH/2))

Dim crvInnerPTS, crvOutterPTS, crvInnerPTSstring, crvOutterPTSstring

ReDim crvOutterPTS(nPts-1), crvInnerPTS(nPts-1), crvInnerPTSstring(nPts-1), crvOutterPTSstring(nPts-1)

For i = 0 To (nPts-1)

crvOutterPTS(i) = array(wo, hPts(i), oPts(i))

crvOutterPTSstring(i) = Rhino.AddCurve (crvOutterPTS(i))

Next

For i = 0 To (nPts-1)

If i = 0 Then

crvInnerPTS(i) = array(wo, hPts(nPts-2), iPts(i))

Else

If i = 1 Then

crvInnerPTS(i) = array(wo, hPts(nPts-1), iPts(i))

Else

crvInnerPTS(i) = array(wo, hPts(i-2), iPts(i))

End If

End If

crvInnerPTSstring(i) = Rhino.AddCurve (crvInnerPTS(i))

Next

Dim capCurve, capCurveString

ReDim capCurve(nPts-1), capCurveString(nPts-1)

For i = 0 To (nPts-1)

If i = (nPts-1) Then

capCurve(i) = array(oPts(i), hPts(i), iPts(1))

Else

If i = (nPts-2) Then

capCurve(i) = array(oPts(i), hPts(i), iPts(0))

Else

capCurve(i) = array(oPts(i),hPts(i), iPts(i+2))

End If

End If

capCurveString(i) = Rhino.AddCurve (capCurve(i))

Next

Dim LoftA, rr, LoftB, SurfA, rrr

ReDim LoftA(nPts-1), LoftB(nPts-1), SurfA(nPts-1)

For rr = 0 To nPts-1

If rr = nPts-2 Then

rrr = 0

Else

If rr = nPts-1 Then

rrr = 1

Else

rrr = rr + 2

End If

End If

LoftA(rr) = Array(crvOutterPTSstring(rr), crvInnerPTSstring(rrr), capCurveString(rr))

rhino.DeleteObject iCirc

rhino.DeleteObject oCirc

rhino.DeleteObject hCirc

Rhino.AddEdgeSrf LoftA(rr)

Next

End Sub