这段时间在大家的热情帮助下,用tkz-euclide
来画些基本的图形慢慢可以上手了。
周末和小朋友看题目的时候,发现她们所学习题目中的动点问题也已陆续出现。这种题目,前几次我是看了答案然后定点后绘图,属于“有形无魂魄”。
在B站上面看到有些大佬们用画板来画。向请问下我们在 LaTeX 能比较容易地通过计算来画出来这些答案所对应的精确图形么?
就比如下面题目中的第二问。
首先做题不在本提问的范围内,所以搜了下题:
在B站上面看到有些大佬们用画板来画。向请问下我们在 LaTeX 能比较容易地通过计算来画出来这些答案所对应的精确图形么?就比如下面题目中的第二问。
我更倾向于LaTeX更主要是用来「绘图」而非进行「遍历直线上的点、判断是否有交点」一类精确计算的;所以要想「画出来这些答案所对应的精确图形」,不妨 先画靶子再射箭 ,从答案入手。
问题2中对「点D」是没有任何显式限制的,所以由▲ADE确定的「点E」也是自由的,换言之,直线「BE/BN」也是自由的。考虑最后再画直线「BN」。
要绘制「大概成立的图2-1」,找个差不多的「M」点即可,此时▲FMN必定不是准确的等腰直角三角形。因此这里没必要画,略去。
M(4,0)
」的图2-2的情况:\documentclass[border=5pt]{standalone}
\usepackage{tkz-base}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}
\tkzInit[xmin=-5,xmax=5,ymin=-3,ymax=4]
\tkzDrawX[noticks,thick]\tkzDrawY[noticks,right=2pt,thick]
\tkzDefPoints{0/0/O,-4/0/B,4/0/C,0/4/A,0/3/F}
\tkzDrawPolygon[thick](B,C,A)
\tkzDefPoint(4,0){M}
% 这里用▲FMN为等腰直角,用利用\tkzDefPointWith[orthogonal,K=-1]实现FM顺时针旋转90度来定位N点
\tkzDefPointWith[orthogonal,K=-1](F,M)
\tkzGetPoint{N}
\tkzDrawPolygon[thick](M,N,F)
\tkzDrawLine[add=1.2 and 1.5,thick](B,N)
\tkzDefPointBy[projection= onto O--F](N)
\tkzGetPoint{P}
\tkzDrawSegment[dashed,thick](N,P)
\tkzDrawPoints(O,F,M,N,B,C,A,P)
\tkzLabelPoints[above left](O)
\tkzLabelPoints[above right](C)
\tkzLabelPoints[below](B,N,M)
\tkzLabelPoints[right](P)
\tkzLabelPoints[left](A,F)
\end{tikzpicture}
\end{document}
M(-7,0)
」的图2-3的情况:\documentclass[border=5pt]{standalone}
\usepackage{tkz-base}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}
\tkzInit[xmin=-8,xmax=5,ymin=-3,ymax=4]
\tkzDrawX[noticks,thick]\tkzDrawY[noticks,right=2pt,thick]
\tkzDefPoints{0/0/O,-4/0/B,4/0/C,0/4/A,0/3/F}
\tkzDrawPolygon[thick](B,C,A)
\tkzDefPoint(-7,0){M}
% 这里用▲FMN为等腰直角,用斜边FM以及\tkzDefTriangle[isosceles right]来定义等腰直角三角形确定点N
\tkzDefTriangle[isosceles right](F,M)
\tkzGetPoint{N}
\tkzDrawPolygon[thick](M,N,F)
\tkzDrawLine[add=1.2 and .5,thick](B,N)
\tkzDefPointBy[projection= onto O--F](N)
\tkzGetPoint{T}
\tkzDefPointBy[projection= onto O--B](N)
\tkzGetPoint{S}
\tkzDrawSegments[dashed,thick](N,T N,S)
\tkzDrawPoints(O,F,M,N,B,C,A,T,S)
\tkzLabelPoints[above left](O)
\tkzLabelPoints[above right](C)
\tkzLabelPoints[below](B,N,M)
\tkzLabelPoints[right](T,F)
\tkzLabelPoints[above](S)
\tkzLabelPoints[left](A)
\end{tikzpicture}
\end{document}
供参考。
本质上你并没有提出一个 LaTeX 绘图的问题。提问要描述清楚你要绘制什么图。以下采用 tzplot 绘制:
\documentclass[border=1cm]{standalone}
\usepackage{tzplot}
\usetikzlibrary{scopes}
\begin{document}
\begin{tikzpicture}[scale=0.8, thick]
\draw[->] (-5,0) -- (5,0) node[right]{$x$};
\draw[->] (0,-3) -- (0,5) node[above]{$y$};
\tzcoors(0,0)(O){$O$}[-135] (0,4)(A){$A$}[170] (-4,0)(B){$B$}[150] (4,0)(C){$C$}[30] (2,0)(D){$D$}[-30] (-2,-2)(E){$E$}[-90] ;
\draw(A)--(B)--(E)--(D)--(A) (A)--(C);
{[shift={(12,0)}]
\draw[->] (-5,0) -- (5,0) node[right]{$x$};
\draw[->] (0,-3) -- (0,5) node[above]{$y$};
\tzcoors(0,0)(O){$O$}[-135] (0,4)(A){$A$}[170] (-4,0)(B){$B$}[-150] (4,0)(C){$C$}[30] (2,0)(D){$D$}[-30] (-2.5,-1.5)(E){$E$}[-150] (-4.8,0.8)(a){} (-1.8,-2.2)(b){};
\tzdot*[fill=red](0,3){$F$}[l](3.5pt)
\draw(A)--(B)--(E)--(D)--(A) (A)--(C) (a)--(b);
}
\end{tikzpicture}
\end{document}
此外,tikz 绘图不一定需要精确计算坐标,很多时候坐标可以目测,最终实现的结果观感不错就行,毕竟是在绘图而不是做数学题,而要完成以上数学题实际上并不需要图形。
这是旋转位似变换.
%旋转位似变换
%#1, 变换的中心点
%#2, 被变换的点
%#3, 旋转角度
%#4, 位似比例
%#5, 结果点的名称
\def\RotHom#1#2#3#4#5{
\tkzURotateAngle(#1,#3)(#2)
\tkzGetPoint{rotated-point-temp}
\tkzUHomo(#1,#4)(rotated-point-temp)
\tkzGetPoint{#5}
}
题目中第一个图形画出的情况: 以 A
为中心, 旋转角度为 -45
度, 位似比例 sqrt(2)
, 把 x
轴变成直线 BE
\begin{tikzpicture}
\tkzDefPoints{0/0/O,-4/0/B,4/0/C,0/4/A,-5/0/xmin,5/0/xmax,0/-5/ymin,0/5/ymax}
\begin{scope}[thick]
\draw [->] (xmin) -- (xmax) node[below]{$x$};
\draw [->] (ymin) -- (ymax) node[above]{$y$};
\end{scope}
\draw (A) node[right]{$A$} -- (B) node[below left]{$B$} -- (C) node[below]{$C$} -- cycle;
\def\RotAngle{-45}
\RotHom{A}{B}{\RotAngle}{sqrt(2)}{B'}
\RotHom{A}{C}{\RotAngle}{sqrt(2)}{C'}
\tkzDrawLine[add=-1cm and 1cm](B',C')
%取点 D, 把 D 变换为点 E
\foreach \i[count=\ci,evaluate={\j = \i*100}] in {0.3,0.6,0.8}{
\coordinate [label=-90:$D$] (D\ci) at ($(B)!\i!(C)$);
\coordinate [label=200:$E$] (E\ci) at ($(A)!sqrt(2)!\RotAngle:(D\ci)$);
\draw [dashed,draw=red!\j!cyan] (A) -- (D\ci) -- (E\ci) -- cycle;
}
\end{tikzpicture}
对于第二个问题, 应该有多个情况, 参照下图:
容易看出需要考虑以下点
N= (-3,-1), (-2,-2), (-1/2,-7/2), (3,-7)
所以
%#1, 变换中心点
%#2, 角度
%#3, 比例
\tikzset{rotate scale trf/.style args={c#1d#2r#3}{rotate around={#2:#1},scale around={#3:#1}}}
\begin{tikzpicture}
\tkzDefPoints{0/0/O,-4/0/B,4/0/C,0/4/A,0/3/F,-5/0/xmin,5/0/xmax,0/-5/ymin,0/5/ymax}
\begin{scope}[thick,>=Stealth]
\draw [->] (xmin) -- (xmax) node[below]{$x$};
\draw [->] (ymin) -- (ymax) node[above]{$y$};
\end{scope}
\node [right] at(F) {$F$};
\draw (A) node[right]{$A$} -- (B) node[below left]{$B$} -- (C) node[below]{$C$} -- cycle;
\draw [rotate scale trf=c{(A)}d{-45}r{sqrt(2)}]
(-4,0) coordinate (B') -- (4,0) coordinate (C');
%\foreach [count=\ct, evaluate={\val = 100*\ct/8}]\CenterPt/\RotDegree/\ScaleNum in {F/45/sqrt(2),F/-45/sqrt(2),F/45/{1/sqrt(2)},F/-45/{1/sqrt(2)},F/90/1,F/-90/1}{
% \path [rotate scale trf=c{(\CenterPt)}d{\RotDegree}r{\ScaleNum}]
% [draw=red!\val!green]
% (-4,0) coordinate (B') -- (4,0) coordinate (C');
%}
\foreach [count=\n,evaluate={\v=100*\n/4}] \NPt/\negRotDegree/\ScaleNum in {{-3,-1}/90/1,{-2,-2}/-45/sqrt(2),{-1/2,-7/2}/-45/{1/sqrt(2)},{3,-7}/-90/1}{
\coordinate (N) at (\NPt);
\fill (N) circle (2pt);
\coordinate [rotate scale trf=c{(F)}d{\negRotDegree}r{\ScaleNum}] (M) at(\NPt);
\fill (M) circle (2pt) node[above,circle,draw, inner sep=1pt]{\n};
\draw [draw=red!\v!cyan](N) -- (M) -- (F) -- cycle;
}
\end{tikzpicture}
如果希望看到动态图, 建议使用其他软件, 例如 Geogebra.
我觉得这没有准确回答好「平面几何动点问题中的绘图方法」中的「动点」,所以蹲蹲其他答案会更好。