如果速度是初始高度以下高度的函数,我试图绘制一条穿过多个均质介质的光路。这将由一条直线段组成的路径组成。
我打算这样做:
定义起始坐标,(A)
开始 foreach 循环
根据斯涅尔定律和运动学,找到下一个坐标(B)。(如下所示,MathJax 在哪里?)
在 (A) 和 (B) 之间绘制路径。然后我将定义 (A) 为具有 (B) 的值
继续循环直到结束
斯涅尔定律,sin(theta)/v = 常数;v = sqrt(h)
其中 h 是从起点的垂直距离,而 theta 是从垂直方向测量的,因此我在计算中使用 cos 和 acos,因为该值\qq
是从水平方向测量的。
以下是我所拥有的,但它似乎没有更新 \qq 的值,因为它只生成了一系列共线箭头,而这些箭头应该开始变得不那么陡峭。我考虑过使用foreach
with 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}