同一对象中的直线和虚线

同一对象中的直线和虚线

我希望(见图)有一条部分虚线、部分可见的线(自动计算)。我希望有办法做到这一点。提前致谢!

在此处输入图片描述

\documentclass[a4paper]{scrartcl}
\usepackage{tikz}
\begin{document} 
\begin{tikzpicture}[x={(-0.3cm,-0.3cm)},y={(1.2cm,0cm)}, z={(0cm,1.2cm)}]
\coordinate (O) at (0,0,0);
\coordinate[label=left:{$A$}] (A) at (-4,-2,0);
\coordinate[label=left:{$B$}] (B) at (4,2,0);
\coordinate[label=below right:{$C$}] (C) at (6,6,0);
\coordinate[label=below right:{$D$}] (D) at (-3,7,0);
\coordinate[label=right:{$E$}] (E) at (4,6,4);
\coordinate[label=above right:{$F$}] (F) at (-5,7,5);
\coordinate[label=above left:{$G$}] (G) at (2,0,6);
\coordinate[label=right:{$H$}] (H) at (4,2,4);
\draw[ultra thick,black] (A) -- (B) -- (C) -- (D) -- (A);
\draw[ultra thick,black] (D) -- (F) -- (E) -- (C);
\draw[ultra thick,black] (B) -- (H) -- (G) -- (A);
\draw[fill=gray,opacity=0.4] (A)--(B)-- (H) -- (G);
\draw[fill=gray,opacity=0.4] (C)--(D)--(F)--(E);
\draw[fill=gray,opacity=0.4] (A)--(B)--(C)--(D)--(A);
\end{tikzpicture}
\end{document}

答案1

一种方法是使用intersections如下所示的库来查找线条从虚线变为实线的点。虚线和实线部分被绘制为单独的路径。该库在第 13.3.2 节中进行了描述任意路径的交叉点在 TikZ 手册中。

使用 AndréC 在他的回答中使用的坐标规范可以更简洁地完成此操作intersection of。正如他所说,这是旧版本 TikZ 的遗留问题,手册中没有描述。但我不知道为什么它被弃用了。

我将线条的绘制移到了多边形填充之后,否则填充会覆盖一半的线条。

在此处输入图片描述

\documentclass[a4paper]{scrartcl}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document} 
\begin{tikzpicture}[x={(-0.3cm,-0.3cm)},y={(1.2cm,0cm)}, z={(0cm,1.2cm)}]
\coordinate (O) at (0,0,0);
\coordinate[label=left:{$A$}] (A) at (-4,-2,0);
\coordinate[label=left:{$B$}] (B) at (4,2,0);
\coordinate[label=below right:{$C$}] (C) at (6,6,0);
\coordinate[label=below right:{$D$}] (D) at (-3,7,0);
\coordinate[label=right:{$E$}] (E) at (4,6,4);
\coordinate[label=above right:{$F$}] (F) at (-5,7,5);
\coordinate[label=above left:{$G$}] (G) at (2,0,6);
\coordinate[label=right:{$H$}] (H) at (4,2,4);

\draw[fill=gray,opacity=0.4] (A)--(B)-- (H) -- (G);
\draw[fill=gray,opacity=0.4] (C)--(D)--(F)--(E);
\draw[fill=gray,opacity=0.4] (A)--(B)--(C)--(D)--(A);

% the following three paths doesn't draw anything
\path [name path=BH] (B) -- (H);
\path [name path=CE] (C) -- (E);
\path [name path=AD] (A) -- (D);
% path that draws the dashed segments
\draw [dashed, ultra thick,
       % find the intersections of the named paths, then draw the two segments
       name intersections={of=BH and AD, by={bh}},
       name intersections={of=CE and AD, by={ce}}] (A) -- (bh) (ce) -- (D);

% then draw the solid line
\draw[ultra thick,black] (A) -- (B) -- (C) -- (D) (ce) -- (bh);

\draw[ultra thick,black] (D) -- (F) -- (E) -- (C);
\draw[ultra thick,black] (B) -- (H) -- (G) -- (A);

\end{tikzpicture}
\end{document}

答案2

我使用了 TikZ 版本 1.0 和 2.0 中的旧语法,它允许计算两条直线交点的坐标。

您可以在这里找到旧手册我们在哪里可以找到旧的 TikZ 和 pgf 手册?请参阅手册第 87 和 88 页1.18

您也可以使用新语法,但在这里,它没有带来任何东西。

截屏

\documentclass[a4paper]{scrartcl}
\usepackage{tikz}
\begin{document} 
\begin{tikzpicture}[x={(-0.3cm,-0.3cm)},y={(1.2cm,0cm)}, z={(0cm,1.2cm)}]
\coordinate (O) at (0,0,0);
\coordinate[label=left:{$A$}] (A) at (-4,-2,0);
\coordinate[label=left:{$B$}] (B) at (4,2,0);
\coordinate[label=below right:{$C$}] (C) at (6,6,0);
\coordinate[label=below right:{$D$}] (D) at (-3,7,0);
\coordinate[label=right:{$E$}] (E) at (4,6,4);
\coordinate[label=above right:{$F$}] (F) at (-5,7,5);
\coordinate[label=above left:{$G$}] (G) at (2,0,6);
\coordinate[label=right:{$H$}] (H) at (4,2,4);
\draw[ultra thick,black] (A) -- (B) -- (C) -- (D);% -- (A);
\draw[ultra thick,black] (D) -- (F) -- (E) -- (C);
\draw[ultra thick,black] (B) -- (H) -- (G) -- (A);
\draw[fill=gray,opacity=0.4] (A)--(B)-- (H) -- (G);
\draw[fill=gray,opacity=0.4] (C)--(D)--(F)--(E);
\draw[fill=gray,opacity=0.4] (A)--(B)--(C)--(D);%--(A);
% auxiliary point I and J
\coordinate (I) at (intersection of B--H and A--D);
\coordinate (J) at (intersection of C--E and A--D);
\draw [dashed,thick](A)--(I)(J)--(D);
\draw [ultra thick](I)--(J);
\end{tikzpicture}
\end{document}

相关内容