我想制作两个矩形,它们之间有一个角度,并将它们叠放在一起,我希望它们都有 4 或 5 条垂直线,并在两个矩形相交处突出显示一个点。我刚开始使用 tikz/pgf,所以我不确定如何执行任何这些操作(图像是在 inkscape 中制作的,而不是 tikz)。
下面是我想要实现的目标的图像:
但没有垂直线。如果有人有类似的东西,或者对整个过程有一些建议,我将不胜感激。
答案1
1.基本绘图:
您可以使用scope
并对外部矩形应用变换:
代码:
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\newcommand{\Width}{3}
\newcommand{\Height}{5}
\begin{document}
\begin{tikzpicture}
\draw [fill=green] (0,0) rectangle (\Width,\Height);
\begin{scope}[rotate=20, xshift=1cm, yshift=-0.75cm]
\draw [fill=blue] (0,0) rectangle (\Width,\Height);
\end{scope}
\end{tikzpicture}
\end{document}
2.垂直线:
好的,这样就得到了两个矩形,这很容易。但是垂直线呢?
由于我不确定您想要多少行,并且知道规格经常变化,我们最好定义一个常数\NumberOfVericalLines
。然后只需逐步浏览并绘制它们即可:
\pgfmathsetmacro{\DeltaX}{\Width/\NumberOfVericalLines}%
\foreach \x in {0,...,\NumberOfVericalLines} {
\pgfmathsetmacro{\NewX}{\DeltaX*\x}
\draw (\NewX,0) -- (\NewX,\Height);
}
得出:
但是等一下,其他线条在哪里?看起来它们在蓝色矩形后面,因此添加fill opacity=0.5
会显示背景中的线条:
代码:
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\Width}{3}
\newcommand{\Height}{5}
\newcommand{\NumberOfVericalLines}{4}
\begin{document}
\begin{tikzpicture}
\draw [fill=green] (0,0) rectangle (\Width,\Height);
\pgfmathsetmacro{\DeltaX}{\Width/\NumberOfVericalLines}%
\foreach \x in {0,...,\NumberOfVericalLines} {
\pgfmathsetmacro{\NewX}{\DeltaX*\x}
\draw (\NewX,0) -- (\NewX,\Height);
}
\begin{scope}[rotate=20, xshift=1cm, yshift=-0.75cm, fill opacity=0.5]
\draw [fill=blue] (0,0) rectangle (\Width,\Height);
\end{scope}
\end{tikzpicture}
3.矩形宏:
由于我们也希望另一个矩形有类似的线条,我们可能应该定义一个宏,这样我们就不会重复代码:
\newcommand*{\Rectangle}[4][]{%
% #1 = draw/fill options
% #2 = witdh
% #3 = height
% #4 = number of vertical lines
\draw [#1] (0,0) rectangle (#2,#3);
\pgfmathsetmacro{\DeltaX}{#2/#4}%
\foreach \x in {0,...,#4} {
\pgfmathsetmacro{\NewX}{\DeltaX*\x}
\draw (\NewX,0) -- (\NewX,#3);
}
}
现在,只需使用:
\begin{tikzpicture}
\Rectangle[fill=green]{\Width}{\Height}{\NumberOfVericalLines}
\begin{scope}[rotate=20, xshift=1cm, yshift=-0.75cm, fill opacity=0.5]
\Rectangle[fill=blue]{\Width}{\Height}{\NumberOfVericalLines}
\end{scope}
我们得到所有的垂直线:
4. 交叉路口:
好的,现在来谈谈最困难的部分,即交叉点。
为此,我们需要合并 \usetikzlibrary{intersections}
,并命名每条垂直线。当然,这意味着我们需要更改宏以接受另一个参数,即命名垂直线的前缀。
\newcounter{Counter}
\newcommand*{\Rectangle}[5][]{%
% #1 = draw/fill options
% #2 = prefix for path name
% #3 = width
% #4 = height
% #5 = number of vertical lines
\draw [#1] (0,0) rectangle (#3,#4);
\pgfmathsetmacro{\DeltaX}{#3/#5}%
\foreach [count=\xi] \x in {0,...,#5} {
\pgfmathsetmacro{\NewX}{\DeltaX*\x}
\setcounter{Counter}{\xi}%
\expandafter\xdef\csname PathName#2\Alph{Counter}\endcsname{#2-\x}
\draw [name path global=\csname PathName#2\Alph{Counter}\endcsname]
(\NewX,0) -- (\NewX,#4);
}
}
这定义了\PathNameTopA...\PathNameTopE
,并且\PathNameBottomA...\PathNameBottomE
对于每条垂直线的名称,然后我们只需要\ShowIntersection
对每个想要显示的交叉点调用。
下面我把它们都展示了出来,其中标签中的第一个字母指的是蓝色矩形的交点线,第二个字母指的是绿色矩形:
参考文献:
\ShowIntersection
来自 PGFplot 维度过大/域和范围减少后 TeX 容量超出范围。- 请
name path global
参阅PGFplot 中的交叉点。
最终代码:
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{intersections}
\newcommand{\Width}{3}
\newcommand{\Height}{5}
\newcommand{\NumberOfVerticalLines}{4}
\newcounter{Counter}
\newcommand*{\Rectangle}[5][]{%
% #1 = draw/fill options
% #2 = prefix for path name
% #3 = width
% #4 = height
% #5 = number of vertical lines
\draw [#1] (0,0) rectangle (#3,#4);
\pgfmathsetmacro{\DeltaX}{#3/#5}%
\foreach [count=\xi] \x in {0,...,#5} {
\pgfmathsetmacro{\NewX}{\DeltaX*\x}
\setcounter{Counter}{\xi}%
\expandafter\xdef\csname PathName#2\Alph{Counter}\endcsname{#2-\x}
\draw [name path global=\csname PathName#2\Alph{Counter}\endcsname]
(\NewX,0) -- (\NewX,#4);
}
}
% https://tex.stackexchange.com/questions/24781/pgfplot-dimension-too-large-tex-capacity-exceeded-after-reduction-in-domain-and
% https://tex.stackexchange.com/questions/21408/intersections-in-pgfplots
\newcommand*{\ShowIntersection}[3]{
\fill
[name intersections={of=#1 and #2, name=i, total=\t}]
[brown, opacity=1, every node/.style={black, opacity=1}]
\foreach \s in {1,...,\t}{(i-\s) circle (3pt)
node [above left, red] {#3}};
}
\begin{document}
\begin{tikzpicture}
\Rectangle[fill=green!30]{Bottom}{\Width}{\Height}{\NumberOfVerticalLines}
\begin{scope}[rotate=20, xshift=1cm, yshift=-0.75cm, fill opacity=0.5]
\Rectangle[fill=blue!60]{Top}{\Width}{\Height}{\NumberOfVerticalLines}
\end{scope}
\ShowIntersection{\PathNameTopA}{\PathNameBottomA}{aa}
\ShowIntersection{\PathNameTopA}{\PathNameBottomB}{ab}
\ShowIntersection{\PathNameTopB}{\PathNameBottomB}{bb}
\ShowIntersection{\PathNameTopB}{\PathNameBottomC}{bc}
\ShowIntersection{\PathNameTopC}{\PathNameBottomC}{cc}
\ShowIntersection{\PathNameTopC}{\PathNameBottomD}{cd}
\ShowIntersection{\PathNameTopD}{\PathNameBottomD}{dd}
\ShowIntersection{\PathNameTopD}{\PathNameBottomE}{de}
\ShowIntersection{\PathNameTopE}{\PathNameBottomE}{ee}
\end{tikzpicture}
\end{document}
答案2
这是另一种解决方案。这个问题不太好,因为我们不了解上下文以及绘画的基础知识。绘制矩形有很多种方法。当然,第一种方法是 Peter 提供的,rectangle
但是如果您需要使用角度或对角线大小,则可以使用其他方法。下面我给出了一种使用坐标的方法。
备注:用该方法rectangle
,可以很容易地确定矩形的中心和每个顶点的坐标。
我用重心坐标绘制“垂直线”。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\path (1,2) coordinate (a)
(-1,2) coordinate (b)
(-1,-2) coordinate (c)
(1,-2) coordinate (d) ;
\draw[blue,fill=blue!40] (a) -- (b) -- (c) -- (d) -- cycle;
\begin{scope}[rotate=10]
\path (1,2) coordinate (A)
(-1,2) coordinate (B)
(-1,-2) coordinate (C)
(1,-2) coordinate (D) ;
\end{scope}
\draw[red,fill=red!40,opacity=.5] (A) -- (B) -- (C) --(D) -- cycle;
\foreach \i in {1,...,4}{
\draw[blue] (barycentric cs:a=0.2*\i,b=1-0.2*\i) -- (barycentric cs:c=1-0.2*\i,d=0.2*\i);}
\foreach \i in {1,...,4}{
\draw[red] (barycentric cs:A=0.2*\i,B=1-0.2*\i) -- (barycentric cs:C=1-0.2*\i,D=0.2*\i);}
\end{tikzpicture}
\end{document}
有了更多(准确)的信息,我们可能会给你一个更好的答案。