画出数学考试的图画

画出数学考试的图画

芬兰高考时,有这样一个问题:如何使用 LaTeX 绘制这些图片?

  1. 正方形 ABCD 位于坐标系中,AB 在 x 轴上,A=(0,0),B=(1,0)。我们绕 B 旋转正方形,使 BC 在 x 轴上,然后绕 C、D 旋转,使 A 再次接触 x 轴。画出 A 相对于时间的位置图。

  2. 正六边形 ABCDEF 位于坐标系中,AB 在 x 轴上,A=(0,0),B=(1,0)。我们围绕 B 旋转六边形,使 BC 在 x 轴上,然后围绕 C、D 旋转,依此类推,直到 A 再次接触 x 轴。画出 A 相对于时间的位置图。

手绘图表已打开http://www.mafyvalmennus.fi/images/uploads/pmyo14.pdf第 32 和 33 页(或第 34 和 35 页,取决于如何计算这些页数)。

答案1

这是第一个:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}

\def\side{1cm}
\tikzset{
smalldot/.style={
  circle,
  fill,
  inner sep=1.2pt
  }
}

\begin{document}

\begin{tikzpicture}[
decoration={
  markings,
  mark=at position 0.5 with {\arrow{>}}
  }
]
\draw
  (0,0) -- ++(0,\side) --++(4*\side,0) -- ++(0,-\side);
\draw (-0.5\side,0) -- ++(5*\side,0);
\foreach \valor in {1,2,3}
  \draw (\valor*\side,0) -- ++(0,\side);
\draw[postaction=decorate] 
  (0,0) arc [start angle=180,end angle=90,radius=\side];    
\draw[postaction=decorate] 
  (3*\side,\side) arc [start angle=90,end angle=0,radius=\side];    
\draw[postaction=decorate] 
  (\side,\side) arc [start angle=135,end angle=45,radius=1.4142*\side];    
\foreach \xcoor/\ycoor in {0/0,\side/\side,{3*\side}/\side,{4*\side}/0}
  \node[smalldot] at (\xcoor,\ycoor) {};
\draw[dashed]
  (\side,\side) -- (2*\side,0) -- (3*\side,\side);
\foreach \coord in {1,2,3,4}
  \node[circle,draw,font=\footnotesize,inner sep=1pt] at ({\side*(\coord-0.5)},-0.5) {\coord};    
\begin{scope}[yshift=-3*\side]
\draw (-0.5\side,0) -- ++(5*\side,0);
\draw[postaction=decorate] 
  (0,0) arc [start angle=180,end angle=90,radius=\side];    
\draw[postaction=decorate] 
  (3*\side,\side) arc [start angle=90,end angle=0,radius=\side];    
\draw[postaction=decorate] 
  (\side,\side) arc [start angle=135,end angle=45,radius=1.4142*\side];    
\end{scope}
\end{tikzpicture}

\end{document}

在此处输入图片描述

正如您所见,使用\drawarc您可以构建您的图像。

第二个:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}

\def\side{1cm}% the length of the side of the polygons

\tikzset{
smalldot/.style={
  circle,
  fill,
  inner sep=1.2pt
  }
}

\begin{document}

\begin{tikzpicture}[
decoration={
  markings,
  mark=at position 0.5 with {\arrow{>}}
  }
]
% the hexagons
\foreach \inicio in {0,...,5}
{
  \draw 
    (\inicio*\side,0) -- ++(0:\side) -- ++(60:\side) -- ++(120:\side) -- 
    ++(180:\side) -- ++(240:\side) -- ++(300:\side);
}     

% the horizontal axis
\draw (-0.5\side,0) -- ++(7*\side,0);

% the arcs and small filled dots
\draw[postaction=decorate] 
   node[smalldot] {} (0,0) arc [start angle=180,end angle=120,radius=\side] node[smalldot] {};    
\draw[postaction=decorate] 
  (60:\side) arc [start angle=150,end angle=90,radius=1.717*\side] node[smalldot] {};    
\draw[postaction=decorate] 
  (2*\side,1.717*\side) arc [start angle=120,end angle=60,radius=2*\side] node[smalldot] {};    
\draw[postaction=decorate] 
  (4*\side,1.717*\side) arc [start angle=90,end angle=30,radius=1.717*\side] node[smalldot] {};    
\begin{scope}[xshift=5*\side]
\draw[postaction=decorate] 
  (60:\side) arc [start angle=60,end angle=0,radius=\side] node[smalldot] {};    
\end{scope}

% the dashed lines
\draw[dashed]
  (60:\side) -- (2*\side,0) -- ++(0,1.717*\side);
\draw[dashed]
  (4*\side,1.717*\side) -- ++(0,-1.717*\side) -- +(30:1.717*\side);

% the circled labels
\foreach \coord in {1,...,6}
  \node[circle,draw,font=\footnotesize,inner sep=1pt] at ({\side*(\coord-0.5)},-0.5) {\coord};    

% the bottom figure showing only the path
\begin{scope}[yshift=-3*\side]
\draw (-0.5\side,0) -- ++(7*\side,0);
\draw[postaction=decorate] 
  (0,0) arc [start angle=180,end angle=120,radius=\side];    
\draw[postaction=decorate] 
  (60:\side) arc [start angle=150,end angle=90,radius=1.717*\side];    
\draw[postaction=decorate] 
  (2*\side,1.717*\side) arc [start angle=120,end angle=60,radius=2*\side];    
\draw[postaction=decorate] 
  (4*\side,1.717*\side) arc [start angle=90,end angle=30,radius=1.717*\side];    
\begin{scope}[xshift=5*\side]
\draw[postaction=decorate] 
  (60:\side) arc [start angle=60,end angle=0,radius=\side];    
\end{scope}
\end{scope}

\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

此答案概括了正多边形的顶点数,并\RotateRegularPolygon以顶点数作为参数定义了宏。如果可选参数为false,则仅绘制点 A 的圆弧。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.markings}
\usetikzlibrary{shapes.geometric}

\makeatletter
\newif\ifDrawWithPolygon
\newcommand*{\RotateRegularPolygon}[2][true]{%
  \begingroup
    \def\VarN{#2}%
    \edef\VarM{\the\numexpr\VarN-1\relax}%
    \def\DimR{15mm}%
    \csname DrawWithPolygon#1\endcsname
    %
    \pgfmathsetmacro\AngleN{360/\VarN}%
    \pgfmathsetmacro\CurrentAngle{270+180/\VarN}%
    \pgfmathsetmacro\XM{-cos(\CurrentAngle)}%
    \pgfmathsetmacro\YM{-sin(\CurrentAngle)}%
    \pgfmathsetmacro\Side{-2*\XM}%
    \expandafter\pgfmathsetmacro\csname X0\endcsname{-\XM}%
    \expandafter\pgfmathsetmacro\csname Y0\endcsname{-\YM}%
    \expandafter
    \let\csname X\VarN\expandafter\endcsname\csname X0\endcsname
    \expandafter
    \let\csname X\VarN\expandafter\endcsname\csname Y0\endcsname
    \count@=1\relax
    \@whilenum\count@<\VarN\do{%
      \pgfmathsetmacro\CurrentAngle{\CurrentAngle-\AngleN}%
      \expandafter
      \pgfmathsetmacro\csname X\the\count@\endcsname{cos(\CurrentAngle)}%
      \expandafter
      \pgfmathsetmacro\csname Y\the\count@\endcsname{sin(\CurrentAngle)}%
      \advance\count@\@ne
    }%
    \begin{tikzpicture}[
      x=\DimR,
      y=\DimR,
    ]
      \draw[]
        let
          \n1 = {\Side*\VarM*\DimR + \DimR}
        in
        (-\DimR, -\YM) -- (\n1, -\YM)
      ;
      \ifDrawWithPolygon
        \foreach \i in {0, ..., \VarM} {
          \draw[xshift=\i*\Side*\DimR]
            (\csname X0\endcsname, \csname Y0\endcsname)
            \foreach \j in {1, ..., \VarM} {
              -- (\csname X\j\endcsname, \csname Y\j\endcsname)
            }
            -- cycle;
          ;
%          \edef\DimSide{\the\dimexpr\Side\dimexpr\DimR\relax\relax}%
          \ifnum \i<\numexpr\VarM-1\relax
            \ifnum \i>0 %
              \draw[
                dashed,
                xshift=\i*\Side*\DimR,
                blue
              ]
                let
                  \p1 = (\csname X\the\numexpr\i+2\endcsname + \Side,
                         \csname Y\the\numexpr\i+2\endcsname)
                in
                (\p1) --
                (\csname X0\endcsname, \csname Y0\endcsname) --
                (\csname X\the\numexpr\i+1\endcsname,
                 \csname Y\the\numexpr\i+1\endcsname)
              ;
            \fi
          \fi
        }%
        \foreach \i in {0, ..., \VarM} {
          \draw[
            xshift=\i*\Side*\DimR,
            yshift=-\YM*\DimR,
          ]
            (0,-8pt)
            node[
              \ifnum\i<9 circle\else ellipse\fi,
              draw,
              font=\footnotesize,
              inner sep=1pt,
            ] {\the\numexpr\i+1\relax}
          ;
        }%
      \fi
      \edef\ArrowPosition{\ifDrawWithPolygon 0.5\else 0.999\fi}%
      \tikzset{
        decoration={
          markings,
          mark=at position \ArrowPosition with {\arrow{>}},
        },
      }%
      \foreach \i in {0, ..., \numexpr\VarM-1\relax} {
        \draw[
          postaction=decorate,
          xshift=\i*\Side*\DimR,
          red,
        ]
          let
            \n{x} = {\csname X\the\numexpr\i+1\endcsname-\csname X0\endcsname},
            \n{y} = {\csname Y\the\numexpr\i+1\endcsname-\csname Y0\endcsname},
            \n{start} = {atan2(\n{y},\n{x})},
            \n{radius} = {sqrt(\n{x}*\n{x} + \n{y}*\n{y})}
          in
          (\csname X\the\numexpr\i+1\endcsname,
           \csname Y\the\numexpr\i+1\endcsname)
          arc[start angle=\n{start}, delta angle=-\AngleN, radius=\n{radius}]
        ;
      }%
    \end{tikzpicture}%
  \endgroup
}

\begin{document}
  \centering
  \setlength{\parskip}{1ex}
  \newcommand*{\test}[1]{%
    \par
    \vspace{4\parskip}%
    \RotateRegularPolygon{#1}\par
    \nopagebreak
    \RotateRegularPolygon[false]{#1}\par
  }
  \test{4}
  \test{5}
  \test{6}
  \test{9}
  \test{12}
\end{document}

结果

答案3

这是 Metapost 中用于绘制这些路径的微型通用函数。根据需要进行装饰。

prologues:=3;outputtemplate:="%j%c.eps";
% Corner of Rotated Polygon
vardef corp(expr n,size) = 
  save p; pair p[]; p[0]=(0,0); 
  p[0] for i=1 upto n-1: 
  hide(p[i] = p[i-1] rotatedabout((size*i,0),-360/n))
  {((size*i,0)-p[i-1]) rotated 90} .. 
  {((size*i,0)-p[i]) rotated 90} p[i] 
  endfor
enddef;
beginfig(1);
  drawarrow corp(4,3cm);
  drawarrow corp(6,2cm) shifted 144up;
endfig;
end

在此处输入图片描述

答案4

一个迟来的答案,与之前的答案在精神上有所不同:为了更具说明性,正方形的连续位置不相互接触,并且正方形的边很厚。这迫使我们稍微欺骗一下点 A 的轨迹参数,例如椭圆弧而不是(但非常接近)真实弧。我用过 pstricks

 \documentclass[a4paper,10pt]{article}

\usepackage[svgnames,x11names, pdf]{pstricks}%
\usepackage{pstricks-add}
\usepackage{multido}

\pagestyle{empty}

\begin{document}

\def\mysquare{{\psset{linewidth = 2pt, dotsize =2pt, showpoints, labelsep = 1cm}%
\psline[linecolor=PaleVioletRed1](0.80,0)(0.80,0.80)\psline[linecolor=PaleVioletRed2](0.80,0.80)(0,0.80)%
\psline[linecolor=PaleVioletRed3](0,0.80)(0,0)\psline[linecolor=PaleVioletRed4](0,0)(0.80,0)}}%
\begin{pspicture*}(-1.25,-1)(5.95,4)
\scriptsize\sffamily
\pnodes{P}(0,0)(1,0)(2,0)(3,0)
\pnodes{Q}(1,1)(2,1)(3,1)(4,1)
%%%%%%%% Successive positions of square
\psset{labelsep = 1.16\pslinewidth}
\uput[u](0.1,0){\mysquare}%
\uput[u]{270}(1.1,0.8){\mysquare}%
\uput[u]{180}(2.9,0.8){\mysquare}%
\uput[u]{90}(3.9,0){\mysquare}%
%%%%%%%%% Labels
\uput{2pt}[d](0.1,0){\rnode{A}{A}}\uput{2pt}[d](0.90,0){B}\uput[u](0.90,0.90){C}\uput[u](0.1,0.90){D}
%%%%%%%%% Successive positions of point A
\psset{linewidth =1pt,  linecolor = Thistle3, dotsize = 2pt}
\psellipticarcn{*->}(1.1,1pt)(1.0175, 0.815 ){180}{90}
\psarcn{*->}(2,1pt){1.204}{138}{42}
\psellipticarcn{*->}(2.9,1pt)(1.035, 0.815 ){90}{0}
\psdot(3.9175,1pt)
%%%%%%%%%%%%
\psaxes[linecolor = LightSteelBlue3!90!blue, ticksize = -2pt, tickcolor= LightSteelBlue3,labels = none](0,-0.4pt)(-0.95,-0.4pt)(5.95,-0.4pt)
\end{pspicture*}

\end{document} 

在此处输入图片描述

相关内容