Recursive function in MAX ?
Hi, I'm trying to translate this Processing code in Max but I can't understand how create recursive function in Max.
I tried to create an abstract that call itself but I got a Max error "That is not permitted".
Can someone show me the right way?
Do I have to use jit.linden ?
Thanks
Processing code to translate:
float theta;
void setup() {
size(640, 360);
}
void draw() {
background(0);
frameRate(30);
stroke(255);
// Let's pick an angle 0 to 90 degrees based on the mouse position
float a = (mouseX / (float) width) * 90f;
// Convert it to radians
theta = radians(a);
// Start the tree from the bottom of the screen
translate(width/2,height);
// Draw a line 120 pixels
line(0,0,0,-120);
// Move to the end of that line
translate(0,-120);
// Start the recursive branching!
branch(120);
}
void branch(float h) {
// Each branch will be 2/3rds the size of the previous one
h *= 0.66;
// All recursive functions must have an exit condition!!!!
// Here, ours is when the length of the branch is 2 pixels or less
if (h > 2) {
pushMatrix(); // Save the current state of transformation (i.e. where are we now)
rotate(theta); // Rotate by theta
line(0, 0, 0, -h); // Draw the branch
translate(0, -h); // Move to the end of the branch
branch(h); // Ok, now call myself to draw two new branches!!
popMatrix(); // Whenever we get back here, we "pop" in order to restore the previous matrix state
// Repeat the same thing, only branch off to the "left" this time!
pushMatrix();
rotate(-theta);
line(0, 0, 0, -h);
translate(0, -h);
branch(h);
popMatrix();
}
}
I try to simplify the question:
this is the recursive function I'm tryig to translate in Max, the problem is the recursion.
void branch(float h) {
h *= 0.66;
if (h > 2) {
pushMatrix();
rotate(theta);
line(0, 0, 0, -h);
translate(0, -h);
branch(h);//////////////////////HERE!!!!
popMatrix();
pushMatrix();
rotate(-theta);
line(0, 0, 0, -h);
translate(0, -h);
branch(h);//////////////////////HERE!!!!
popMatrix();
}
You can see that inside branch() there are two call to itself branch().
I dont think max really lends itself to recursive structures, but I think there is a principle in computer science which says that any recursive function can also be expressed as a simple iteration (ie a for-loop), so you could possible rewrite the function non-recursively (in pseudocode), then it would be easier to translate into a max patch.
You might be able to implement it using recursion with Mattijs Kneppers' oo objects https://cycling74.com/tools/kneppers-oo-objects/
but having never used them myself, you'd need to check it out to see if it's actually possible.
you're may better off overall trying to implement it using java within max
hth
A recursive function can be expressed as a simple iteration only if the recursive call is the last operation of the function ("tail recursion"). Otherwise you need an additional stack for handling the local data. This can be done in Max for example with [zl stack] but seems rather limited and inconvenient.
This can be very easy to do using java inside Mxj. Just learn a bit of the java API for interfacing with max and then you can do as many resursions you want !!
And obligatory Lisp joke:
I love it!
one way to do a "while" loop. interesting to experiment with [defer] and [deferlow] too...
Thanks to all maybe mxj or js is the faster way for tree generation.
actually you can do this kind of recursion with native max objects/messaging.
The only difference to the processing code is, that you have to carry over all 4 parameters (x,y,h,theta) to the next recursion.
awesome.