代码
\documentclass[tikz,border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{hobby, knots}
\begin{document}
\begin{tikzpicture}[rotate=90,scale=3]% remove 'scale=3' to get the error
\begin{knot}[flip crossing=1,consider self intersections=true,
ignore endpoint intersections=false]
\strand (0,1) to[out=-90,in=90](0,0.5) to [out=270, in=270]
(0.3,0.5)to [out=90, in=90]
(0,0.5)to[out=-90,in=90] (0,0);
\end{knot}
\end{tikzpicture}
\end{document}
使用该knots
包来生成:
(它旋转只是为了占用更少的空间。)这就是我想要的,只是它太大了。不幸的是,scale=3
从tikzpicture
环境中删除它会出现错误:
!未定义的控制序列。\LaTeX3 错误:使用了错误的变量 \knotnextfilament6!l.14 \end{knot}x
有人知道为什么会发生此错误以及如何修复它以获得较小的扭曲吗?(当然,我可以使用重新缩放图像,\scalebox
但这种技巧并不能真正解决问题。)
从某种意义上说,错误是由于ignore endpoint intersections=false
没有这个而导致的,因为代码编译时会产生:
但这并不能解决我的问题,因为十字路口已被替换为
帖子tikz knots 包中的交叉点展示了使用包绘制扭曲的几种方法,这样我就可以绘制我想要的图表,但是,我仍然不明白为什么上面的代码在删除knots
时不起作用。scale=3
答案1
让我把这些评论总结成一个“答案”。
代码中确实有两个问题。第一个问题是包中有一个错误,现在这个错误在版本中被修复了github
。
第二个原因是交叉点实际上是多条线段的起点或终点。这导致交叉点被发现的次数比应有的次数要多。简而言之,当consider self intersections
设置时,路径被分成多个段(由于贝塞尔曲线可以自相交,这些段本身可能会进一步分割)以找到自相交点。在这种情况下,即使没有进一步分割,交叉点也会被发现四次:段 1 和 3、1 和 4、2 和 3、2 和 4 之间(该程序包确实识别出,比如说,段 1 和 2 之间的交叉是虚假的)。
最简单的解决方法是调整线段的端点,使交叉不会发生在这样的端点。实验表明,将它们调整为(0,0.501)
和(0,0.499)
就足够了。
影响事物的原因scale
在于,当结库开始工作时,所有坐标都已转换为尺寸,因此公差和测试都是就而言的pt
。