Simple Circle Packing Code in GhPython

Capture


import rhinoscriptsyntax as rs
import Rhino
import Rhino.Geometry as rg
import random as rnd
import scriptcontext as sc

class Agents:
def __init__(self):
    self.p = rg.Point3d(rnd.uniform(-100,100),rnd.uniform(-100,100),0)
    self.v = rs.VectorUnitize(rs.VectorCreate(targetPt,self.p))

def update(self):
    self.detect()
    self.p = self.p + self.v
    if self.p.X > 100:
        self.p.X = rnd.uniform(-100,100)
        self.p.Y = rnd.uniform(-100,100)
    elif self.p.X < -100:
        self.p.X = rnd.uniform(-100,100)
        self.p.Y = rnd.uniform(-100,100)
    elif self.p.Y > 100:
        self.p.X = rnd.uniform(-100,100)
        self.p.Y = rnd.uniform(-100,100)
    elif self.p.Y < -100:
        self.p.X = rnd.uniform(-100,100)
        self.p.Y = rnd.uniform(-100,100)

    if rs.VectorLength(self.v) > 1.5:
        self.v = rs.VectorUnitize(self.v)/2

    self.v = self.v + rs.VectorUnitize(rs.VectorCreate(targetPt,self.p))/3

def detect(self):
    for i in pts:
        if rs.Distance(i.p,self.p) > 0:
            if rs.Distance(i.p,self.p) < 20:
                self.v = self.v + rs.VectorUnitize(rs.VectorCreate(self.p,i.p))

    if reset:
        setup()

def setup():
    global pts
    global targetPt
    pts = []
    targetPt = rg.Point3d(0,0,0)
    numOfPts = 30
    for i in range(numOfPts):
        pts.append(Agents())

    glbCenterPts = []
    glbPtsVelocity = []

    for pt in pts:
        pt.update()
        glbCenterPts.append(pt.p)
        glbPtsVelocity.append(pt.v)

    a = glbCenterPts
    b = glbPtsVelocity