我想制作一些简单的 3D 图画,其中大部分采用骑士透视法。
我还想看看可见线条和不可见线条之间的区别。
我编写的代码是:
\documentclass{article}
\usepackage{tikz}
\usepackage{tkz-euclide}
\usetikzlibrary{calc, shadings, arrows.meta}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{center}
\begin{tikzpicture}[scale=1]
\tkzInit[ymin=-1,ymax=7.5,xmin=1,xmax=10]
\tkzClip
\tkzDefPoints{2/0/A, 7/0/B, 7/5/C, 2/5/D}
\tkzDefShiftPoint[A](30:2.5){E};
\tkzDefShiftPoint[B](30:2.5){F};
\tkzDefShiftPoint[C](30:2.5){G};
\tkzDefShiftPoint[D](30:2.5){H};
\tkzDrawSegments(A,B B,C C,D D,A F,G G,H B,F D,H C,G);
\tkzDrawSegments[thick](C,E);
\tkzDrawSegments[dashed](A,E E,F E,H);
\tkzDrawPolygon[fill=red!50, opacity=.4](A,F,H);
%\tkzDrawPoints(A,B,C,D,E,F,G,H);
\tkzLabelPoints[above](C,D,G,H);
\tkzLabelPoints[below](A,B,E,F);
\end{tikzpicture}
\end{center}
\begin{center}
\begin{tikzpicture}[scale=1]
\tkzInit[ymin=-1,ymax=7.5,xmin=1,xmax=10]
\tkzDefPoints{2/0/A, 8/0/B, 10/3/C, 4/3/D}
\tkzDefShiftPoint[A](90:1.3){E};
\tkzDefShiftPoint[B](90:1.3){F};
\tkzDefShiftPoint[C](90:1.3){G};
\tkzDefShiftPoint[D](95:1.3){H};
\tkzInterLL(E,F)(A,D) \tkzGetPoint{I};
\tkzInterLL(G,F)(C,D) \tkzGetPoint{J};
\tkzDrawPolygon(A,B,C,D);
\tkzDrawPolygon(E,F,G,H);
\tkzDrawSegments[dashed,white](I,D D,J);
\tkzLabelPoints[above](C,D,G,H);
\tkzLabelPoints[below](A,B,E,F);
\end{tikzpicture}
\end{center}
\end{document}
生成这个:
我的问题:
1)是否有一个软件包可以制作这些图画?
2) 如果没有,是否有另一种方法可以制作第二张图中的“隐形”线条,因为仔细观察,您会看到一些细小的黑线。
我知道我可以写这个,但是我感觉这不是一种非常“LaTeX”的方式......
\tkzDrawSegments[white,thick](I,D D,J);
\tkzDrawSegments[dashed](I,D D,J);
答案1
对于你的第一个问题,tikz 是我所知道的最好的工具(或者 tkz-euclide 也是)。也许其他人知道更好的东西。
对于另一个问题。我建议你避免画虚线超过黑线。只画黑色虚线。像这样:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}[line cap=round, line join=round]
\tkzDefPoints{2/0/A, 8/0/B, 10/3/C, 4/3/D}
\tkzDefShiftPoint[A](90:1.3){E};
\tkzDefShiftPoint[B](90:1.3){F};
\tkzDefShiftPoint[C](90:1.3){G};
\tkzDefShiftPoint[D](90:1.3){H};
\tkzInterLL(E,F)(A,D) \tkzGetPoint{I};
\tkzInterLL(G,F)(C,D) \tkzGetPoint{J};
\tkzDrawSegments(I,A A,B B,C C,J);
\tkzDrawPolygon(E,F,G,H);
\tkzDrawSegments[dashed](I,D D,J);
\tkzLabelPoints[above](C,D,G,H);
\tkzLabelPoints[below](A,B,E,F);
\end{tikzpicture}
\end{document}