@pascal unfortunately it failed miserably
well you can implement that. For instance you retrieve the trimming boundary, create a point on the unmasked part, convert to Bezier and use the trim boundary to retrim and keep those parts where a point lays on top.
However, what I meant is modelling not coding.
Hello - feel free to post the model or send to tech@mcneel.com for a look.
-Pascal
@pascal Hi Pascal, thanks. Here is the model. Bottle.igs (2.6 MB) I will also try tech@mcneel.com.
Hi @menno,
thank you for your example. I am not sure if i interpret your pre-decrement --nTotal
and post-increment nTotal++
correct in python, i get bezier curves with ControlVertexCount == 6
and Dimension = 3
with below code:
cp = System.Array.CreateInstance(Rhino.Geometry.Point4d, crv.Order)
nTotal = 1
while nTotal < crv.Points.Count:
nTotal -= 1 # PreDecrement
for i in xrange(crv.Order):
aControlPoint = crv.Points[nTotal]
nTotal += 1 # PostIncrement
w = aControlPoint.Weight
cp[i] = Rhino.Geometry.Point4d(w * aControlPoint.Location.X,
w * aControlPoint.Location.Y,
w * aControlPoint.Location.Z,
w
)
result.Add(Rhino.Geometry.BezierCurve(cp))
Shouldn’t the ControlVertexCount
equal 4 ?
_
c.
Only if crv.Order
is equal to four, have you checked? The curve order is equal to 1+degree.
Thanks @menno, you are absolutely right. I was testing with a degree 5 curve, if i use degree 3 curves i get ControlVertexCount == 4. I’ve tried to make it recursive to further convert the results until all segments have 4 vertices, but this gives many short segments remaining with degree 5. Below input is a degree 5 curve with 8 control points, end points are in magenta:
I guess if i want to convert to bezier segments with 4 vertices each, i need to change the degree before ?
thanks,
c.
Yes, but that will change the curve. Why is it important to have 4 CPs?
Hi @menno, i try to make conversion from nurbs to 4 pt crv with tangent vectors and vice versa.
_
c.
I see, in that case you should indeed work with degree-3 curves.
This would be my understanding on what needs to be done:
As a first step you’ll need to decompose an n-degree nurbs into its n-degree bezier elements. If n > 3 then you need to lower the degree afterwards. This however is a refit operation and likely has a deviation greater than your tolerance.
If n < 3 you can simply increase the degree and the curve will stay in shape. If n == 3 you are already done.
When refitting is required (n >3) you’ll need a good approximation algorithm. You can use Bezier Interpolation (-> inverse of the decasteljau algorithm) on the Greville points of your original Nurbs or you decompose the curve into multiple points and use a Linear Least Square approach to minimize the error. For most cases multiple curves have to be created. Especially when weights other than 1 are involved. Usually you should analyse for curvature extremes when it comes to spliting.
Thanks @TomTom for your explanation. Like with everything, i’ll try to follow the KISS* principle. Getting a small deviation is OK. Getting things out of Rhino is easier than getting things in. Just found that the curves i have to import have subcurves with 4 control vertices (anchors) and left/right tangent vectors with length…
_
c.