Showing posts with label for loop. Show all posts
Showing posts with label for loop. Show all posts

Monday, 7 April 2025

getting areas of pieces and removing them. Eg object is being divided somehow.

 


Say you want to blast the large lower shape to just get the caps, but this shape is evolving and moving (and therefore the parts you want to delete are changing in size & number/point count etc!)....
You gotta measure the area of each "connected" piece, then kill them based on a threshold. It's easy when you say that, but actually there's a bit of other stuff involved.
   

This is the rough setup.
So make a For Each block & set it to Primitives. Do a Measure - select Area. This only gives us the area per FACE. We want the whole piece's area. Sooo, we promote it to Detail level & use the SUM promotion method. ie - it adds all the area attribs on a piece together. 


Once this has been done I promote the attribute back to Point level (using average as the promotion method).

Outside of the loop we can write a little wrangle to delete the pieces based on area-

Just a simple removepoint expression. I use a float channel slider so that the value can be tuned for the animation. it might not be necessary for you.

Shoutout to Felix for helping out with the attribute promoting bits!








Friday, 29 September 2017

connecting points again..


Here're two expanded ways of connecting groups of points together!




The first method relies on you creating an attribute in a preceding point wrangle called "id". This is the value you'll search for, when making connections. The "destination" points go into the first input, the origin points go into the second.

int count = findattribvalcount(1,"point","id",i@id);

for (int i = 0; i < count; i++) {
    int find = findattribval(1,"point","id",i@id,i);
    
    int prim = addprim(0,"polyline");
    
    vector p2 = point(1,"P",find);
    
    int pt = addpoint(0,@ptnum);
    setpointattrib(0,"P",pt,p2);
    
    addvertex(0,prim,@ptnum);
    addvertex(0,prim,pt);
}


LINE BY LINE

int count = findattribvalcount(1,"point","id",i@id);
//count number of points that have the "id" value
for (int i = 0; i < count; i++) {
//start for loop, for the number of points it has found
    int find = findattribval(1,"point","id",i@id,i);
    //get point number for point that has the id value. The last i is the index of the for loop.
    int prim = addprim(0,"polyline");
    //add primitive, of polyline type
    vector p2 = point(1,"P",find);
   //create position vector based on point number found 
    int pt = addpoint(0,@ptnum);
//create point at the position of current point
    setpointattrib(0,"P",pt,p2);
    //set position of just created point to the vector created
    addvertex(0,prim,@ptnum);
//add vertex to the primitive at current point position
    addvertex(0,prim,pt);
//add vertex to the primitive at found point position
}





This method doesn't need the "id" value, but just grabs the closest point to it. Again the many destinations go into the first input and the few "origins" go to the second.

int nearpt = nearpoint(1,@P);
int prim = addprim(0,"polyline");
vector p2 = point(1,"P",nearpt);
int pt = addpoint(0,@ptnum);
setpointattrib(0,"P",pt,p2);
addvertex(0,prim,@ptnum);
addvertex(0,prim,pt);


LINE BY LINE

int nearpt = nearpoint(1,@P);
//get id number of point from second input to currently processed point's position
int prim = addprim(0,"polyline");
//create primitive of polyline type
vector p2 = point(1,"P",nearpt);
//set vector to nearpt's position
int pt = addpoint(0,@ptnum);
//add point at currently processed point's position
setpointattrib(0,"P",pt,p2);
//set position of new point to position of nearpt.
addvertex(0,prim,@ptnum);
//add vertex at currently processed point's position
addvertex(0,prim,pt);
//add vertex at nearpt's position