近来在大佬们倾情帮助下,基本上可以用tkz-euclide
宏包来绘制些简单的图形了。宏包确实是把以往手工绘制的过程用特定方式来格式化了。小朋友初中二年级的几何图形还相对简单,正适合循序渐进上手。
上个问题 @u70550 的回复中提到了在线段上面取点的方式:
\tkzDefPointWith[linear,K=.35](A,B)\tkzGetPoint{D}
今天画图的时候,我又遇到了一个类似的问题,但没有找的精确的方法,用凑合的方式做了出来。
题目如下:
绘图代码如下:
\begin{tikzpicture}[scale=1, font=\small]
% ===== 定义点 =====
\tkzDefPoints{0/0/B, 2/0/C, 4.2/0/D}
\tkzDefTriangle[two angles=60 and 60](B,C)
\tkzGetPoint{A}
\tkzDefPointWith[linear,K=2.1](B,C)
\tkzGetPoint{D}
\tkzDefPointWith[linear,K=2.6](B,A)
\tkzGetPoint{E}
% ===== 绘制图形 =====
\tkzDrawPolygon[thick](A,B,C)
\tkzDrawSegments[thick](C,D A,E E,C E,D)
% ===== 标记点 =====
\tkzLabelPoints[below](B,C,D)
\tkzLabelPoints[above](E)
\tkzLabelPoints[above left](A)
\end{tikzpicture}
在「延长BC到点D,延长BA到点E,并且使AE = BD」这个过程,用了一个比较不精确的方法,先定义了D
点坐标,使CD=2.2
,因BC=2
,所以BD=4.2
,这个时候,通过:
\tkzDefPointWith[linear,K=2.1](B,C)
\tkzGetPoint{D}
得到D
点。因BC=2
,AE=BD=4.2
,所以BE=6.2
,这个时候,通过:
\tkzDefPointWith[linear,K=3.1](B,A)
\tkzGetPoint{E}
现在有:
第一个问题是,假如已知BD=4.2
的情况下,如何延长BA到点E,并且使AE = BD = 4.2
,也就是延长绝对的数量;
第二个问题是,假如BD
长度未知,如何得到它的长度,并且延长BA到点E,并且使AE = BD的长度
。
O(∩_∩)O谢谢!
\documentclass[border=4pt]{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}
\tkzDefPoints{0/0/A, 2/0/B}
\tkzDrawPoints(A,B)
\tkzDrawSegment[-Stealth](A,B)
\tkzDefPointWith[linear,K=1.5](A,B)
\tkzGetPoint{C}
\tkzDefPointWith[linear,K=.75](A,B)
\tkzGetPoint{D}
\tkzDefPointWith[linear,K=-.5](A,B)
\tkzGetPoint{E}
\tkzDrawPoints[violet](C) % 1.5
\tkzDrawPoints[cyan](D) % .75
\tkzDrawPoints[olive](E)% -.5
\tkzLabelPoints[above](A,B,C,D,E)
\tkzDrawLine[gray,dashed,add=1 and 1](A,B)
\end{tikzpicture}
\end{document}
读文档,不难发现...
对于linear normed
,参数K
为「绝对距离」。
\documentclass[border=4pt]{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}
\tkzDefPoints{0/0/A, 2/0/B}
\tkzDrawPoints(A,B)
\tkzDrawSegment[-Stealth](A,B)
\tkzDefPointWith[linear normed,K=1.5](A,B)
\tkzGetPoint{C}
\tkzDefPointWith[linear normed,K=2.5](A,B)
\tkzGetPoint{D}
\tkzDefPointWith[linear normed,K=-1](A,B)
\tkzGetPoint{E}
\tkzDrawPoints[violet](C) % K=1.5 |AC|=1.5,|BD|=0.5
\tkzDrawPoints[cyan](D) % K=2.5 |AD|=2.5,|BD|=0.5
\tkzDrawPoints[olive](E)% K=-1 |EA|=1
\tkzLabelPoints[above](A,B,C,D,E)
\tkzDrawLine[gray,dashed,add=1 and 1](A,B)
\end{tikzpicture}
\end{document}
至此,假如已知BD=4.2的情况下,如何延长BA到点E,并且使AE = BD = 4.2
,也就是延长绝对的数量;
应该是可以解决了...
假如BD长度未知,如何得到它的长度,并且延长BA到点E,并且使AE = BD的长度
在文档中也有类似的功能\tkzCalcLength
下面把|AB|设置为倾斜的,因此|AB|长度需要通过勾股定理,较难计算。同时我们预期在|AC|上延长这段长度:
\documentclass[border=4pt]{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}
\tkzDefPoints{0/0/A, 1.5/0.25/B, 1/1/C}
\tkzDrawPoints(A,B,C)
\tkzLabelPoints(A,B,C)
\tkzDrawSegments[thick](A,B A,C)
%计算|AB|的长度
\tkzCalcLength(A,B)
\tkzGetLength{dAB}
%从C点反向延长距离为\dAB的长度
\tkzDefPointWith[linear normed,K=-\dAB](C,A)
\tkzGetPoint{D}
\tkzDrawSegment[magenta,semithick](A,D)
\tkzDrawPoints[magenta](D)
\tkzLabelPoints[magenta](D)
\tkzDrawSegment[dim={\pgfmathprintnumber\dAB,6pt,}](C,D)
\end{tikzpicture}
\end{document}
第一个问题:
在已知角B,且BD水平的情况下,点E就是以A为原点,角B为倾角,BD为半径的极坐标
\tkzDefShiftPoint[A](60:4.2){E}
第二个问题:
BD长度未知,但B,D,A三点均已定义(否则就无从谈起了)
角B已知,且BD水平
\tkzCalcLength(B,D) \tkzGetLength{rBD}
\tkzDefShiftPoint[A](60:\rBD){E}
\tkzDefPointWith[colinear=at A,K=1](B,D) \tkzGetPoint{x}
\tkzDefPointBy[rotation=center A angle 60](x) \tkzGetPoint{E}
\tkzDefPointWith[colinear=at A,K=1](B,D) \tkzGetPoint{x}
\tkzInterLC[near](B,A)(A,x) \tkzGetSecondPoint{E}
注:这里作圆只给出了最简单的一种方法,也可以通过半径来作圆。另外,直线和圆有两个交点的时候,需要注意先后顺序,一般会用到near
,common
等参数,具体请参考文档。
画平几草图方法肯定不止一种,宏包也不可能穷尽所有情况,关键还是要熟练掌握一些常用的重要命令,结合平几知识,组合运用,举一反三。
用极坐标很容易
\documentclass[border=1cm]{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}[font=\small]
\tkzDefPoint(0,0){B}
\tkzDefShiftPoint[B](60:2){A}
\tkzDefShiftPoint[B](0:2){C}
\tkzDefShiftPoint[B](60:5){E}
\tkzDefShiftPoint[B](0:3){D}
\tkzDrawPolygon[thick](A,B,C)
\tkzDrawSegments[thick](C,D A,E E,C E,D)
\tkzLabelPoints[below](B,C,D)
\tkzLabelPoints[above](E)
\tkzLabelPoints[above left](A)
\end{tikzpicture}
\end{document}
若 BD 已知,则 AE 的长就是 BD - BC.
若 BD 未知,则先定义 AE 的长,比如为 x, 则 BD 就是 2+x (BC = 2).
此外,如果对极坐标定义点觉得麻烦,可以自定义一个命令:
\newcommand{\myPolarPoints}[2]{%
\foreach \ang/\r/\name in {#2}{%
\tkzDefShiftPoint[#1](\ang:\r){\name}%
}
}
这样就可以用类似直角坐标的方法批量定义点:
\documentclass[border=1cm]{standalone}
\usepackage{tkz-euclide}
\newcommand{\myPolarPoints}[2]{%
\foreach \ang/\r/\name in {#2}{%
\tkzDefShiftPoint[#1](\ang:\r){\name}%
}
}
\begin{document}
\begin{tikzpicture}[font=\small]
\tkzDefPoint(0,0){B}
\myPolarPoints{B}{60/2/A,0/2/C,60/5/E,0/3/D}
\tkzDrawPolygon[thick](A,B,C)
\tkzDrawSegments[thick](C,D A,E E,C E,D)
\tkzLabelPoints[below](B,C,D)
\tkzLabelPoints[above](E)
\tkzLabelPoints[above left](A)
\end{tikzpicture}
\end{document}