I am trying to achieve a Gilbert Tessellation as an exercise. The idea is simple, lines from random points extend both sides in random directions, until they intersect.
So, the intention is to create a loop that extends each line by a factor, and constantly checks for intersections. The catch is that there is a loop for each line… when the intersection is true for one line, that line stops extending while the others continue.
I am stuck… how can this simple algorithm be achieved?
This is my code so far.
import rhinoscriptsyntax as rs
import ghpythonlib.components as gh
while bool == False:
bool = gh.CollisionManyXMany(curves)[0]
extended_curves = rs.ExtendCurveLength(curves, 0, 2, ext)
if bool == True:
break
a = extended_curves
For some reason the error reads:
Runtime error (UnboundNameException): name ‘extended_curves’ is not defined
Traceback:
line 11, in script
Which is utterly useless, it tells me the variable “extended_curves” is not defined. It surely has to do with something regarding global and local variables, and the fact that the variable is being defined inside a loop… but how the f*** can I define extended_curves without extending them??
Oh I know: extended_curves = extended_curves. Pff easy.
The catch here is that bool != False
‘bool’ is a builtin python type and as such is testable for False and it’s not falsy so the loop never runs leaving you with an undefined variable ‘extended_curves’
So to fix the code you could:
import rhinoscriptsyntax as rs
import ghpythonlib.components as gh
collided = False
while collided == False:
collided = gh.CollisionManyXMany(curves)[0]
extended_curves = rs.ExtendCurveLength(curves, 0, 2, ext)
if collided == True:
break
a = extended_curves
import rhinoscriptsyntax as rs
import ghpythonlib.components as gh
import Rhino
Nmax = 1000 #prevent endless loop by setting max loops
N = 0
collide = False
while collide == False:
N+=1
if N >= Nmax: break #max loops reached
#printing for debug purposes to find the type returned
#print type(gh.CollisionManyXMany(curves))
#print gh.CollisionManyXMany(curves)
#print gh.CollisionManyXMany(curves).collision
#gh.CollisionManyXMany returns a named tuple we need the property collision or index [0] like previously
#that is a list of booleans for witch we wat all to be True
collide = all( gh.CollisionManyXMany(curves).collision )
if collide == True:
break
extended_curves = []
for curve in curves :
extended_curves.append(curve.Extend(Rhino.Geometry.CurveEnd.Both,ext,Rhino.Geometry.CurveExtensionStyle.Line))
#print curve.GetLength()
curves = extended_curves
print N
a = curves
import rhinoscriptsyntax as rs
import ghpythonlib.components as gh
import Rhino
Nmax = 1000 #prevent endless loop by setting max loops
N = 0
while N < Nmax:
N+=1
if all( gh.CollisionManyXMany(curves).collision ) : break
curves = [curve.Extend(Rhino.Geometry.CurveEnd.Both,ext,Rhino.Geometry.CurveExtensionStyle.Line) for curve in curves]
print N
a = curves
Using gh.ExtendCurve:
import rhinoscriptsyntax as rs
import ghpythonlib.components as gh
Nmax = 1000 #prevent endless loop by setting max loops
N = 0
while N < Nmax:
N+=1
if all( gh.CollisionManyXMany(curves).collision ) : break
curves = [gh.ExtendCurve(curve,0,ext,ext) for curve in curves]
print N
a = curves
Hi Willem, thank you for your time and the detailed post!
I will need to implement some tweaking to make it an actual Gilbert Tessellation, for example, if one end of the line stops extending due to an intersection, the other end can still keep on extending, hopefully I can take it from here.
Edit: I think you made it so that it only stops extending when all booleans == True.
That should no be the case, each curve should be independent.
Anyways I just realized there is a collision situation, where a curve intersects another one, instead of both stopping in the intersection point, one must stop and the other continue. Which one? I do not know, but this seems to be a lot more complex, oh well.