绘制两个矩形,一个在另一个上面,它们之间有一个角度

绘制两个矩形,一个在另一个上面,它们之间有一个角度

我想制作两个矩形,它们之间有一个角度,并将它们叠放在一起,我希望它们都有 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对每个想要显示的交叉点调用。

下面我把它们都展示了出来,其中标签中的第一个字母指的是蓝色矩形的交点线,第二个字母指的是绿色矩形:

在此处输入图片描述

参考文献:

最终代码:

\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}

在此处输入图片描述

有了更多(准确)的信息,我们可能会给你一个更好的答案。

相关内容