是否可以在 Tikz 中评估角度?我在 Google 上搜索了很多,但找不到任何有用的方法。我的问题如下:我有一个圆弧与一束平行线相交,就像下图中的 Shawn 一样
一旦绘制了弧线(路径名=镜像),我就使用了这个代码
\foreach \y in {-1.6,-0.8,...,1.6}
{
\path [name path=ray] (-1,\y) -- ($ (-1,\y) + (10,0) $);
\path [name intersections={of=ray and mirror, by={P}}];
\draw [thick, postaction={on each segment={mid arrow=black}}] (-1,\y) -- (P);
\draw [thick, dashed, name path=refracted] (P) -- (F);
\begin{scope}[shift={(P)}]
\end{scope}
}
生成线束。我想用红色画一些这样的线
为了做到这一点,我想评估 P-F-V 之间的角度,并在 P 中的坐标系移动后(每条线都会改变),然后使用
\draw [thick] (\myAngle:2cm);
答案1
您要求的计算比上一个答案因为光线都是水平的。你只需要得到它们击中镜子的角度 alpha,出射光线的角度就是 180-2*alpha。这个角度可以用语法calc
计算
\path let \p1=($(<point>)-(<center>)$),
\n1={180-atan2(\y1,\x1)} in ... ;
其中是射线照射镜子的点,即代码中的<point>
交点,是用于绘制镜子的圆心。以下独立代码说明了这一点。P
<center>
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{decorations.markings,calc,angles,quotes}
\pgfdeclareradialshading{halo}{\pgfpointorigin}{
color(0pt)=(pgftransparent!100); color(22.5bp)=(pgftransparent!100);
color(25bp)=(pgftransparent!00); color(50bp)=(pgftransparent!00)}%
\pgfdeclarefading{halo}{\pgfuseshading{halo}}%
\tikzset{->-/.style={decoration={% https://tex.stackexchange.com/a/39282/194703
markings,
mark=at position #1 with {\arrow{>}}},postaction={decorate}},
->-/.default=0.5}
\begin{document}
\begin{tikzpicture}[>=stealth,every label/.append style={black},
bullet/.style={circle,fill=black,inner sep=0.1em}]
\begin{scope}[xshift=6cm]
\clip (75:-3)
-- (75:-2.5) arc (75:-75:-2.5)
-- (-75:-3) arc (-75:75:-3);
\fill[path fading=halo] (0,0) circle[radius=3cm];
\end{scope}
\draw (-2,0) coordinate (L) -- (7,0) coordinate (R)
(3,0) node[bullet,label=below left:$V$](V){}
(6,0) node[bullet,label=below:$C$](C){}
(-1,0) node[bullet,label=below:$O$](O){}
foreach \X [count=\Y] in {-40,-20,20,40}
{($(C)+(180+\X:3)$) node[bullet](P\Y){}};
\foreach \Y in {1,...,4}
{\draw[orange,->-,thick] (O|-P\Y) -- (P\Y);
\draw[red,->-,thick] let \p1=($(P\Y)-(C)$),
\n1={180-atan2(\y1,\x1)} in
(P\Y) -- ++({180-2*\n1}:2);
\draw[dashed, shorten >=-2cm] (C) -- (P\Y);}
\end{tikzpicture}
\end{document}