algorithmic modeling for Rhino
Is it possible with Kangaroo to optimize a certain topology onto a surface, so it has only a few specified edgelengths?
The goal would be to not have transition between the edgelengths, but approximate a few specified values as much as possible.
I have been trying using springs and applying multiple values to Rest length, but no luck so far.
Any ideas how I could achieve this?
Thanks in advance!
I also would have guessed to work with the rest length. In my opinion, you have to chose one restlength for each spring and also assign a high stiffness. That means, the springs realy try to achieve this length.
It would help a lot if you could show a few images, of what you have, and what the result should look like.
Dear Torben O,
Thank you very much for your response.
The geometry is any kind of freeform surface subdivided to triangles (just like a geosphere). What it should look like is not certain, my goal is to minimize the number of edgelenghts, and see how the topology is affected, and how the mesh differs from the original surface.
Your method seems to be working great. I didn't realize I can group the edges by making different lists, and apply different spring forces to them. So thank you for the idea!
I was also thinking solving it either someway like this. Or my other idea is was, if it would be possible not to apply the edgelenghts manually, but to automate this. I can of course play with varying the groups or the lenghts, but it would result in a nicer topology, if the edgelenghts would be optimized for example by the pull of the surface. So for the particular edges the length would be calculated. I could also say, the edge would "snap" to the optimal value of the specified ones.
Do you think this might be possible to achieve?
I don't know if I totally understood what you want, but I suggest that you look into the "equalize"-force.
This is made vor equalizing all edgelenths from a mesh. You can combine that with the "pull to surface" force (e.g. set on strength = 0) to make sure all your points stay on the surface.
Then you would get one edgelength and all points on your surface (if there is a possible mathematical solution)
Thank you for your answer!
In case of a surface, where the curvature is different in every point, the edgelenghts must have some transitions between them.
I could say, if the mesh has 100 edges, the optimized mesh would result maybe in 100 different edgelenths.
When I start to determine different groups and apply lenghts to them, I restrain the freedom of the transition between.
I mean, of course this would be the manual solution, but it would take forever to find a good combination, because the number of solutions could really be minimal. Especially, if the surface has restrictions, like fixed contours.
I think applying the edgelenths manually would take forever to get a solution.
But there should be a minimal number of edgelenths, by which the surface can be solved.
I'd like to create a script where I only input the edgelenghts, and the program only applies these values to the edges, so it tries to determine the optimal length of the specified ones for every edge.
I could also say, that the transition between the edgelenthts would be optimized to certain numbers.
Any suggestions would be appreciated!
I'm attaching some pictures for illustration. It shows analysis of the edgelenghts. The first one is what an optimized mesh looks like, and the second one is something what I'd like to achieve.
Now I think I know what you want. Could you also upload the gh-definition, so I have something to work with? That would be very helpful.
I upload my definition, but it's a bit more primitive to what Daniel just uploaded.
The main difference is that I apply the sets of groups and the lenghts manually, which is definitely not the way of finding a solution. :/
I don't really have a method of how to choose the groups. Daniel's script averages the original mesh's edgelenghts which is definitely better than my solution.
An iterative method would be a good way to go. I think the solution would be an optimization algorghythm, which does somehow recreate the groups, and the goal lenghts after every step.
It's a very interesting question, and a difficult one to solve well.
Here's a starting point - which sorts and divides the initial edge lengths into a number of groups, then makes each edge a spring with its rest length the average of its group.
The bar graph component shows how the edge lengths go from 460 different values to 10 clusters of near identical lengths:
When the mesh is triangulated, all the edge lengths affect each other, and prescribing the edge lengths exactly is not always possible.
The simple approach presented here is just a start though - there are other more complex strategies that could give closer approximations.
For instance, instead of just sorting, dividing and averaging the edge lengths once at the start, you can do this iteratively to find the best set of edge lengths to minimize the error.
Here's a presentation of one approach to this:
I've been thinking for a while about trying to implement something closer to that - maybe it is possible even with just Grasshopper components and Hoopsnake for iteration...
and if such a tile clustering tool needs an animal name - I think it would have to be the ClusterDuck ;)
Thank you for your script, this is something I was looking for!
Although I will definitely have to work on a method with the iterations.
The key is definitely an automatized method how we group the edges and what lenght do we apply to them.
This is a good starting point though, thank you!
The next level of clustering is, of course, surface paneling (after a structural member offset). Grouping surface panels types can get even more complicated when you allow joint widths to vary.
Oh yeah, Daniel, this is exactly the same presentation you linked to but it includes presentation notes. Not sure if you've seen this version.
Here's the actual paper
Haha, link is slow or not working, but I'm 90% sure I've got that paper too!