我遇到了一个奇怪的编译错误。我已将代码修剪到最大限度,但我的 MWE 仍然不太小,因此我将首先关注奇怪的部分:
\foreach \j in {0,1,...,5}{
\pgfmathsetmacro{\AngleEntree}{-10*\j}
\coordinate (centreCardan) at (-20,{-18*\j},5);
% Circle
\begin{scope}[tdplot_screen_coords]
\draw[red,ultra thick,dashed] (centreCardan) circle (\r);
\end{scope}
%Tube
\coordinate (centrePivVR) at ($(centreCardan)+ ({-5*cos(\AngleEntree)},{-5*sin(\AngleEntree)},0)$);
%%
\Pivot{(centrePivVR)}{blue, ultra thick}{ }{cos(\AngleEntree)}{sin(\AngleEntree)}{0}
}
您可以看到发生这种情况的循环(centreCardan)
是用于放置图形的点,并且我在每个循环中定义它以使每个新图形偏移前一个图形。
您可以看到迭代器是\j
,我将它乘以 18 以获取 的 Y 坐标(centreCardan)
。如果我\j
在 4 处停止,它会编译,但如果是 5 则不会。
到目前为止没有什么太令人惊讶的,但是如果使用 10 而不是 18 作为乘数,情况就会变得很奇怪,然后您可以使用\j
(21 * 10 =210 > 5*18 = 90)上升到 21,所以我不太明白发生了什么。
如果我删除该\Pivot
行\j
,则可以使用 18 倍乘数达到 38
如果你能够深入研究 130 行代码,这里是我的 MWE:
\documentclass[tikz,border=5pt]{standalone}
\usepackage{tikz,esvect,tikz-3dplot}
% Créer des canvas personnalisés pour toutes les orientations
\makeatletter
\tikzoption{canvas is plane}[]{\@setOxy#1}
\def\@setOxy O(#1,#2,#3)x(#4,#5,#6)y(#7,#8,#9)%
{\def\tikz@plane@origin{\pgfpointxyz{#1}{#2}{#3}}%
\def\tikz@plane@x{\pgfpointxyz{#4}{#5}{#6}}%
\def\tikz@plane@y{\pgfpointxyz{#7}{#8}{#9}}%
\tikz@canvas@is@plane
}
\makeatother
%%%%% Environnement scope dans un canvas personnalisé avec normalisation du vecteur directeur
\newenvironment{NouveauPlan}[3]
{
\pgfmathsetmacro{\DoublCondi}{0}
\ifdim\VaxecY pt=0 pt
\pgfmathsetmacro{\DoublCondi}{\DoublCondi+1}
\fi
\ifdim\VaxecZ pt=0 pt
\pgfmathsetmacro{\DoublCondi}{\DoublCondi+1}
\fi
\ifdim\DoublCondi pt=2 pt
\pgfmathsetmacro{\XcordY}{1}
\pgfmathsetmacro{\XcordZ}{0}
\pgfmathsetmacro{\YcordX}{0}
\pgfmathsetmacro{\YcordY}{0}
\pgfmathsetmacro{\YcordZ}{1}
\else
\pgfmathsetmacro{\NormX}{sqrt((#3)*(#3)+(#2)*(#2))}
\pgfmathsetmacro{\NormY}{sqrt( ((#2)*(#2)+(#3)*(#3))*((#2)*(#2)+(#3)*(#3)) + (#1)*(#2)*(#1)*(#2) + (#1)*(#3)*(#1)*(#3) )}
\pgfmathsetmacro{\XcordY}{#3/\NormX}
\pgfmathsetmacro{\XcordZ}{(-1)*(#2)/\NormX}
\pgfmathsetmacro{\YcordX}{(-1)*((#2)*(#2)+(#3)*(#3))/\NormY}
\pgfmathsetmacro{\YcordY}{(#1)*(#2)/\NormY}
\pgfmathsetmacro{\YcordZ}{(#1)*(#3)/\NormY}
\fi
%%%%%%%
\begin{scope}[canvas is plane={O(0,0,0)x(0,\XcordY,\XcordZ)y(\YcordX,\YcordY,\YcordZ)}]
}{\end{scope}}
%% Fonctions de Calcul %%
\newcommand*{\NormerVect}[3]{
\pgfmathsetmacro{\NormV}{sqrt((#1)*(#1)+(#2)*(#2)+(#3)*(#3))}
\pgfmathsetmacro{\VncX}{#1/\NormV}
\pgfmathsetmacro{\VncY}{#2/\NormV}
\pgfmathsetmacro{\VncZ}{#3/\NormV}
}
\newcommand*{\MultipliVect}[4]{
\pgfmathsetmacro{\VmcX}{#1*(#4)}
\pgfmathsetmacro{\VmcY}{#2*(#4)}
\pgfmathsetmacro{\VmcZ}{#3*(#4)}
}
\newcommand*{\CalculAxe}[3]{
\pgfmathsetmacro{\NormV}{sqrt((#1)*(#1)+(#2)*(#2)+(#3)*(#3))}
\pgfmathsetmacro{\VaxecX}{#1/\NormV}
\pgfmathsetmacro{\VaxecY}{#2/\NormV}
\pgfmathsetmacro{\VaxecZ}{#3/\NormV}
% Vecteur unitaire de l'axe
\coordinate (AxeUni) at (\VaxecX,\VaxecY,\VaxecZ);
\MultipliVect{\VaxecX}{\VaxecY}{\VaxecZ}{\l/2}
\coordinate (AxeMoitie) at(\VmcX,\VmcY,\VmcZ);
}
%% Liaisons Pivot %%
\newcommand*{\Pivot}[6]{
\CalculAxe{#4}{#5}{#6}
\coordinate (centre) at #1;
\coordinate (centrezp) at ($(centre)+(AxeMoitie)$) ;
\coordinate (centrezm) at ($(centre)-(AxeMoitie)$) ;
\begin{NouveauPlan}{#4}{#5}{#6}
\draw let \p1=($(centrezp)-(centrezm)$),\n1={atan2(\y1,\x1)} in ($(centrezp)+(\n1-90:\r)$)
arc[radius=\r,start angle=\n1+270,delta angle=-540];
\end{NouveauPlan}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
[x={(0.710cm,-0.410cm)},y={(0cm,0.820cm)},z={(-0.710cm,-0.410cm)}]
% Vecteur Point de Vue
\pgfmathsetmacro{\VpvX}{1}
\pgfmathsetmacro{\VpvY}{1}
\pgfmathsetmacro{\VpvZ}{1}
% Dimensions
\pgfmathsetmacro{\r}{1} % Rayon du cylindre
\pgfmathsetmacro{\l}{4} % Longueur cylindre
\foreach \j in {0,1,...,38}{
\pgfmathsetmacro{\AngleEntree}{-10*\j}
\coordinate (centreCardan) at (-20,{-18*\j},5);
% Circle
\begin{scope}[tdplot_screen_coords]
\draw[red,ultra thick,dashed] (centreCardan) circle (\r);
\end{scope}
%Tube
\coordinate (centrePivVR) at ($(centreCardan)+ ({-5*cos(\AngleEntree)},{-5*sin(\AngleEntree)},0)$);
%%
\Pivot{(centrePivVR)}{blue, ultra thick}{ }{cos(\AngleEntree)}{sin(\AngleEntree)}{0}
}
\end{tikzpicture}
\end{document}
感谢那些愿意给我时间的勇士们。
答案1
我试图弄清楚你的代码应该做什么。我多少理解了一点,但并不完全理解。序言中的计算并没有真正说明问题。
话虽如此,我还是设法将您的金额限制提高到20距离三十六(我想象一个完整的圆圈)你正在寻找。代价是减少常数-18进入\coordinate (centreCardan) at (-20, {-18*\j}, 5);
-7。顺便问一下,你为什么需要-20为了X坐标?你可以输入0而不改变输出。
这让我想到两点评论和一个疑问。
- 我不明白为什么20作品和21不在
\foreach \j in {0, 1, ..., 20}{
\pgfmathsetmacro{\AngleEntree}{-10*\j}
\coordinate (centreCardan) at (0, {-7*\j}, 5);
这尺寸太大误差不是由你实际绘制的内容给出的(见下文,我试图估计最后绘制元素所需的最大距离),而是由 中的计算得出的\Pivot
。如你所见,绘制的元素涉及的尺寸约为4000 分远低于最大值~16,370。
- 如果我们在不移动点的情况下绘制所有内容,
(centreCardan)
我们会得到类似这样的结果。
(我看到弹簧的“圆圈”被压在卷成圆柱体的平面上。)
- 那么,你最终想要什么?我不认为你想要一个像埃及卷轴一样长的 pdf 文件。我看不出它有什么用处,但谁知道呢。如果你想要的最终结果是某种动画,那么你应该创建单独的图像,即将循环移出
tikzpicture
环境。 这尺寸太大错误将会消失。