以下是我 18 个多小时前发布的问题的精炼形式。
我是 Tikz 的新手。然而,尽管我对 TikZ 了解甚少,但我确实欣赏它比我以前使用过的其他图形软件包的优势。
我想创建一个 TikZ 节点样式,可以生成下图所示的图表。我已经使用 Xfig 绘制了它。但是,我想使用 TikZ 以更灵活的方式绘制它。以下约束与图表有关:
- 矩形结构左侧和右侧的圆弧是半圆 - 每个圆弧的半径为底层矩形高度的一半。
- 结构内部的两个三角形相似。
- 每个三角形都是等腰三角形,其顶点位于与矩形结构顶部和底部边缘平行的中心线上。
- 三角形的尺寸是矩形结构高度的固定分数。
- 填充三角形的底边位于(假想的)内部矩形的左边缘;第二个三角形的底边位于(假想的)内部矩形的右边缘。
我可以自由更改的唯一参数是锚点的位置、矩形结构的高度和宽度。我需要知道如何访问高度和宽度参数,并将它们用于计算结构的其他参数。
一些有经验的 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}