Random header image at NeoArchaic Design

Bezier Constructor

March 6th, 2010  |  Published in Resources, Scripted Tools

    


This rhinoscript takes a series of points selected in sequence and creates a bezier curve using the geomtetric method of construction. Rendering both the final bezier curve as well as the construction lines used to produce this curve. These curves produce a beautiful spatial fabric in visualizing the geometric structure beneath. A more detailed/ animated reference of this method of contruction can be found at Wikipedia


platform: Rhino Script
function: Modeling Aid

 


Option Explicit
'Script written by <David Mans>
'Script copyrighted by <Neoarchaic Design>
'Script version Tuesday, July 21, 2009 7:50:34 PM

Call Main()
Sub Main()
	Dim arrPoints,intSamples
	Do
		arrPoints = Rhino.GetObjects("Select at Least 3 Points",1,,True)
		If isNull(arrPoints) Then Exit Sub

		If uBound(arrPoints) > 1 Then
			Exit Do
		End If
	Loop
	intSamples = Rhino.GetReal("Samples",10,1)
	If isNull(intSamples) Then Exit Sub

	Dim i, arrPts(),arrOutput
	ReDim arrPts(uBound(arrPoints))
	For i = 0 To uBound(arrPoints) Step 1
		arrPts(i) = Rhino.PointCoordinates(arrPoints(i))
	Next

	Call Rhino.EnableRedraw(False)
	arrOutput = bezierConstructor(arrPts,intSamples)
	Call Rhino.AddInterpCurve(arrOutput(0))
	Call Rhino.ObjectColor(arrOutput(1),RGB(255,0,0))
	Call Rhino.EnableRedraw(True)

End Sub
Function bezierConstructor(arrPts,intSamples)
	bezierConstructor = Null
	Dim i, j, k, r, s, t
	Dim arrOutput(), arrOutputs(), arrStore, arrTemp, arrLines(),arrSet()
	r = 0
	k=1
	ReDim arrOutput(0),arrOutputs(0)
	arrOutput(0) = arrPts(0)

	For i = 1 To uBound(arrPts) Step 1
		ReDim Preserve arrLines(r),arrOutputs(r)
		arrLines(r) = Rhino.AddLine(arrPts(i-1),arrPts(i))
		arrOutputs(r) = arrLines(r)
		r=r+1
	Next
	t=r
	arrStore = arrLines
	For i = 1 To intSamples-1 Step 1
		r=0
		s=0
		arrTemp = arrStore
		Do
			If r = 1 Then
				ReDim Preserve arrOutput(k)
				arrOutput(k) = curveParameter(arrTemp(0),i*(1/intSamples))
				k=k+1
				Exit Do
			End If
			r=0
			ReDim Preserve arrSet(s)
			arrSet(s) = arrTemp
			ReDim arrLines(0)
			For j = 1 To ubound(arrSet(s)) Step 1
				ReDim Preserve arrLines(r), arrOutputs(t)
				arrLines(r) = Rhino.AddLine(curveParameter(arrSet(s)(j-1),i*(1/intSamples)),curveParameter(arrSet(s)(j),i*(1/intSamples)))
				arrOutputs(t) = arrLines(r)
				t=t+1
				r=r+1
			Next
			arrTemp = arrLines
			s=s+1
		Loop
	Next
	ReDim Preserve arrOutput(k)
	arrOutput(k) = arrPts(uBound(arrPts))
	bezierConstructor = array(arrOutput,arrOutputs)
End Function
Function curveParameter(strCurve,dblParameter)
	curveParameter = Null
	Dim cDom,arrPoint
	cDom = Rhino.CurveDomain(strCurve)
	arrPoint = Rhino.EvaluateCurve(strCurve,cDom(0)+dblParameter*(cDom(1)-cDom(0)))
	curveParameter = arrPoint
End Function

Leave a Response


NeoArchaic Design

principle: David Mans
e: david@neoarchaic.net

Prototypes

Associates


NeoArchaic Network

NeoArchaic Gallery

untitled Brooklyn Bridge Tokyo Metropolitan Government Simple Moment detail Yokohama Ferry Terminal_13 Garden_01 Gifu Convention Center_06 Tokyo Disney Concert Hall Fasade Botanical Garden Gifu Convention Center_03
View more photos >

Wordpress Code Snippet by Allan Collins