![]() | (back to the list of tutorials) |
The first code below shows an algorithm to import curves from an external file and to create particles at divided points on each curve. Then each pair of particles in an array is connected again with tension lines.
The input file used in the code is tension_lines1.3dm.
add_library('igeo') size(480, 360, IG.GL) IG.bg(0) IG.open("tension_lines1.3dm") curves = IG.curves() division=30 inc = 1.0/division for crv in curves : pts = [] for j in range(division+1) : # creating particles pts.append(IParticle( crv.pt( j*inc ) ).fric(0.01)) pts[0].fix() # fixing the start point pts[division].fix() # fixing the end point for j in range(division) : # connecting particles ITensionLine(pts[j], pts[j+1]).tension(150).clr(1.0, 0.5).weight(2) crv.del()
The next code applies forces to the tension lines with two attractors, one with attractive force and another with repulsive force.
add_library('igeo') size(480, 360, IG.GL) IG.bg(0) IG.open("tension_lines1.3dm") curves = IG.curves() IAttractor(15, 6, 0).intensity(10).linear(30).clr(1.0,0,0).size(8) IAttractor(5, 4, 0).intensity(-30).linear(10).clr(1.0,0,0).size(8) division=30 inc = 1.0/division for crv in curves : pts = [] for j in range(division+1) : # creating particles pts.append(IParticle( crv.pt( j*inc ) ).fric(0.01)) pts[0].fix() # fixing the start point pts[division].fix() # fixing the end point for j in range(division) : # connecting particles ITensionLine(pts[j], pts[j+1]).tension(150).clr(1.0, 0.5).weight(2) crv.del()
This third code creates instances of swarm agent IBoid class, instead of particle instances. Because of forces between swarm, each node of tension strings attracts each other trying to form clusters but the tension still pulls them apart in certain directions.
add_library('igeo') size(480, 360, IG.GL) IG.bg(0) IG.open("tension_lines1.3dm") curves = IG.curves() division=30 inc = 1.0/division for crv in curves : pts = [] for j in range(division+1) : # creating particles pts.append(IBoid( crv.pt( j*inc ) ).fric(0.01)) pts[j].cohesionDist(1) pts[j].cohesionRatio(10) pts[j].separationRatio(0) pts[j].alignmentRatio(0) pts[0].fix() # fixing the start point pts[division].fix() # fixing the end point for j in range(division) : # connecting particles ITensionLine(pts[j], pts[j+1]).tension(150).clr(1.0, 0.5).weight(2) crv.del()
The next example only changes the input file. When you have random intersecting lines, swarm forces to cluster together are clear. The final lines are result of the balance between gathering swarm forces and smoothing tension forces. The code below also hides points by hide() method.
The input file used in the next code is tension_lines2.3dm.
add_library('igeo') size(480, 360, IG.GL) IG.bg(0) IG.open("tension_lines2.3dm") curves = IG.curves() division=50 inc = 1.0/division for crv in curves : pts = [] for j in range(division+1) : # creating particles pts.append(IBoid( crv.pt( j*inc ) ).fric(0.01)) pts[j].cohesionDist(0.5) pts[j].cohesionRatio(50) pts[j].separationRatio(0) pts[j].alignmentRatio(0) pts[j].hide() pts[0].fix() # fixing the start point pts[division].fix() # fixing the end point for j in range(division) : # connecting particles ITensionLine(pts[j], pts[j+1]).tension(150).clr(1.0, 0.5).weight(2) crv.del()
This shows the random intersecting input lines.
This is the result when they are in equilibrium.