我有一个使用 TikZ 的正多边形,如下所示:
\begin{tikzpicture}
\node[regular polygon, regular polygon sides=5, shape border rotate=-18, fill=blue!20, minimum size=5cm, thick, draw] (Funfeck) {};
\coordinate (P1) at (Funfeck.corner 1);
\coordinate (P2) at (Funfeck.corner 2);
\coordinate (P3) at (Funfeck.corner 3);
\coordinate (P4) at (Funfeck.corner 4);
\coordinate (P5) at (Funfeck.corner 5);
...
\end{tikzpicture}
在另一个地方,我想要一个由点P5
、P1
和组成的三角形P2
。
它看起来应该是这样的:,因此文档中这些多边形所在的部分应如下所示: 该代码将是这样的:
\draw (P5) -- (P1) -- (P2) -- (P5) -- cycle;
但是,由于此代码位于完全不同的地方,此代码位于不同位置tikzpicture
,因此我无法访问坐标。
现在,我有四点解决建议:
首先:(我最喜欢的)我不用画五边形就可以得到这些坐标。这样做的好处是,如果我下次遇到同样的问题,我就不需要在其他地方画这个图形了。
就像这样:
\coordinate (P1) at (\node[regular polygon, regular polygon sides=5, shape border rotate=-18, minimum size=5cm].corner 1);
\coordinate (P2) at (\node[regular polygon, regular polygon sides=5, shape border rotate=-18, minimum size=5cm].corner 1);
\coordinate (P5) at (\node[regular polygon, regular polygon sides=5, shape border rotate=-18, minimum size=5cm].corner 1);
\draw (P5) -- (P1) -- (P2) -- (P5) -- cycle;
第二:另一种可能性是从另一个中获取坐标tikzpicture
。
我的意思是这样的:
\coordinate (P1) at (tikzpicture[0].coordinate.P1);
\coordinate (P2) at (tikzpicture[0].coordinate.P2);
\coordinate (P5) at (tikzpicture[0].coordinate.P5);
\draw (P5) -- (P1) -- (P2) -- (P5) -- cycle;
第三:另一个解决方案,我一直在争论的是绘制多边形,获取坐标,然后删除多边形。事实上,我可以在不带draw
和 的情况下创建节点fill=blue!20
,但这样仍然会有一个空白。
我的意思是这样的:
\node[regular polygon, regular polygon sides=5, shape border rotate=-18, minimum size=5cm, draw] (Funfeck) {};
\coordinate (P1) at (Funfeck.corner 1);
\coordinate (P2) at (Funfeck.corner 2);
\coordinate (P3) at (Funfeck.corner 3);
\coordinate (P4) at (Funfeck.corner 4);
\coordinate (P5) at (Funfeck.corner 5);
\remove {Funfeck}
\draw (P5) -- (P1) -- (P2) -- (P5) -- cycle;
第四:如果其他方法都行不通,最糟糕的解决方案就是打印坐标并手动插入它们3。但我甚至还没有找到这样做的方法:
我的伪代码是:
\begin{tikzpicture}
\node[regular polygon, regular polygon sides=5, shape border rotate=-18, fill=blue!20, minimum size=5cm, thick, draw] (Funfeck) {};
\coordinate (P1) at (Funfeck.corner 1);
\coordinate (P2) at (Funfeck.corner 2);
\coordinate (P3) at (Funfeck.corner 3);
\print("P1, x: "+P1.X+" .P1, y: "+P1.Y);
\print("P2, x: "+P2.X+" .P2, y: "+P2.Y);
\print("P3, x: "+P3.X+" .P3, y: "+P3.Y);
...
\end{tikzpicture}
...
\coordinate (P1) at (manually inserted, manually inserted);
\coordinate (P2) at (manually inserted, manually inserted);
\coordinate (P3) at (manually inserted, manually inserted);
有人能告诉我如何解决这个问题吗?
非常感谢:)。
答案1
您可以使用overlay
选项node
,那么它将不会被考虑用于边界框的计算。
或者,使用极坐标计算坐标。
\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{tikzpicture}
\node[
regular polygon,
regular polygon sides=5,
shape border rotate=-18,
minimum size=5cm,
overlay % overlay option means the node isn't included in the calculation of the bounding box
] (P) {};
\draw (P.corner 5) -- (P.corner 1) -- (P.corner 2) -- cycle;
% or do as you did, and make new coordinates
%\coordinate (P1) at (Funfeck.corner 1);
%\coordinate (P2) at (Funfeck.corner 2);
%\coordinate (P3) at (Funfeck.corner 3);
%\coordinate (P4) at (Funfeck.corner 4);
%\coordinate (P5) at (Funfeck.corner 5);
%\draw (P5) -- (P1) -- (P2) -- cycle;
\end{tikzpicture}
% example using polar coordinates
\begin{tikzpicture}
\foreach \N in {1,...,5}
\coordinate (P\N) at ({360/5*(\N-1)+90-18}:2.5cm);
\draw (P1) -- (P2) -- (P5) -- cycle;
\end{tikzpicture}
\end{document}
第二个版本可以通过定义宏来概括。灵感来自 Ryan Reich 对如何创建带有键值的命令?,下面的代码显示了一种可能的实现。
单独使用时,将通过\myregpolygon
定义坐标,表示一个正五边形,其“半径”为 1cm,以点 为中心,第一个点的角度为零。这些参数中的每一个都可以使用宏的可选参数中的键值对进行修改:P1
P5
(0,0)
\myregpolygon[%
radius=3cm, % radius of circumscribed circle
origin={(3,2)}, % center point
start angle=90, % angle of first coordinate
name=Q, % prefix for coordinate names
sides=4 % sides for the polygon
]
当然,没必要一下子重新定义一切。
\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\pgfkeys{
regpoly/.is family,
/regpoly,
default/.style={
radius=1cm,
start angle=0,
origin={(0,0)},
sides={5},
name={P}
},
radius/.estore in=\RPradius,
start angle/.estore in=\RPstartangle,
origin/.estore in=\RPorigin,
sides/.estore in=\RPsides,
name/.estore in=\RPname,
}
\newcommand\myregpolygon[1][]{
\pgfkeys{/regpoly,default, #1}
\foreach \N in {1,...,\RPsides}
\coordinate [shift=\RPorigin] (\RPname\N) at ({360/\RPsides*(\N-1)+\RPstartangle}:\RPradius);
}
\begin{document}
\begin{tikzpicture}
\myregpolygon[start angle=72,radius=2.5cm]
\draw (P1) -- (P2) -- (P5) -- cycle;
\end{tikzpicture}
\end{document}