TikZ:如何在 foreach 循环中重新计算命令值变量?

TikZ:如何在 foreach 循环中重新计算命令值变量?

如果速度是初始高度以下高度的函数,我试图绘制一条穿过多个均质介质的光路。这将由一条直线段组成的路径组成。

我打算这样做:

  1. 定义起始坐标,(A)

  2. 开始 foreach 循环

  3. 根据斯涅尔定律和运动学,找到下一个坐标(B)。(如下所示,MathJax 在哪里?)

  4. 在 (A) 和 (B) 之间绘制路径。然后我将定义 (A) 为具有 (B) 的值

  5. 继续循环直到结束

斯涅尔定律,sin(theta)/v = 常数;v = sqrt(h)

其中 h 是从起点的垂直距离,而 theta 是从垂直方向测量的,因此我在计算中使用 cos 和 acos,因为该值\qq是从水平方向测量的。


以下是我所拥有的,但它似乎没有更新 \qq 的值,因为它只生成了一系列共线箭头,而这些箭头应该开始变得不那么陡峭。我考虑过使用foreachwith evaluate,但第一个角度与高度无关,因此,我认为这行不通。

\documentclass{article}
\usepackage{tikz}


\begin{document}
\pagestyle{empty}

\begin{figure*}[htp]
\centering
\begin{tikzpicture}[scale=4, >=latex]

\def\len{2} % box height

\def\hstep{0.1} % vert spacing between fluid interfaces
\def\qStart{45} % starting incidence angle


% init iteration variables to initial
\def\qq{\qStart}
\coordinate  (A) at (0, \len) node {A};

% start looping
\foreach \height in {0.1, 0.2, ..., 1.1}{
  % define (B) relative to (A) at some angle at fixed distance (\hstep*\len) below
  \path (A) +(-\qq : {\hstep*\len/sin(\qq)}) coordinate (B); 
  % generate line between the two (for debug, use arrowheads to identify where points are)
  \draw[->] (A) -- (B);
  % update (A) to next point
  \coordinate (A) at (B);
  % recalculate \q according to snell's law using pgf's math functions and \pfgmathsetmacro for real values
  \pgfmathsetmacro{\qq}{ {acos( 
  sqrt( 1+\hstep/\height )*cos(\qq) )} }
}   

\end{tikzpicture}
\end{figure*}


\end{document}

答案1

math库提供了一个 for 循环,它不对每次迭代限定范围,从而允许值在迭代之间保留其值。

不确定这是否是所需的输出,我认为应该cos(\qq)cos(\qq)^2(至少这可以使编译没有错误)。

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}[scale=4]
\tikzmath{%
  \len = 2;
  \hStep = 0.1;
  \qStart = 45;
  \qq = \qStart;
  { 
    \coordinate (A) at (0, \len);
  };
  for \h in {0.1, 0.2, ..., 1.1}{%
    {
      \path (A) ++ (-\qq : {\hStep * \len / (sin(\qq) + 1)}) coordinate (B);
      \draw[->] (A) -- (B);
      \coordinate (A) at (B); 
    };
    \qq = acos(sqrt( 1 + \hStep / \h ) * cos(\qq)^2 );
  };
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容