Tikz の両凹レンズ

Tikz の両凹レンズ

みなさんこんにちは、メリークリスマス(遅くなりましたが笑)。下のような両凹レンズを描きたいのですが、なかなかうまくいきません。

ここに画像の説明を入力してください

なんとかこう書きましたが、これは私が望んでいた結果ではありません。

\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}[scale=0.9]
\pgfmathsetmacro{\lensRadius}{2.6}
\pgfmathsetmacro{\lensHeight}{1.8}
\pgfmathsetmacro{\startAngle}{-asin(\lensHeight/\lensRadius)}

\draw [fill=lightgray!50, very thick]  (0,\lensHeight)
arc[start angle=-\startAngle,delta 
angle=2*\startAngle,radius=\lensRadius]
--++ (0:2)
arc[start angle=-\startAngle,delta angle=2*\startAngle,radius=- 
\lensRadius]
-- cycle;
\end{tikzpicture}
\end{document}

答え1

これはそのようなレンズを描きます。半径を異なる値に選択できますが、もちろん同じ値に設定することもできます。焦点の位置は、レンズメーカー方程式マクロの代わりに pgf キーが使用されます。パラメータは、高さh、厚さd、屈折率n、半径R1とですR2。パラメータはalpha破線のシアン線の傾きを示すだけです。

\documentclass[tikz,border=3mm]{standalone}
\begin{document}
 \begin{tikzpicture}[bullet/.style={circle,black,fill,inner sep=1.8pt},
   every label/.append style={black},
   declare function={lensf(\n,\d,\Rone,\Rtwo)=1/(
   (\n-1)*(1/\Rone-1/\Rtwo+(\n-1)*\d/(\n*\Rone*\Rtwo)));
   startangle(\h,\r)=asin(\h/\r);},
   lens/.cd,n/.initial=1.7,R1/.initial=3.6,R2/.initial=-3.9,d/.initial=0.6,
   h/.initial=1.8,alpha/.initial=20]
  %short cut 
  \def\pv#1{\pgfkeysvalueof{/tikz/lens/#1}} 

  \draw [fill=lightgray!50, very thick]  
    ({-\pv{d}/2-cos(90-startangle(\pv{h},\pv{R1}))},\pv{h})
    arc[start angle={startangle(\pv{h},\pv{R1})},delta 
    angle={-2*startangle(\pv{h},\pv{R1})},radius=\pv{R1}]
    --++ ({\pv{d}+cos(90-startangle(\pv{h},\pv{R1}))+cos(90+startangle(\pv{h},\pv{R2}))},0)
    arc[start angle={-startangle(\pv{h},\pv{R2})},delta 
    angle={2*startangle(\pv{h},\pv{R2})},radius=\pv{R2}]  
    -- cycle;
   \draw[very thick,dashed] (0,-1.2*\pv{h}) --  (0,1.2*\pv{h});
   \draw[very thick] (-1.2*\pv{R1}-\pv{d}/2,0) -- (-1.2*\pv{R2}+\pv{d}/2,0);
   \draw[cyan,dashed,thick] ({-\pv{d}/2-\pv{R1}},0)   
    node[bullet,label=below:$C_1$]{}
   -- node[sloped,above]{$R_1$} ++ (\pv{alpha}:\pv{R1});
   \path ({-lensf(\pv{n},\pv{d},\pv{R1},\pv{R2})},0) 
    node[bullet,label=below:$F_2$]{};
   \draw[cyan,dashed,thick] ({\pv{d}/2-1*\pv{R2}},0)    
    node[bullet,label=above:$C_2$]{}
   -- node[sloped,below]{$R_2$} ++ (\pv{alpha}:\pv{R2});
   \path ({lensf(\pv{n},\pv{d},-1*\pv{R2},-1*\pv{R1})},0) 
    node[bullet,label=above:$F_1$]{};
 \end{tikzpicture}
\end{document}

ここに画像の説明を入力してください

関連情報