# How can I change a cross-sectional area of a solid by a percentage?

I have a geometry of an artery that I would like to expand, increasing the cross-sectional area by exactly 240%.

Is this possible? The fatten tool allows this expansion only by a fixed dimension, not a percentage.

Hopefully, the attached picture makes it more clear.

• You can use the solution provided in your other question, but use a custom vertex group to limit the displacement to a specific area Oct 27, 2021 at 8:47
• @Gorgious, Displacement is an offset ... tricky, with topology in your link, automatically, to know the cross-sections at those points, and so set the offset as sqrt(2.4) of those .. ? Oct 27, 2021 at 8:55
• Oh right this won't work for precise displacement :) Oct 27, 2021 at 9:18
• Hi @Okra .. in order to know by how much to offset a surface point by the right amount to increase, by a percentage, the cross-sectional area it takes part in bounding, then we somehow have to know that cross-sectional area. Could you supply a sample of few branches of your vascular system on pasteall.org/blend, so we can try out some ideas? If your topology had been regular loops around the blood-vessels, then the loop-length would have provided an instant circumference... but, I think, no such luck. Is this a one-shot remodelling, which can take some time? Oct 27, 2021 at 9:44
• Hmm yes right, but this look a bit too involved for answering in a single question :) Would need to make a few assumptions first, and seeing the topology in the other Q it might cause trouble for precise calculations Oct 27, 2021 at 11:00

Here's a first shot using Geometry Nodes (Fields).

Each vertex casts a ray along its inverted normal, which hits the opposite wall of the blood vessel. the ray's length is an approximation of the vessel's diameter.

That can be used to calculate how much the vertex must be displaced along its normal, to scale the radius of the vessel at that point by the square-root of your [cross-sectional area] 's scale factor:

At the moment, in order to make this work reasonably..

• The caps are removed so they don't partake in the transform. (They could be selected out by vertex-group, instead)
• A Corrective Smooth modifier is assigned after the displacement, to dispose of wilder artefacts.

This shows the cross-sectional area of your sample being scaled by 2.4. The behaviour at branches is not too bad..

If you're interested in this route, there will probably be some adjustments that can be made to cover edge-cases, inconveniences... and of course, any suggestions for improvement are welcome.

Blender 3.0a, recent.

• What a beautiful way ... :) Oct 29, 2021 at 17:19
• @vklidu Thank you! It's the kind of thing I want to use gnodes for.. modelling modifiers. There might be too many edge-cases for this job.. depends on desired accuracy. Oct 29, 2021 at 17:51
• Hello @RobinBetts, I tried to implement your method, but I see no difference in the final model. What could I be doing wrong? Here is my file: pasteall.org/blend/33841480df154ef8ab2ee2ce8ad3aeb0
– Okra
Nov 8, 2021 at 13:43
• @Okra I think this is the only difference between my 'Dilate' GN tree an your unnamed one. (confusing, because it doesn't show in the number-field). You can always just append my 'Dilate' Node Tree to your file. Other adjustments you might need are relative to scale. Make sure the maximum Ray Length is enough to hit the other side of the vessel, and so on. Working, here. Nov 8, 2021 at 17:56
• @RobinBetts, I switched from Edit Mode to Object Mode and I can finally see the alterations! Thank you very much for all the help.
– Okra
Nov 9, 2021 at 8:32

You can try Displace modifier and offset by texture or vertex group using thickness data ... not perfect - since the way I know is calculated from face normal ray lenght. You can imagine like a distance from face to another face in direction of face orientation. In your case it will generate some "glitches" in branches conections.

You can inspect them via Mesh Analysis > Thickness ...
the dark blue color or any other edged gradients.

The same result you can get via OSL shader ... Material with OSL script can be downloaded from here. Or you can check this thread if some of the other calculations fits better to you.

Because I didn't found a way to convert this data to Vertex Weight (to be used by Displace modifier) I used just a black&white baked texture for displace.

Smart Unwrap your object, use this material, add unconnected Image Texture node with a New texture. Keep node selected and hit Bake button with just Emit pass enabled.

Now use this texture in Displace Modifier setup and adjust Strenght.

It results with thicker offset on thick parts and thinner on thin weins, but I'm unsure if it mathematicaly fits to distancing 240% ... btw what is 100% in your case?

• Nope that's alright, thanks for illustrating it :) Oct 27, 2021 at 10:58
• @Gorgious ... at the end I didnt use vertex weight ... I dont know how to generate such thing from normal ray lenght ... so I edit A to baked texture. Oct 29, 2021 at 21:44

We have a circular cross section here. The area is proportional to the square of the radius, so the radius is proportional to the square root of the area. If the area increases from 1 area to 3.4 areas (a 240% increase), then the radius should increase from 1 radius to 3.4^0.5, or about to 1.84 radii.

Note that it doesn't actually matter that the cross section is circular. Imagine that we have some arbitary cross section and then draw a circle around that arbitrary cross section. The cross section is some fixed proportion of the area of the circle. If we scale both the circle and the cross section (about any point!) then that proportion doesn't change. Doubling the size of the circle is also doubling the size of the circumscribed shape. No matter the cross section, scaling the verts defining it by x will increase the cross section by x^2.

If we have clean topology, we can select all of the circumferential loops in edge mode and simply scale about individual origins by 1.84:

If we don't have clean topology, and we have some kind of horrible point cloud, we can make a temporary mesh deformer that has decent topology and use that to scale the mesh instead:

Here, of course, we're exactly increasing the area of the mesh deformer's cross-sections, which isn't the same thing as exactly increasing the area of the deformed mesh's cross-sections. However, as we use more and more geometry on the mesh deformer to more exactly approximate the original mesh, we approach perfect agreement.

You could make a deformer out of knife cuts from your original mesh, in which case you'd have perfect agreement:

• Hello @Nathan, thank you for your reply. The geometry that I have does not have a constant cross-sectional area (nor is it always circular), so increasing it a fixed amount won't do. In addition, the length of the artery must remain constant, so I cannot scale the whole body.
– Okra
Oct 28, 2021 at 7:33
• @Okra Okay, but it doesn't mater if its circular. If you scale verts lying in a plane by x, the area described by those verts will increase by x^2. And I'm not saying to scale the whole artery. Look at the pics: I'm scaling individual edge loops along their individual origins. This does nothing to change the length of the artery, only the width. Oct 28, 2021 at 15:01
• @Okra I made a few edits that might make it more clear to you how this will work. Oct 28, 2021 at 15:15