TikZ 中是否有一种方法可以沿着每条被视为镜像的边来反射任意数量边的正多边形?
我正在使用 MacTeX,并且还不熟悉 LaTeX、pgf 和 TikZ。
我想这样做来演示可以使用反射完成的几何构造,其中多边形具有任意数量的边。
对于某些多边形(例如三角形和六边形),可以迭代生成平面的镶嵌。(其他人询问过六边形镶嵌等。)
理想情况下,我希望能够简单地引用一条边,生成一条与之重合的线,并将该线作为参数提供给子程序,该子程序可以沿着通过该边的线执行多边形的反射。
这种反射可以通过旋转和平移来模拟,但我想完全避免平移(以及(x,y)
坐标系中甚至极坐标系中的平移距离计算)。这是为了让代码也成为构造原理的演示,而不仅仅是图形。对于边数为奇数的多边形n
,平移之前需要旋转180/n
;对于边数为偶数的多边形,不需要进行这样的旋转。
我尝试引用叠加结构的节点来重新居中有效反射的多边形,但我的引用似乎不起作用。我还尝试了我认为是基于径向坐标系的平面坐标(有序对),这是我从一个示例中得到的,但它们在我的代码中没有按预期工作。
答案1
shapes.geometric
加载库后,可以使用类似于五边形的方法来绘制正多边形\node (<name>) [regular polygon, regular polygon sides=5, draw] {}
。多边形的角为(<name>.corner <n>)
,边的中点为(<name>.side <n>)
。
为了沿着与边重合的线反映角,您可以使用两个 TikZ 函数的组合:语法let
(允许您在宏中临时存储点)和calc
库(您可以使用它执行坐标计算)。
这是一个五边形,其角已标记:
\node (A) [draw,regular polygon, regular polygon sides=5, minimum size=2cm,outer sep=0pt] {};
\foreach \n in {1,...,5} {
\node at (A.corner \n) [anchor=360/5*(\n-1)+270] {\scriptsize\texttt{A.corner \n}};
}
现在假设你想将角 4 镜像到通过角 1 和角 2 的线上。TikZ 不直接提供镜像操作,但你可以使用投影语法来实现。坐标计算表达式被 包围($...$)
,投影语法是(<first coordinate)!(<projection coordinate>)!(<second coordinate>)
,因此角 4 在通过角 1 和角 2 的线上的投影可以表示为
($(A.corner 1)!(A.corner 4)!(A.corner 2)$)
如果我们称该点为Q
,则角 4(我们称该点为 )的反射C4
可以表示为C4' = Q - (C4 - Q) = 2*Q - C4
。在 TikZ 符号中,这看起来像
($ 2*($(A.corner 1)!(A.corner 4)!(A.corner 2)$) - (A.corner 4) $)
为了对多边形的所有角执行此操作,我们可以使用循环\foreach
。为了使代码更具可读性,可以使用语法将点A.corner 1
和A. corner 2
保存到临时宏中let
。最后,整个东西可以包装成 TikZ 样式。
线条
\node (A) [polygon=5, thick] {};
\draw [blue,mirror polygon=1];
\draw [orange,mirror polygon=2];
\draw [red,mirror polygon=3];
\draw [cyan,mirror polygon=4];
\draw [purple,mirror polygon=5];
将产生
和线条
\node (A) [polygon=3, thick] {};
\draw [blue,mirror polygon=1];
\draw [orange,mirror polygon=2];
\draw [red,mirror polygon=3];
将产生
完整代码如下:
\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, calc}
\begin{document}
\begin{tikzpicture}
\tikzset{
polygon n/.code=\gdef\polygonN{#1}, % Save N in a global macro
polygon/.style={
regular polygon,
regular polygon sides=#1,
polygon n=#1,
draw,
minimum size=2cm,
outer sep=0pt
},
mirror polygon/.style={
insert path={
let \p1 = (A.corner #1),
\p2 = (A.side #1) in (\p1)
($ 2*($(\p1)!(A.corner 1)!(\p2)$) - (A.corner 1) $) % Path needs to be started before the foreach
\foreach \n in {2,...,\polygonN} {
-- ($ 2*($(\p1)!(A.corner \n)!(\p2)$) - (A.corner \n) $)
} -- cycle
}
}
}
\node (A) [polygon=5, thick] {};
\draw [blue,mirror polygon=1];
\draw [orange,mirror polygon=2];
\draw [red,mirror polygon=3];
\draw [cyan,mirror polygon=4];
\draw [purple,mirror polygon=5];
\end{tikzpicture}
\end{document}
答案2
运行texdoc pst-cox
以查看创建正多胞形的文档。一个简单的示例,运行xelatex
:
\documentclass{minimal}
\usepackage{pst-coxcoor}
\begin{document}
\begin{pspicture}(-4,-4)(4,4)
\CoxeterCoordinates[linewidth=0.1mm,choice=33]
\end{pspicture}
\end{document}
答案3
如同杰克的 解决方案但是我的qrr.trans
图书馆([1],[2])。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric,qrr.trans}
\tikzset{
reg poly/.style={shape=regular polygon, regular polygon sides={#1}, outer sep=+0pt}}
\tikzset{
unreg poly/.style={/utils/exec=\def\myPolygonCounter{1},
@unreg poly/.list={#1,(unreg poly-corner 1)}, insert path={-- cycle}},
@unreg poly/.style={
insert path={coordinate (unreg poly-corner \myPolygonCounter)
-- coordinate[midway] (unreg poly-side \myPolygonCounter) #1},
/utils/exec=\pgfmathtruncatemacro\myPolygonCounter{\myPolygonCounter+1}},
unreg poly*/.style={
@unreg poly*/.list={#1},
insert path={-- cycle}},
@unreg poly*/.style={insert path={-- #1}}}
\tikzset{every picture/.append style={line join=round,thick}}
\begin{document}
\begin{tikzpicture}
\node[reg poly=5, minimum size=+2cm, draw, very thick] (a) {};
\foreach \i[evaluate={\col=(\i-1)/.04}] in {1,...,5}
\node [mirror=(a.corner \i)--(a.side \i), transform shape,
reg poly=5, minimum size=+2cm, draw=red!\col!blue] {};
\end{tikzpicture}
\begin{tikzpicture}
\draw[very thick] (0,0) [unreg poly={(1,1), (2,-.5), ++(south west:1), ++(left:1)}];
%\foreach \i[evaluate={\col=(\i-1)/.04}] in {1,...,5}
% \draw[red!\col!blue, mirror=(unreg poly-corner \i)--(unreg poly-side \i)]
% (0,0) [unreg poly*={(1,1), (2,-.5), ++(south west:1), ++(left:1)}];
\foreach \i[evaluate={\col=(\i-1)/.04}] in {1,...,5}
\draw[red!\col!blue, m/.style={mirror=(unreg poly-corner \i)--(unreg poly-side \i)}]
([m]unreg poly-corner 1) \foreach\j in {2,...,5}{-- ([m]unreg poly-corner \j)} -- cycle;
\end{tikzpicture}
\end{document}