使用结进行扭曲时出错

使用结进行扭曲时出错

代码

\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=3tikzpicture环境中删除它会出现错误:

!未定义的控制序列。\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

相关内容