Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

helper.knot_removal returns incorrect result (+ fix) #176

Open
tomas16 opened this issue Jul 23, 2024 · 2 comments
Open

helper.knot_removal returns incorrect result (+ fix) #176

tomas16 opened this issue Jul 23, 2024 · 2 comments
Labels
bug There is a problem with the coding or algorithms

Comments

@tomas16
Copy link

tomas16 commented Jul 23, 2024

Describe the bug

I used knot_insertion to split a NURBS curve, then tried to use knot_removal to merge the two parts again. The output was different from the original: the curve had the wrong shape because the control points computed by knot_removal are incorrect.

I compared the implementation to the NURBS book, and there are 2 bugs in it:

  • The algorithm in the book doesn't distinguish between the ctrlpts input and the internal working copy ctrlpts_new. The algorithm in the book writes to and reads from the control points, but the geomdl version writes to ctrlpts_new and reads from ctrlpts, so doesn't pick up its own changes.
  • The while j - i >= t condition is while j - i > t in the book.

With these 2 changes, I got the correct result. Patch attached.

Btw I highly recommend having a round trip knot_insertion, knot_removal as a test.

Configuration:

  • Python version: 3.11.9
  • geomdl install source: PyPI
  • geomdl version/branch: 5.3.1

knot_removal.patch

@tomas16 tomas16 added the bug There is a problem with the coding or algorithms label Jul 23, 2024
@portnov
Copy link

portnov commented Jul 24, 2024

See also: #135.

@tomas16
Copy link
Author

tomas16 commented Jul 25, 2024

I found an additional issue: the algorithm always tries to remove num knots, even when the various checks come out above tolerance. Patch attached.

Explanation:

  • The algorithm was missing the if t == 0: return condition.
  • Once that's added in, the t += 1 index fix is incorrect. A python loop for t in range(0, num) will never have t==num at the end. However in the book, the authors write C-like pseudo-code. A loop like for (int t=0; t<num; t++) results in t==num at the end. Since we now also have a break inside the loop, "fixing" t after the loop becomes complicated, so instead I replaced it with a while loop that behaves like the original C-style loop in the book.

Finally, this function should also output t as the actual number of knot removals. Again, the book mentions t is supposed to be one of the outputs. I didn't output it in the patch to not break the rest of your code. (I added it in my version though, because I need it)

knot_removal.patch

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug There is a problem with the coding or algorithms
Projects
None yet
Development

No branches or pull requests

2 participants