在背景中绘制带有光锥的三维矢量

在背景中绘制带有光锥的三维矢量

我试图绘制几个带有光锥背景的 3d 矢量。代码融合了以下两个旧答案: TikZ 中的截止锥Tikz 中的 2D 和 3D 矢量由于某种原因,我无法让向量显示出来。下面给出了一个工作代码:

\documentclass{article}
\usepackage{pgfplots}
\usepackage{tikz-3dplot} 
\pgfplotsset{compat=1.3}

\begin{document}
\tdplotsetmaincoords{60}{120} 

\begin{figure}
\centering
\begin{tikzpicture}[scale=1.5, tdplot_main_coords, axis/.style={->,blue,thick}, 
vector/.style={-stealth,red,very thick}, 
vector guide/.style={dashed,red,thick}]
\begin{axis}[
axis lines=center,
axis on top,
xlabel={$x$}, ylabel={$y$}, zlabel={$t$},
domain=0:1,
y domain=0:2*pi,
xmin=-1.5, xmax=1.5,
ymin=-1.5, ymax=1.5, zmin=0.0,
every axis x label/.style={at={(rel axis cs:0,0.5,0)},anchor=south},
every axis y label/.style={at={(rel axis cs:0.5,0,0)},anchor=north},
every axis z label/.style={at={(rel axis cs:0.5,0.5,0.9)},anchor=west},
samples=30]
\addplot3 [surf, colormap/blackwhite, shader=flat] ({x*cos(deg(y))},{x*sin(deg(y))},{x});
%standard tikz coordinate definition using x, y, z coords
\coordinate (O) at (0,0,0);

%tikz-3dplot coordinate definition using x, y, z coords

\pgfmathsetmacro{\axone}{5}
\pgfmathsetmacro{\ayone}{3}
\pgfmathsetmacro{\azone}{4}
\pgfmathsetmacro{\axtwo}{3}
\pgfmathsetmacro{\aytwo}{5}
\pgfmathsetmacro{\aztwo}{0}

\coordinate (P1) at (\axone,\ayone,\azone);
\coordinate (P2) at (\axtwo,\aytwo,\aztwo);

\draw[vector] (O) -- (P1);
\draw[vector] (O) -- (P2);

\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}

PS:我想使用透明彩色覆盖层来表示由两个向量界定的平行四边形。因此,任何可以实现此目的的代码都将不胜感激。

编辑:

在@marmot 指出后,将宏名称更改为允许的名称。

答案1

这里存在一些小问题。

  1. 您不能在宏名称中使用数字,因此必须将 \pgfmathsetmacro{\ax1}{5} 等替换为 \pgfmathsetmacro{\axone}{5} 等。
  2. 您正在加载tikz-3dplot甚至尝试安装一个视图。但是,pgfplots有自己的方法,view={...}{...}并且会忽略 tikz-3dplots 内容(除非您付出额外的努力)。
  3. 您正在通过说 来加载非常旧的 pgfplots 版本\pgfplotsset{compat=1.3}。在此版本中,您需要在坐标前加上axis cs:。但是,我想说的是,切换到新版本是有利的,在新版本中不再需要这样做。然后向量的坐标有点大,所以我缩小了它们。
    1. 我还添加了透明的平行四边形并隐藏了 z 轴线的不可见部分。

结果:

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}[scale=1.5,axis/.style={->,blue,thick}, 
vector/.style={-stealth,red,very thick}, 
vector guide/.style={dashed,red,thick}]
\begin{axis}[
axis lines=center,
axis on top,
every inner z axis line/.append style={opacity=0},
xlabel={$x$}, ylabel={$y$}, zlabel={$t$},
domain=0:1,
y domain=0:2*pi,
xmin=-1.5, xmax=1.5,
ymin=-1.5, ymax=1.5, zmin=0.0,zmax=1.2,ztick={1},
every axis x label/.style={at={(rel axis cs:0,0.5,0)},anchor=south},
every axis y label/.style={at={(rel axis cs:0.5,0,0)},anchor=north},
every axis z label/.style={at={(rel axis cs:0.5,0.5,0.9)},anchor=west},
samples=30]
\addplot3 [surf, colormap/blackwhite, shader=flat] ({x*cos(deg(y))},{x*sin(deg(y))},{x});
\addplot3 [domain=0:360,samples y=1,name path=top,draw=none] ({1*cos(deg(x))},{1*sin(deg(x))},{1});
\path[name path=zline] (0,0,0) -- (0,0,1.2) coordinate(ztop);
\path[name intersections={of=top and zline,by={aux1}}];
\draw[-latex] (aux1) -- (ztop);
%standard tikz coordinate definition using x, y, z coords
\coordinate (O) at (0,0,0);

%tikz-3dplot coordinate definition using x, y, z coords

\pgfmathsetmacro{\axone}{0.5}
\pgfmathsetmacro{\ayone}{0.3}
\pgfmathsetmacro{\azone}{0.4}
\pgfmathsetmacro{\axtwo}{0.3}
\pgfmathsetmacro{\aytwo}{0.5}
\pgfmathsetmacro{\aztwo}{0}

\coordinate (P1) at (\axone,\ayone,\azone);
\coordinate (P2) at (\axtwo,\aytwo,\aztwo);
\coordinate (P3) at (\axone+\axtwo,\ayone+\aytwo,\azone+\aztwo);
\fill[red,opacity=0.2] (O) -- (P1) -- (P3) -- (P2) -- cycle;
\draw[vector] (O) -- (P1);
\draw[vector] (O) -- (P2);

\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容