Tikz:在矩形边缘之间画线

Tikz:在矩形边缘之间画线

下面的代码

\documentclass[tikz,border=1mm]{standalone}
    \usepackage{tikz}
    \begin{document}   
    \newcommand{\opacity}{0.6}      
        \begin{tikzpicture}                             
        \draw[xshift=1cm,fill=gray,draw=black,opacity=\opacity] 
        (0,0) -- (3,3) -- (3.2,3) -- (0.2,0) -- (0,0);
        \draw[xshift=2cm,fill=gray,draw=black,opacity=\opacity] 
        (0,0) -- (2,2) -- (2.2,2) -- (0.2,0) -- (0,0);  
        \draw[xshift=3cm,fill=gray,draw=black,opacity=\opacity] 
        (0,0) -- (1,1) -- (1.2,1) -- (0.2,0) -- (0,0);        
        \end{tikzpicture}      
    \end{document}

产生以下输出:

在此处输入图片描述

如何用线连接矩形的边缘?我不想使用坐标 ( \draw (0,0) -- (2,2)),而是使用类似

\draw (rectangle1.north east) -- (rectangle2.north west)

如果有如下解决方案就更好了:

\draw (A1)(0,0) -- (B1)(1,1) -- (C1)(1.2,1) -- (D1)(0.2,0) -- (E1)(0,0);
\draw (A2)(0,0) -- (B2)(1,1) -- (C2)(1.2,1) -- (D2)(0.2,0) -- (E2)(0,0);
\draw (A1) -- (C2)

答案1

像这样吗?

\documentclass[tikz,border=1mm]{standalone}
    \usepackage{tikz}
    \begin{document}   
    \newcommand{\opacity}{0.6}      
        \begin{tikzpicture}                             
        \draw[xshift=1cm,fill=gray,draw=black,opacity=\opacity] 
        (0,0)coordinate(A1) -- (3,3)coordinate(A2) -- (3.2,3)coordinate(A3) -- (0.2,0) coordinate(A4) -- cycle;
        \draw[xshift=2cm,fill=gray,draw=black,opacity=\opacity] 
        (0,0)coordinate(B1) -- (2,2)coordinate(B2) -- (2.2,2)coordinate(B3) -- (0.2,0)coordinate(B4) -- cycle;  
        \draw[xshift=3cm,fill=gray,draw=black,opacity=\opacity] 
        (0,0)coordinate(C1) -- (1,1) coordinate(C2)-- (1.2,1)coordinate(C3) -- (0.2,0)coordinate(C4) -- cycle; 

        \draw(A4)--(B1);
        \draw(B4)--(C1);
        \draw(A3)--(B3)--(C3);

        \end{tikzpicture}      
    \end{document}

使用 foreach 循环更新

\documentclass[tikz,border=1mm]{standalone}
    \usepackage{tikz}
    \begin{document}   
    \newcommand{\opacity}{0.6}      
        \begin{tikzpicture}

        \foreach \xs/\p/\x in{1/A/3,2/B/2,3/C/1}
        {\draw[xshift=\xs cm,fill=gray,draw=black,opacity=\opacity]
        (0,0)coordinate(\p1)
        --(\x,\x)coordinate(\p2)
        --(\x+0.2,\x)coordinate(\p3)
        --(0.2,0)coordinate(\p4)
        --cycle;}

   \draw(A4)--(B1);
   \draw(B4)--(C1);
   \draw(A3)--(B3)--(C3);

        \end{tikzpicture}      
    \end{document}

在此处输入图片描述

答案2

据我了解,如果给出了两个坐标,则整个形状是固定的。您的形状不是矩形,而是梯形,并且有预定义的形状可用。

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{tikzpicture}[my trapez/.style={trapezium,%inner xsep=0pt,inner ysep=0pt,
trapezium left angle=135, trapezium right angle=45,rotate=45,
minimum width={#1*sqrt(2)*1cm},minimum height={sqrt(2)*1mm},draw,fill=gray,
 trapezium stretches body,anchor=west}]
\node[my trapez=3]  (L)    at (1,0) {};
\node[my trapez=2]  (M)    at (2,0) {};
\node[my trapez=1]  (R)    at (3,0) {};
\draw ([xshift=-sqrt(2)*1mm]L.west) -- ([xshift=sqrt(2)*1mm]R.west); 
\draw ([xshift=sqrt(2)*1mm]L.east) -- ([xshift=sqrt(2)*1mm]R.east); 
\end{tikzpicture}
\end{document}

在此处输入图片描述

如您所见,这种方法存在两个小问题:

  1. 至少对于这种形状来说,精确控制尺寸并非易事;
  2. 要精确指定位置,您需要思考一下。(Zarko 的回答也很不错。)

因此,我想提出一种不同的路线,您可以绘制和填充物品作为装饰,同时还可以命名坐标。

\documentclass[tikz,border=1mm]{standalone}
\usetikzlibrary{decorations.pathreplacing}
\tikzset{trapez width/.initial=0.2cm,
my trapez/.style={decorate,decoration={
show path construction,
lineto code={\filldraw
(\tikzinputsegmentfirst) coordinate(#1-south west) 
-- (\tikzinputsegmentlast) coordinate(#1-north west)
-- ([xshift=\pgfkeysvalueof{/tikz/trapez width}]\tikzinputsegmentlast)
coordinate(#1-north east)
-- ([xshift=\pgfkeysvalueof{/tikz/trapez width}]\tikzinputsegmentfirst)
coordinate(#1-south east) -- cycle;
}}}}

\begin{document}   
  \begin{tikzpicture}
   \begin{scope}[fill=gray,opacity=0.6]
    \draw[my trapez=L] (1,0) -- (4,3);
    \draw[my trapez=M] (2,0) -- (4,2);
    \draw[my trapez=R] (3,0) -- (4,1);
   \end{scope}
   \draw (L-north east) --  (R-north east)
   (L-south west) --    (R-south east);
    \end{tikzpicture}      
\end{document}

在此处输入图片描述

现在您实际上只需要指定两个坐标,它们将成为精确命名的坐标。

答案3

让我详细说明一下我的评论:

  • 对于您在 mwe 中展示的绘制的形状,这是不可能的
  • 这些形状没有定义的名称或锚点。
  • 您可以通过使用每个形状角的坐标来实现这一点,但这会导致相当复杂的代码。例如对于第一个形状:

    \draw[myshape] (0,0) coordinate (A1) -- 
                   (3,3) coordinate (A2) -- 
                   (3.2,3) coordinate (A3) -- 
                   (0.2,0) coordinate (A4) -- cycle; 
    

    然后画出来例如

    \draw (A1) -- (A3);
    
  • 简化此代码扩展的一种方法可以使用小图片:(\pic有关详细信息,请参阅第章18 张图片:路径上的小图片Tikz 和 PGF 手册,v 3.0.1a,第 251 页):

    \documentclass[tikz,border=3mm]{standalone}
    
    \begin{document}
        \begin{tikzpicture}[
    pics/myshape/.style = {code={ % definition of your shape
        \draw[fill=gray,opacity=\opacity]
            ( 0.0,0) coordinate (-1) -- ++  % south west
            ( 0.2,0) coordinate (-2) -- ++  % south east
            (#1,#1)  coordinate (-3) -- ++  % north east, coordinate is determined by parameter #1
            (-0.2,0) coordinate (-4) --     % north west
            cycle;}}
                           ]
    \def\opacity{0.6}
    \pic (A) [above right] at (0,0) {myshape={3}}; % "3" is parameter which define size of shape
    \pic (B) [above right] at (1,0) {myshape={2}};
    \pic (C) [above right] at (2,0) {myshape={1}};
    \draw[very thin, red, densely dashed]
        (A-3) -- (B-3); % instead of \draw (rectangle1.north east) -- (rectangle2.north west).
        \end{tikzpicture}
    \end{document}
    
  • 对于坐标名称,您可以选择更有意义的名称。例如,可能-1更适合的是-sw,它可以将您与“西南”等联系起来。

在此处输入图片描述

相关内容