相对于一条线反射

相对于一条线反射

我认为已经有人问过类似的问题,但我不明白答案。给定一个函数的图形,我想绘制反函数的图形,也就是说,我希望能够反映例如抛物线相对于直线 y=x 的曲线。有没有在 tikzpicture 中不太复杂的方法来实现这一点?谢谢!

Marmot,鉴于你下面写的内容,我认为这应该非常简单。(非常感谢,你的回答非常清楚!)我所做的就是(1)复制你的代码两次并使用迷你页面(2)将正弦的域更改为(-pi/2,pi/2),将反正弦的域更改为(-1,1)(3)在迷你页面中分别注释掉反正弦和正弦,以免两个图形混在一起。

为什么这不起作用?

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{backgrounds}
\begin{document}

\begin{minipage}{.5\textwidth}
\begin{tikzpicture}[
declare function={ f(\x) = sin(\x*180/pi); %<- enter your function right here
                   a=1;
                   b=1;
                   reflectedx(\x)        = -\x+2*a*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
                   reflectedy(\x)        = -f(\x)+2*b*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
                 },
]
\begin{scope}[local bounding box=plots]
 \draw [blue,thick] plot [domain=-pi/2:pi/2,samples=100,smooth] ({\x}, {f(\x)});
 %\draw [red,thick] plot [domain=-4:4,samples=100,smooth] ({reflectedx(\x)},{reflectedy(\x)});
\end{scope}
\begin{scope}[on background layer]
\draw[thick,-latex] ([xshift=-2mm]plots.west |-0,0) -- ([xshift=4mm]plots.east
|-0,0) node[below left]{$x$};
\draw[thick,-latex] ([yshift=-2mm]plots.south -|0,0) -- ([yshift=4mm]plots.north
-|0,0) node[below left]{$y$};
\end{scope}
\end{tikzpicture}
\end{minipage}

\begin{minipage}{.5\textwidth}
\begin{tikzpicture}[
declare function={ f(\x) = sin(\x*180/pi); %<- enter your function right here
                   a=1;
                   b=1;
                   reflectedx(\x)        = -\x+2*a*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
                   reflectedy(\x)        = -f(\x)+2*b*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
                 },
]
\begin{scope}[local bounding box=plots]
 %\draw [blue,thick] plot [domain=-4:4,samples=100,smooth] ({\x}, {f(\x)});
 \draw [red,thick] plot [domain=-1:1,samples=100,smooth] ({reflectedx(\x)},{reflectedy(\x)});
\end{scope}
\begin{scope}[on background layer]
\draw[thick,-latex] ([xshift=-2mm]plots.west |-0,0) -- ([xshift=4mm]plots.east
|-0,0) node[below left]{$x$};
\draw[thick,-latex] ([yshift=-2mm]plots.south -|0,0) -- ([yshift=4mm]plots.north
-|0,0) node[below left]{$y$};
\end{scope}
\end{tikzpicture}
\end{minipage}
\end{document}

答案1

如果你不能理解这个答案,我提前道歉(但我也不知道我应该添加哪些解释我之前的回答。我唯一能看到的是,之前的答案是使用 pgfplots。假设这是问题所在,下面是一个 Ti仅限 Z 答案。(不过,我相信如果您使用 pgfplots 来做这件事,效果会更好。)您需要做的就是在标记的位置输入要“反转”的函数。(当然,如果函数不像下面的例子那样单调,那么这并不是真正的逆函数,只是反射。)

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}[
declare function={ f(\x) = sin(\x*180/pi); %<- enter your function right here
                   a=1;
                   b=1;
                   reflectedx(\x)        = -\x+2*a*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
                   reflectedy(\x)        = -f(\x)+2*b*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
                 },
]
\begin{scope}[local bounding box=plots]
 \draw [blue,thick] plot [domain=-4:4,samples=100,smooth] ({\x}, {f(\x)});
 \draw [red,thick] plot [domain=-4:4,samples=100,smooth] ({reflectedx(\x)},{reflectedy(\x)});
\end{scope}
\begin{scope}[on background layer]
\draw[thick,-latex] ([xshift=-2mm]plots.west |-0,0) -- ([xshift=4mm]plots.east
|-0,0) node[below left]{$x$};
\draw[thick,-latex] ([yshift=-2mm]plots.south -|0,0) -- ([yshift=4mm]plots.north
-|0,0) node[below left]{$y$};
\end{scope}
\end{tikzpicture}
\end{document}

enter image description here

附录:至于为什么你的代码“不起作用”。我使用的是独立类,它与\textwidth其他类不同。如果你切换到article(比如说),你会没事的:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}

\begin{minipage}{.5\textwidth}
\begin{tikzpicture}[
declare function={ f(\x) = sin(\x*180/pi); %<- enter your function right here
                   a=1;
                   b=1;
                   reflectedx(\x)        = -\x+2*a*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
                   reflectedy(\x)        = -f(\x)+2*b*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
                 },
]
\begin{scope}[local bounding box=plots]
 \draw [blue,thick] plot [domain=-pi/2:pi/2,samples=100,smooth] ({\x}, {f(\x)});
 %\draw [red,thick] plot [domain=-4:4,samples=100,smooth] ({reflectedx(\x)},{reflectedy(\x)});
\end{scope}
\begin{scope}[on background layer]
\draw[thick,-latex] ([xshift=-2mm]plots.west |-0,0) -- ([xshift=4mm]plots.east
|-0,0) node[below left]{$x$};
\draw[thick,-latex] ([yshift=-2mm]plots.south -|0,0) -- ([yshift=4mm]plots.north
-|0,0) node[below left]{$y$};
\end{scope}
\end{tikzpicture}
\end{minipage}
%
\begin{minipage}{.5\textwidth}
\begin{tikzpicture}[
declare function={ f(\x) = sin(\x*180/pi); %<- enter your function right here
                   a=1;
                   b=1;
                   reflectedx(\x)        = -\x+2*a*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
                   reflectedy(\x)        = -f(\x)+2*b*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
                 },
]
\begin{scope}[local bounding box=plots]
 %\draw [blue,thick] plot [domain=-4:4,samples=100,smooth] ({\x}, {f(\x)});
 \draw [red,thick] plot [domain=-1:1,samples=100,smooth] ({reflectedx(\x)},{reflectedy(\x)});
\end{scope}
\begin{scope}[on background layer]
\draw[thick,-latex] ([xshift=-2mm]plots.west |-0,0) -- ([xshift=4mm]plots.east
|-0,0) node[below left]{$x$};
\draw[thick,-latex] ([yshift=-2mm]plots.south -|0,0) -- ([yshift=4mm]plots.north
-|0,0) node[below left]{$y$};
\end{scope}
\end{tikzpicture}
\end{minipage}
\end{document}

enter image description here

答案2

既然你要求映射给定的 y=x 的图,也就是得到逆函数的图,我推荐三种方法来实现。例如,原始图是 y=ln(x) 的图。

  1. 使用[rotate=45,yscale=-1,rotate=-45] 选项按照从右到左的顺序执行:首先沿 x 轴旋转 -45 度,然后绕 x 轴反射([yscale=-1]),最后再旋转回来 45 度。

    选项[rotate=-45,xscale=-1,rotate=45]给出相同的结果。

  2. 用途[x={(0cm,1cm)},y={(1cm,0cm)}]这就是反函数的几何意义。

  3. 使用({ln(\x)},\x)而不是(\x,{ln(\x)})这是 TikZ 绘制图形的方式。

注意:关于 y=-x 的反射,使用[rotate=45,xscale=-1,rotate=-45] 另外,你可以用同样的方式反射 y=ax+b(首先移动到原点)! PS:我个人喜欢第一种方法。我们不仅可以应用于轴对称,还可以应用于中心对称、同位体、平移,使用rotaterotate aroundscalescale aroundshift。TikZ 很棒!

以上三种方式给出的图像相同。希望您理解这个答案^^以下是完整的代码。

enter image description here

\documentclass[tikz,border=5mm]{standalone}
\pagecolor{yellow!30}
\begin{document}
% The original graph y=ln(x)
\def\originpath{
    plot[domain=.1:4.5,smooth] (\x,{ln(\x)})
}
% reflecting y=ln(x) about y=x
% to get (the graph of) the inverse function y=e^x

% 1st way: use [rotate=-45,xscale=-1,rotate=45]
\begin{tikzpicture}
\draw (-2,-2)--(4,4) node[above]{$y=x$};
\draw[-stealth] (-3,0)--(5,0) node[below=1mm]{$x$};
\draw[-stealth] (0,-3)--(0,5) node[left=1mm]{$y$};
\draw[blue,thick] \originpath node[above]{$y=\ln x$};

\draw[magenta,thick,rotate=45,yscale=-1,rotate=-45] 
\originpath node[above]{$y=e^x$};
\end{tikzpicture}

% 2nd way: use [x={(0cm,1cm)},y={(1cm,0cm)}]
\begin{tikzpicture}
\draw (-2,-2)--(4,4) node[above]{$y=x$};
\draw[-stealth] (-3,0)--(5,0) node[below=1mm]{$x$};
\draw[-stealth] (0,-3)--(0,5) node[left=1mm]{$y$};
\draw[blue,thick] \originpath node[above]{$y=\ln x$};

\draw[magenta,thick,x={(0cm,1cm)},y={(1cm,0cm)}] 
\originpath node[above]{$y=e^x$};
\end{tikzpicture}

% 3rd way: change (\x,{ln(\x)}) to ({ln(\x)},\x)
\begin{tikzpicture}
\draw (-2,-2)--(4,4) node[above]{$y=x$};
\draw[-stealth] (-3,0)--(5,0) node[below=1mm]{$x$};
\draw[-stealth] (0,-3)--(0,5) node[left=1mm]{$y$};
\draw[blue,thick]
plot[domain=.1:4.5,smooth] (\x,{ln(\x)})
node[above]{$y=\ln x$};

\draw[magenta,thick]
plot[domain=.1:4.5,smooth] ({ln(\x)},\x)
node[above]{$y=e^x$};
\end{tikzpicture}

\end{document}

相关内容