如何获取 TikZ 节点的大小参数?

如何获取 TikZ 节点的大小参数?

以下是我 18 个多小时前发布的问题的精炼形式。

我是 Tikz 的新手。然而,尽管我对 TikZ 了解甚少,但我确实欣赏它比我以前使用过的其他图形软件包的优势。

我想创建一个 TikZ 节点样式,可以生成下图所示的图表。我已经使用 Xfig 绘制了它。但是,我想使用 TikZ 以更灵活的方式绘制它。以下约束与图表有关:

  1. 矩形结构左侧和右侧的圆弧是半圆 - 每个圆弧的半径为底层矩形高度的一半。
  2. 结构内部的两个三角形相似。
  3. 每个三角形都是等腰三角形,其顶点位于与矩形结构顶部和底部边缘平行的中心线上。
  4. 三角形的尺寸是矩形结构高度的固定分数。
  5. 填充三角形的底边位于(假想的)内部矩形的左边缘;第二个三角形的底边位于(假想的)内部矩形的右边缘。

我可以自由更改的唯一参数是锚点的位置、矩形结构的高度和宽度。我需要知道如何访问高度和宽度参数,并将它们用于计算结构的其他参数。

一些有经验的 TikZ 和 PGF 用户能否帮助我?

谢谢。

在此处输入图片描述

答案1

这是不完全可靠的节点构造的一种可能性。三角形也可以通过(<nodename>-leftri)和访问(<nodename>-rightri)。可能的失败原因是节点旋转。可以包含这一点,但在这个阶段它不必要地复杂,我不知道您是否需要它。

\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric}

\begin{document}

\begin{tikzpicture}[mynode/.style args={#1 and #2}{
draw,
minimum height=#1,
minimum width=#2,
rounded corners=0.5*#1,
append after command={
\pgfextra{%                 
    \begin{pgfinterruptpath}
    \node[isosceles triangle,
          isosceles triangle stretches,
          draw=black,inner sep=0,
          anchor=west,
          minimum width=0.5*#1,
          minimum height=0.2*#1,
          fill=black] 
          (\tikzlastnode-leftri) at ([xshift=0.5*#1]\tikzlastnode.west) {};
    \node[isosceles triangle,
          isosceles triangle stretches,
          draw=black,inner sep=0,
          anchor=west,
          minimum width=0.5*#1,
          minimum height=0.2*#1,
          isosceles triangle apex angle=90]
          (\tikzlastnode-rightri) at ([xshift=-0.5*#1]\tikzlastnode.east) {};
\end{pgfinterruptpath}
        }   
    }
}
]

\node[mynode=1cm and 4cm] (a) {};
\node[mynode=3cm and 8cm] (b) at (0,3) {};
\draw (a-leftri) -- (b-rightri);
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

我考虑过采用面向对象方法解决这个问题的可能性。下面是我编写的代码。它绘制了矩形轮廓和填充三角形(只需再多花一点功夫,我就可以包含未填充的三角形)。

代码可以运行,并允许我间接更改高度和宽度参数。程序按照我的预期运行。

然而,我仍然觉得这种风格会给我带来更多的灵活性;并且可能包含更加优雅的代码。

有什么帮助吗?

\pgfooclass{MyRectangle}{
% This is class Myrectangle:
\method MyRectangle(#1,#2,#3,#4,#5,#6) { % The constructor
    % (#1,#2) the SW anchor point.
    % (#3,#4) the NE anchor point.
    % #5*(#4-#2) the base of the triangles (oriented vertically).
    % #6*(#4-#2) the height of the triangles (oriented horizontally).
    \draw (#1,#2) -- (#3,#2) arc (-90:90:0.5*#4-0.5*#2) -- (#1,#4)
        arc (90:270:0.5*#4-0.5*#2);
    \coordinate (B) at (#1,#2+0.5*#4-0.5*#2-0.5*#5*#4-0.5*#5*#2);
    \coordinate (C) at (#1+#6*#4-#6*#2,#2+0.5*#4-0.5*#2);
    \coordinate (D) at (#1,#2+0.5*#4-0.5*#2+0.5*#5*#4-#5*#2);
    \fill (B) -- (C) -- (D);
    }
}

\begin{tikzpicture}
\pgfoonew \myFigure=new MyRectangle(0,0,2,0.5,0.4,0.3);
\end{tikzpicture}

答案3

@percusse,这是我对你的代码的完整改编。它使(整个)结构能够像刚体一样旋转。

非常感谢您发布的解决方案。

\tikzset{Hrect/.style args={#1; #2; #3deg; #4; #5deg}{
    outer sep=0,
    draw=#4,%
    rotate=#5,
    minimum height=#1,%
    minimum width=#2,%
    rounded corners=0.5*#1,%
    /.default=black,%
    append after command={%
        \pgfextra{%
            \begin{pgfinterruptpath}%
                \node[  isosceles triangle,%
                        rotate = #5,
                        inner sep=0,%
                        anchor=west,%
                        minimum width=0.3*#1,%
                        minimum height=0.3*#1,%
                        isosceles triangle apex angle=#3,%
                        fill=#4] at ([xshift=0.5*#1*cos(#5),yshift=0.5*#1*sin(#5)]
                            \tikzlastnode.west) {};%
                \node[  isosceles triangle,%
                        rotate=#5,
                        inner sep=0,%
                        anchor=east,%
                        minimum width=0.3*#1,%
                        minimum height=0.3*#1,%
                        isosceles triangle apex angle=#3,%
                        draw=#4] at ([xshift=-0.5*#1*cos(#5),yshift=-0.5*#1*sin(#5)]
                            \tikzlastnode.east) {};%
            \end{pgfinterruptpath}%
            }
        }
    }
}

\begin{tikzpicture}
    \node (a) [Hrect = 0.3cm; 1.5cm; 67deg; blue; 45deg,anchor=south west]
\end{tikzpicture}

在此处输入图片描述

相关内容