Looks neat. Might be worth constraining the inputs. I got an error at 200x200:
Uncaught PythonError: Traceback (most recent call last):
File "<exec>", line 22, in resetKnot
File "<exec>", line 473, in generateKnot
File "/lib/python3.12/site-packages/PIL/Image.py", line 2941, in new
return im._new(core.fill(mode, size, color))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^