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 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