Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problem instantiating a LineAgent object in Python mode #28

Open
co-ord opened this issue May 6, 2021 · 0 comments
Open

Problem instantiating a LineAgent object in Python mode #28

co-ord opened this issue May 6, 2021 · 0 comments

Comments

@co-ord
Copy link

co-ord commented May 6, 2021

Dear @sghr,

Folks on the Processing forum (me included) have a hard time figuring out how to port your sketch on Particle-based Branching with Spring Force to Python.

It seems you are putting an instruction as an argument inside of super() when initializating the LineAgent constructor:

super(parent.pos().cp(dir)) on line 7 of the snippet below

class LineAgent extends IParticle{ 
  LineAgent parent;
  boolean isColliding;
  IVec dir;
    
  LineAgent(IParticle parent, IVec dir){
    super(parent.pos().cp(dir));  // <-- here !
    if(parent instanceof LineAgent){
      this.parent = (LineAgent)parent;
    }
    isColliding=false;
    hide(); // hide point
    this.dir = dir;
    fric(0.2);
  }

How would that translate in Python mode ?

--Failed attempt--

class LineAgent(IParticle):
    def __init__(self, parent, dir):
        super(LineAgent, self).__init__(parent, dir) #or IParticle.__init__(self, parent, dir)
        
        #parent.pos().cp(dir) #<-- WHERE should this go ?
        
        if isinstance(parent, LineAgent):
            self.parent = parent
        
        self.isColliding = False
        self.dir = dir
        self.hide()
        self.fric(0.2)

No matter what we try, we always end-up with an annoying 'instancemethod' object has no attribute 'pos' error.

-- Full sketch --

add_library('igeo')

def setup():
    size(480, 360, IG.GL)
    IG.bg(1.0)
    IG.top()

    for i in xrange(4):
        LineAgent(IParticle(IRand.pt(-40,-40,0,40,40,0)).hide().fric(0.2), IRand.dir(IG.zaxis).len(2))
    
    for i in xrange(20):
        IAttractor(IRand.pt(-200,-200,0,200,200,0)).linear(50).intensity(-30)

        
        
class LineAgent(IParticle):
    def __init__(self, parent, dir):
        super(LineAgent, self).__init__(parent, dir) 
        
        #parent.pos = parent.pos().cp(dir) #<-- WHERE should this go ?
        
        if isinstance(parent, LineAgent):
            self.parent = parent

        self.isColliding = False
        self.dir = dir
        self.hide()
        self.fric(0.2)

    
    def interact(self, agents):
        if self.time() == 0:
            for agent in agents:
                if isinstance(agent, LineAgent) and agent != self:
                        
                    # ERROR below --> attributeError: 'instancemethod' object has no attribute 'pos'
                    # more specifically: 'self.parent' has no attribute 'pos'
                    
                    if agent.parent != None and agent.pos().dist(self.pos()) < self.pos().dist(self.parent.pos())*2:
                        intxn = IVec.intersectSegment(agent.parent.pos(), agent.pos(), self.parent.pos(), self.pos())
                        if intxn != None and not intxn.eq(self.parent.pos()) and not agent.isColliding:
                            self.isColliding = True
                            return
 
                            
    def update(self):
        if self.isColliding:
            self.del()
        else:
            if self.time() == 0 and self.alive():
                if self.parent != None and self.parent.alive():
                    ln = ISpringLine(self, self.parent, 100)
                    t = -cos(IG.time()*.015) * .5 + .5
                    ln.hsb(.7 - t*.2, 1, .8 - t*.2, .5)
                    if self.parent.parent != None and self.parent.parent.alive():
                        st = IStraightenerCurve(self, self.parent, self.parent.parent).tension(100)
                        st.hsb(.7 - t*.2, 1, .8 - t*.2, .5)
            
            if self.time() == 4:
                dir2 = self.dir.cp()
                angle = PI*.12
                if IRand.pct(50):
                    self.dir.rot(angle)
                    dir2.rot(-angle)
                else:
                    self.dir.rot(-angle)
                    dir2.rot(angle)
                    
                LineAgent(self, self.dir)
                if IRand.pct(20):
                    LineAgent(self, dir2)
                    
                l = LineAgent(self, dir2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant