Hi,
I’d like to create an open source tool that adds control handles to 2d curve fillets in Rhino. Who are some people on the McNeel team or in the community who would like to brainstorm strategies for this?
Fig 1. Basic Idea: drag a fillet’s handle to dynamically resize it.
Issues worth discussing might be:
- Data structures that can maintain a curve’s fillet history
- Remove or shrink fillets without losing original shapes
- Hard to do across operations like Trims/Splits
- How do we handle adjacent fillets?
- Which may contact or engulf one another
- How do we handle fillet features from an ordinary curve?
- Which will not have any fillet history
- Can we extend the approach to chamfers or blends?
On the practical side, we’d have to extend the curve class in rhino.
- Custom display code, custom “grips” objects, on top of an extended data model
- I think T-Splines does something similar this (with underlying nurbs surfaces)
- It’s not clear how the C#/C++ APIs let us do this
- What open source addons do something similar?
For reference, I’ve found three basic fillet algorithms.
-
Multiple offsets [1]
Fig 2. Globally fillet a curve with multiple offsets. -
Intersection of offsets [2]
Fig 3. Directly compute fillet centers by intersecting offsets (Source: [2, page 88]). -
Solve an equation using, eg, the Newton method [3]
Fig 3. Locally fillet a curve with root solving.
I have two basic ideas for data structures.
-
A ‘feature graph’
- Specify fillet targets & radii
- Handles control these fillet radii
- Basically a history tree for nurbs curves
-
Something I’m calling a ‘fillet policy’
- Specify a ‘minimum curvature radius’ for each point on a curve
- Compute the minimum number of fillets to enforce this policy
- Handles control the fillet policy
That’s nearly all I’ve got, and I admit it’s not much! Who wants to collaborate here!?
References:
[1] Tiller, Hanson, “Offsets of 2D Profiles”, 1984. (link)
[2] Snyder, John, “Generative Modelling for Computer Graphics and CAD”, 1992 (book)
[3] OpenCASCADE, “ChFi2d_FilletAlgo”, (details, code)