Randomizer

Randomizer is a culmination of a series of tools that I have used in the past to generate a random set of test points.  This Rhino Script presents the user witha series of options to create random point clusters in different geometric volumes as well as surface or curve parameters.  Random points can be made in circular, spherical, cubical configurations with varying dimensions.

Rhino Script

Option Explicit
'Script written by <David Mans>
'Script copyrighted by <NeoArchaic Studio>
'Script version Friday, October 02, 2009 12:22:08 AM

Call Main()
Sub Main()
	Dim i, j, arrObjects, strType, strMethod, intCount, dblRadius, dblDim(2), arrCircles(), arrPoints()
	
	intCount = Rhino.GetInteger("Total Number of Points", 100, 1)
	If isNull(intCount) Then Exit Sub
	
	strType = Rhino.GetString("Select Geometry Type", "Circle", array("Circle", "Sphere", "Cube", "Curve", "Surface"))
	If isNull(strType) Then Exit Sub
	
	If strType = "Circle" Then
		strType = Rhino.GetString("Select Circle Geometry", "Object", array("Object", "ByOrigin"))
		If isNull(strType) Then Exit Sub
		strMethod = Rhino.GetString("Select Circle Method", "Dispersed", array("Dispersed", "Radial"))
		If isNull(strMethod) Then Exit Sub
		
		If strType = "Object" Then
			arrObjects = Rhino.GetObjects("Select Circles", 4,, True)
			If isNull(arrObjects) Then Exit Sub
			j = 0
			
			For i = 0 To uBound(arrObjects) Step 1
				If Rhino.IsCircle(arrObjects(i)) Then 
					ReDim Preserve arrCircles(j), arrPoints(j)
					arrCircles(j) = arrObjects(i)
					arrPoints(j) = Rhino.CircleCenterPoint(arrCircles(j))
					j = j + 1
				End If
			Next
			arrObjects = arrPoints
		Else
			arrObjects = Rhino.GetObjects("Select Origin Points", 1,, True)
			If isNull(arrObjects) Then Exit Sub
			dblRadius = Rhino.GetReal("Radius", 1)
			If isNull(dblRadius) Then Exit Sub
		End If
		Call Rhino.EnableRedraw(False)
		For i = 0 To uBound(arrObjects) Step 1
			If strType = "Object" Then
				dblRadius = Rhino.CircleRadius(arrCircles(i))
			Else
				arrObjects(i) = Rhino.PointCoordinates(arrObjects(i))
			End If
			If strMethod = "Radial" Then
				Call Rhino.AddPointCloud(randomPointCircleRadial(arrObjects(i), dblRadius, intCount))
			Else
				Call Rhino.AddPointCloud(randomPointCircle(arrObjects(i), dblRadius, intCount))
			End If
		Next
		Call Rhino.EnableRedraw(True)
		Exit Sub
		
	ElseIf strType = "Sphere" Then
		strMethod = Rhino.GetString("Select Sphere Method", "Volume", array("Volume", "Radial", "Shell"))
		If isNull(strMethod) Then Exit Sub
		arrObjects = Rhino.GetObjects("Select Origin Points", 1,, True)
		If isNull(arrObjects) Then Exit Sub
		dblRadius = Rhino.GetReal("Radius", 1)
		If isNull(dblRadius) Then Exit Sub
		Call Rhino.EnableRedraw(False)
		For i = 0 To uBound(arrObjects) Step 1
			If strMethod = "Volume" Then
				Call Rhino.AddPointCloud(randomPointSphere(Rhino.PointCoordinates(arrObjects(i)), dblRadius, intCount))
			ElseIf strMethod = "Shell" Then
				Call Rhino.AddPointCloud(randomPointSphereShell(Rhino.PointCoordinates(arrObjects(i)), dblRadius, intCount))
			Else
				Call Rhino.AddPointCloud(randomPointSphereVol(Rhino.PointCoordinates(arrObjects(i)), dblRadius, intCount))
			End If
		Next		
		Call Rhino.EnableRedraw(True)
		Exit Sub
		
	ElseIf strType = "Cube" Then
		strMethod = Rhino.GetString("Select Cube Method", "Volume", array("Volume", "Shell"))
		If isNull(strMethod) Then Exit Sub
		arrObjects = Rhino.GetObjects("Select Origin Points", 1,, True)
		If isNull(arrObjects) Then Exit Sub
		dblDim(0) = Rhino.GetReal("Length", 1)
		dblDim(1) = Rhino.GetReal("Width", 1)
		dblDim(2) = Rhino.GetReal("Height", 1)
		Call Rhino.EnableRedraw(False)
		For i = 0 To uBound(arrObjects) Step 1
			If strMethod = "Volume" Then
				Call Rhino.AddPointCloud(randomPointCubeVol(Rhino.PointCoordinates(arrObjects(i)), dblDim(0), dblDim(1), dblDim(2), intCount))
			Else
				Call Rhino.AddPointCloud(randomPointCube(Rhino.PointCoordinates(arrObjects(i)), dblDim(0), dblDim(1), dblDim(2), intCount))
			End If
		Next
		Call Rhino.EnableRedraw(True)
		Exit Sub
		
	ElseIf strType = "Curve" Then
		arrObjects = Rhino.GetObjects("Select Curves", 4,, True)
		If isNull(arrObjects) Then Exit Sub
		dblRadius = Rhino.GetReal("Maximum Deviation", 1)
		If isNull(dblRadius) Then Exit Sub
		Call Rhino.EnableRedraw(False)
		For i = 0 To uBound(arrObjects) Step 1
			Call reparameterize(arrObjects(i))
			Call Rhino.AddPointCloud(randomPtsCrv(arrObjects(i), dblRadius, intCount))
		Next
		Call Rhino.EnableRedraw(True)
		Exit Sub
		
	ElseIf strType = "Surface" Then
		arrObjects = Rhino.GetObjects("Select Surfaces", 8,, True)
		If isNull(arrObjects) Then Exit Sub
		dblRadius = Rhino.GetReal("Maximum Deviation", 1)
		If isNull(dblRadius) Then Exit Sub
		Call Rhino.EnableRedraw(False)
		For i = 0 To uBound(arrObjects) Step 1
			Call reparameterize(arrObjects(i))
			Call Rhino.AddPointCloud(randomPtsSrf(arrObjects(i), dblRadius, intCount))
		Next
		Call Rhino.EnableRedraw(True)
		Exit Sub
	End If
		
End Sub
Function randomPointCircleRadial(arrOrigin, dblRadius, intCount)
	randomPointCircleRadial = Null
	Dim i, dblRandom(1), arrOutput()
	ReDim arrOutput(intCount-1)
	
	For i = 0 To intCount - 1 Step 1
		dblRandom(0) = random(0, 2 * PI)
		dblRandom(1) = random(0, dblRadius)
		arrOutput(i) = array(arrOrigin(0) + dblRandom(1) * sin(dblRandom(0)), arrOrigin(1) + dblRandom(1) * cos(dblRandom(0)), arrOrigin(2))
	Next
	randomPointCircleRadial = arrOutput
End Function
Function randomPointCircle(arrOrigin, dblRadius, intCount)
	randomPointCircle = Null
	Dim i, arrOutput()
	ReDim arrOutput(intCount-1)
	
	For i = 0 To intCount - 1 Step 1
		Do
			arrOutput(i) = array(arrOrigin(0) + random(-dblRadius, dblRadius), arrOrigin(1) + random(-dblRadius, dblRadius), arrOrigin(2))
			
			If Rhino.Distance(arrOrigin, arrOutput(i)) < dblRadius Then Exit Do
		Loop
	Next
	randomPointCircle = arrOutput
End Function
Function randomPointSphereShell(arrOrigin, dblRadius, intCount)
	randomPointSphereShell = Null
	Dim i, dblRandom(1), arrOutput()
	ReDim arrOutput(intCount-1)
	
	For i = 0 To intCount - 1 Step 1
		dblRandom(0) = random(0, 2 * PI)
		dblRandom(1) = random(0, PI)
		arrOutput(i) = array(arrOrigin(0) + dblRadius * sin(dblRandom(0)) * sin(dblRandom(1)), arrOrigin(1) + dblRadius * cos(dblRandom(0)) * sin(dblRandom(1)), arrOrigin(2) + dblRadius * cos(dblRandom(1)))
	Next
	randomPointSphereShell = arrOutput
End Function
Function randomPointSphere(arrOrigin, dblRadius, intCount)
	randomPointSphere = Null
	Dim i, arrOutput()
	ReDim arrOutput(intCount-1)
	
	For i = 0 To intCount - 1 Step 1
		Do
			arrOutput(i) = array(arrOrigin(0) + random(-dblRadius, dblRadius), arrOrigin(1) + random(-dblRadius, dblRadius), arrOrigin(2) + random(-dblRadius, dblRadius))
			If Rhino.Distance(arrOrigin, arrOutput(i)) < dblRadius Then Exit Do
		Loop
	Next
	randomPointSphere = arrOutput
End Function
Function randomPointSphereVol(arrOrigin, dblRadius, intCount)
	randomPointSphereVol = Null
	Dim i, dblRandom(2), arrOutput()
	ReDim arrOutput(intCount-1)
	
	For i = 0 To intCount - 1 Step 1
		dblRandom(0) = random(0, 2 * PI)
		dblRandom(1) = random(0, PI)
		dblRandom(2) = random(0, dblRadius)
		arrOutput(i) = array(arrOrigin(0) + dblRandom(2) * sin(dblRandom(0)) * sin(dblRandom(1)), arrOrigin(1) + dblRandom(2) * cos(dblRandom(0)) * sin(dblRandom(1)), arrOrigin(2) + dblRandom(2) * cos(dblRandom(1)))
	Next
	randomPointSphereVol = arrOutput
End Function
Function randomPointCube(arrOrigin, dblLength, dblWidth, dblHeight, intCount)
	randomPointCube = Null
	Dim i, arrOutput()
	ReDim arrOutput(intCount-1)
	
	For i = 0 To intCount - 1 Step 1
		CInt(random(0, 5))
		arrOutput(i) = array(arrOrigin(0) + random(0, dblLength), arrOrigin(1) + random(0, dblLength), arrOrigin(2) + random(0, dblHeight))
	Next
	randomPointCube = arrOutput
End Function
Function randomPointCubeVol(arrOrigin, dblLength, dblWidth, dblHeight, intCount)
	randomPointCubeVol = Null
	Dim i, arrOutput()
	ReDim arrOutput(intCount-1)
	
	For i = 0 To intCount - 1 Step 1
		arrOutput(i) = array(arrOrigin(0) + random(0, dblLength), arrOrigin(1) + random(0, dblLength), arrOrigin(2) + random(0, dblHeight))
	Next
	randomPointCubeVol = arrOutput
End Function
Function randomPtsCrv(strCurve, dblDist, intCount)
	randomPtsCrv = Null
	Dim i, tDom, dblRandom, arrOutput()
	ReDim arrOutput(intCount-1)
	tDom = Rhino.CurveDomain(strCurve)
    
	For i = 0 To intCount - 1 Step 1
		dblRandom = random(tDom(0), tDom(1) - tDom(0))
		arrOutput(i) = Rhino.PointAdd(Rhino.EvaluateCurve(strCurve, dblRandom), Rhino.VectorScale(Rhino.VectorUnitize(Rhino.CurvePerpFrame(strCurve, dblRandom)(1)), random(-dblDist, dblDist)))
	Next

	randomPtsCrv = arrOutput
End Function
Function randomPtsSrf(strSurface, intDist, intCount)
	randomPtsSrf = Null
	Dim i, uDom, vDom, arrOutput()
	ReDim arrOutput(intCount-1)
	uDom = Rhino.SurfaceDomain(strSurface, 0)
	vDom = Rhino.SurfaceDomain(strSurface, 1)
    
	For i = 0 To intCount - 1 Step 1
		arrOutput(i) = Rhino.PointAdd(Rhino.EvaluateSurface(strSurface, array(random(uDom(0), uDom(1)), random(vDom(0), vDom(1)))), Rhino.VectorScale(Rhino.VectorUnitize(Rhino.SurfaceNormal(strSurface, array(random(uDom(0), uDom(1))))), random(-dblDist, dblDist)))
	Next

	randomPtsSrf = arrOutput
End Function
Function random(min, max)
	random = Null
	Dim dblValue: dblValue = min + (max - min) * rnd()
	random = dblValue
End Function
Function reparameterize(strObjectID)
	If Rhino.IsCurve(strObjectID) = True Then
		Call rhino.SelectObject(strObjectID)
		Call rhino.Command("reparameterize 0 1", False)
		Call rhino.UnselectAllObjects()
	End If
	If Rhino.IsSurface(strObjectID) = True Then
		Call rhino.SelectObject(strObjectID)
		Call rhino.Command("reparameterize 0 1 0 1", False)
		Call rhino.UnselectAllObjects()
	End If
End Function