tikz中三维几何体的尺寸太大

tikz中三维几何体的尺寸太大

我遇到了一个奇怪的编译错误。我已将代码修剪到最大限度,但我的 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而不改变输出。

这让我想到两点评论和一个疑问。

  1. 我不明白为什么20作品和21不在
  \foreach \j in {0, 1, ..., 20}{
    \pgfmathsetmacro{\AngleEntree}{-10*\j}    
    \coordinate (centreCardan) at (0, {-7*\j}, 5);

尺寸太大误差不是由你实际绘制的内容给出的(见下文,我试图估计最后绘制元素所需的最大距离),而是由 中的计算得出的\Pivot。如你所见,绘制的元素涉及的尺寸约为4000 分远低于最大值~16,370

在此处输入图片描述

  1. 如果我们在不移动点的情况下绘制所有内容,(centreCardan)我们会得到类似这样的结果。

在此处输入图片描述

(我看到弹簧的“圆圈”被压在卷成圆柱体的平面上。)

  1. 那么,你最终想要什么?我不认为你想要一个像埃及卷轴一样长的 pdf 文件。我看不出它有什么用处,但谁知道呢。如果你想要的最终结果是某种动画,那么你应该创建单独的图像,即将循环移出tikzpicture环境。 这尺寸太大错误将会消失。

相关内容