写在前面

前面介绍了一些关于基本图形, 图形的标记和交点以及循环的一些内容, 这次有了前面的知识, 就可以创建更为复杂的图形了. 下面先来介绍一个比较简单的绘图小技巧, 即根据给定点(圆心)以及圆上任意一点来绘制圆. 然后根据这个技巧来进一步绘制一些复杂的图形.

通过阅读本文, 大家应该可以绘制出下面的图形

TikZ学习笔记(四)圆的进一步探索与复杂几何图形_ide

并且由此绘制更加复杂的一些几何图形, 不过这里介绍的方法仍然比较复杂, 之后可以通过​​tikz-euclide​​包来进行快速的绘制.

给定两点长度为半径作圆(圆弧)

这是一种尺规作图中常常会用到的方法, 特别是取给定长度的圆弧时候尤其如此, 下面来看看在tikz中进行绘制的基本语法

\path [name path=o1] 
let
\p1=($ (A) - (B) $),
\n1={veclen(\x1, \y1)}
in
(O) circle (\n1);

上面这段代码的意思是:

  1. 标记一个圆​​o1​​;
  2. 取​​A​​​与​​B​​​两点形成的向量, 记为​​\p1​​;
  3. 利用tikz引擎的​​veclen​​​函数计算​​AB​​​的长度, 并记为​​\n1​​;
  4. 标记(不绘制)以​​O​​​为圆心,​​AB​​长度为半径的圆.

通过这段代码, 就可以方便地绘制由两点给出的长度为半径, 以给定点为圆心的圆了.

同样地, 如果需要绘制圆弧, 只需要修改最后一行代码即可以实现, 示例如下

\path [name path=o1] 
let
\p1=($ (A) - (B) $),
\n1={veclen(\x1, \y1)}
in
(O) arc (0:90:1);

这里使用的主函数还是​​\path​​​, 所以并不会进行绘制, 如果需要绘制, 那就可以通过添加​​[draw]​​​参数, 或者直接使用​​\draw​​函数来完成.

一个简单的例子: 绘制正五边形的尺规作图画法

效果图:

TikZ学习笔记(四)圆的进一步探索与复杂几何图形_ide

代码以及注释如下: 详细的绘制步骤可以看我之前的文章​​TikZ绘图示例——尺规作图: 圆内接正五边形的近似画法_zorchp-_尺规作图作圆内接正五边形​​.

\documentclass[tikz,border=3pt]{standalone}
\usetikzlibrary{calc}
\usetikzlibrary{intersections,through}

\begin{document}
\begin{tikzpicture}[]
% AB, CD为圆的垂直中心线
\coordinate [label=below left:$A$] (A) at (0,0);
\coordinate [label=below right:$B$] (B) at (4,0);
\coordinate [label=above left:$C$] (C) at (2,2);
\coordinate [label=below right:$D$] (D) at (2,-2);
\coordinate [label=below right:$O$] (O) at (2,0);
\draw [name path=o] (O) circle (2);
\draw [densely dashed,-latex,name path=AB] ($(A)!-.1!(B)$) -- ($(A)!1.1!(B)$);
\draw [densely dashed,latex-,name path=CD] ($(C)!-.1!(D)$) -- ($(C)!1.1!(D)$);
\coordinate [label=below:$H$] (H) at ($(O)!.5!(B)$);
% 标记弧段
\path [name path=o1]
let
\p1=($ (H) - (C) $),
\n2={veclen(\x1, \y1)}
in
(H) circle (\n2);
% 找到交点G
\path [name intersectinotallow={of=o1 and AB}]
coordinate [label=below right:$G$] (G) at (intersection-1);
\draw (G) -- (C);
\draw [-latex] (H) -- ($(H)!1.18!($(C)!.5!(G)$)$);
% 绘制弧段
\draw [red]
let
\p1=($ (H) - (C) $),
\n2={veclen(\x1, \y1)}
in
(G) arc (180:110:\n2)
(G) arc (180:185:\n2);

% 找到其他点
\path [name path=o2]
let
\p2=($ (G) - (C) $),
\n2={veclen(\x2,\y2)}
in
(C) circle (\n2);
\path [name intersectinotallow={of=o2 and o}]
coordinate [label=above left:$E$] (E) at (intersection-1);

\path [name path=o3]
let
\p2=($ (G) - (C) $),
\n2={veclen(\x2,\y2)}
in
(E) circle (\n2);
\path [name intersectinotallow={of=o3 and o}]
coordinate [] (F) at (intersection-2);

\path [name path=o4]
let
\p2=($ (G) - (C) $),
\n2={veclen(\x2,\y2)}
in
(F) circle (\n2);
\path [name intersectinotallow={of=o4 and o}]
coordinate [] (J) at (intersection-2);

\path [name path=o5]
let
\p2=($ (G) - (C) $),
\n2={veclen(\x2,\y2)}
in
(J) circle (\n2);
\path [name intersectinotallow={of=o5 and o}]
coordinate [] (K) at (intersection-1);

% 绘制正五边形
\draw [thick] (C) -- (E) -- (F) -- (J) -- (K) -- cycle;
\end{tikzpicture}
\end{document}

这里面需要注意的点有以下几个:

  1. 两弧段(通过标记圆来完成)交点需要注意是第一个交点还是第二个交点;
  2. 绘制圆弧时候需要注意初始角度, 以及圆弧参数的细微调整;
  3. 起适当的别名, 防止画到最后部件变多引起混乱.