# 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 with a 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 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
End If
Call Rhino.EnableRedraw(False)
For i = 0 To uBound(arrObjects) Step 1
If strType = "Object" Then
Else
arrObjects(i) = Rhino.PointCoordinates(arrObjects(i))
End If
Else
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
Call Rhino.EnableRedraw(False)
For i = 0 To uBound(arrObjects) Step 1
If strMethod = "Volume" Then
ElseIf strMethod = "Shell" Then
Else
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
Call Rhino.EnableRedraw(False)
For i = 0 To uBound(arrObjects) Step 1
Call reparameterize(arrObjects(i))
Next
Call Rhino.EnableRedraw(True)
Exit Sub

ElseIf strType = "Surface" Then
arrObjects = Rhino.GetObjects("Select Surfaces", 8,, True)
If isNull(arrObjects) Then Exit Sub
Call Rhino.EnableRedraw(False)
For i = 0 To uBound(arrObjects) Step 1
Call reparameterize(arrObjects(i))
Next
Call Rhino.EnableRedraw(True)
Exit Sub
End If

End Sub
Dim i, dblRandom(1), arrOutput()
ReDim arrOutput(intCount-1)

For i = 0 To intCount - 1 Step 1
dblRandom(0) = random(0, 2 * PI)
arrOutput(i) = array(arrOrigin(0) + dblRandom(1) * sin(dblRandom(0)), arrOrigin(1) + dblRandom(1) * cos(dblRandom(0)), arrOrigin(2))
Next
End Function
randomPointCircle = Null
Dim i, arrOutput()
ReDim arrOutput(intCount-1)

For i = 0 To intCount - 1 Step 1
Do

If Rhino.Distance(arrOrigin, arrOutput(i)) < dblRadius Then Exit Do
Loop
Next
randomPointCircle = arrOutput
End Function
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
randomPointSphere = Null
Dim i, arrOutput()
ReDim arrOutput(intCount-1)

For i = 0 To intCount - 1 Step 1
Do
If Rhino.Distance(arrOrigin, arrOutput(i)) < dblRadius Then Exit Do
Loop
Next
randomPointSphere = arrOutput
End Function
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)
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```