我正在尝试定义一个斜平面,其中包含点 A、B 和 C,以便在环境中使用scope
,然后使用 2D 在其中绘制一个圆。在以前的绘图中,我设法使用了类似的选项canvas is xy plane at z=
,但这次我不知道该怎么做。
有没有办法使用三个点来定义要绘制的平面?我如何定义要绘制的平面?使用x={(a1,b1,c1)}
和y={(a2,b2,c2)}
?
现在,我拥有的是:
\documentclass{article}
\usepackage{tkz-euclide}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{75}{100}
\begin{tikzpicture}[tdplot_main_coords]
\foreach \i in {0,3}{
\begin{scope}[canvas is xy plane at z=\i]
\tkzDefPoints{0/0/O\i, 2/0/A\i}
\tkzDefRegPolygon[sides=8](O\i,A\i)
\begin{scope}[opacity=0]
\tkzLabelRegPolygon(O\i){P1\i,P2\i, P3\i, P4\i,P5\i,P6\i, P7\i, P8\i}
\end{scope}
\tkzDrawPolygon(P1\i,P2\i, P3\i, P4\i,P5\i,P6\i, P7\i, P8\i)
\end{scope}
}
\foreach \i in {1,...,8}{
\draw (P\i0) -- (P\i3);
}
\tkzLabelPoint[above](P13){\(A\)}
\tkzLabelPoint[above](P63){\(B\)}
\tkzLabelPoint[right](P30){\(C\)}
\end{tikzpicture}
\end{document}
非常感谢您的帮助!
答案1
您可以计算平面的基向量。这可以通过计算三个点之间的差异的交叉乘积并对其进行归一化来实现。(我使用稍微修改过的版本,\tdplotcrossprod
因为内置版本往往会吞掉符号。)为了说明这一点,我在三个点的重心处画了一个圆圈,但您可以根据需要进行调整。顺便说一句,tkz-euclide
在这种情况下,它并没有带来很大的优势,但不幸的是它掩盖了坐标的分量,这在 2d 中是可以的,但在 3d 中则不行,因为您需要它们进行进一步的操作,所以我放弃了它。
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{75}{120}
\begin{tikzpicture}[tdplot_main_coords,
declare function={x8(\i)=2*cos(\i*45-45);
y8(\i)=2*sin(\i*45-45);}]
\path foreach \j in {0,3} {foreach \i in {1,...,8}
{({x8(\i)},{y8(\i)},{\j}) coordinate (P\i\j)}};
\draw foreach \j in {0,3}
{plot[samples at={1,...,8}] (P\x\j) -- cycle};
\foreach \i in {1,...,8}{
\draw (P\i0) -- (P\i3);
}
\path (P13) node[above] {$A$} (P63) node[above] {$B$}
(P30) node[right] {$C$};
%\show\tdplotcrossprod
\def\tdplotcrossprod(#1,#2,#3)(#4,#5,#6){%
\pgfmathsetmacro{\tdplotresx}{(#2) * (#6) - (#3) * (#5)}%
\pgfmathsetmacro{\tdplotresy}{(#3) * (#4) - (#1) * (#6)}%
\pgfmathsetmacro {\tdplotresz }{(#1) * (#5) - (#2) * (#4)}}
% compute the normal on the plane
\tdplotcrossprod({x8(1)-x8(6)},{y8(1)-y8(6)},0)({x8(1)-x8(3)},{y8(1)-y8(3)},3)
\pgfmathsetmacro{\normalization}{sqrt(\tdplotresx*\tdplotresx+\tdplotresy*\tdplotresy+\tdplotresz*\tdplotresz)}
\pgfmathsetmacro{\nAx}{\tdplotresx/\normalization}
\pgfmathsetmacro{\nAy}{\tdplotresy/\normalization}
\pgfmathsetmacro{\nAz}{\tdplotresz/\normalization}
% compute the x-vector of the plane
\pgfmathsetmacro{\normalization}{sqrt((x8(1)-x8(6))*(x8(1)-x8(6))+(y8(1)-y8(6))*(y8(1)-y8(6)))}
\pgfmathsetmacro{\exx}{(x8(6)-x8(1))/\normalization}
\pgfmathsetmacro{\exy}{(y8(6)-y8(1))/\normalization}
\pgfmathsetmacro{\exz}{0}
% compute the y-vector of the plane
\tdplotcrossprod(\nAx,\nAy,\nAz)(\exx,\exy,\exz)
\pgfmathsetmacro{\normalization}{sqrt(\tdplotresx*\tdplotresx+\tdplotresy*\tdplotresy+\tdplotresz*\tdplotresz)}
\pgfmathsetmacro{\eyx}{\tdplotresx/\normalization}
\pgfmathsetmacro{\eyy}{\tdplotresy/\normalization}
\pgfmathsetmacro{\eyz}{\tdplotresz/\normalization}
\typeout{(ex)=(\exx,\exy,\exz), (ey)=(\eyx,\eyy,\eyz), (ez)=(\nAx,\nAy,\nAz)}
%
\path (\exx,\exy,\exz) coordinate (ex)
(\eyx,\eyy,\eyz) coordinate (ey)
(\nAx,\nAy,\nAz) coordinate (ez)
({(x8(1)+x8(3)+x8(6))/3},{(y8(1)+y8(3)+y8(6))/3},2) coordinate (P);
\begin{scope}[x={(ex)},y={(ey)},z={(ez)}]%,canvas is xy plane at z=0]
\draw (P) circle[radius=1];
\end{scope}
\end{tikzpicture}
\end{document}