top of page

Randomizer

Writer's picture: David MansDavid Mans

💻 Rhino 5

🔼 Rhino Script

🛠️ Visual Basic

 

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.

 
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
 


4 views

Recent Posts

See All
bottom of page