晚上在做下面这个图,看起来很简单,但最后居然还是用自己的想法没有做出来。后来用腾讯元宝做了个近似的出来。
我的构思如下:
AE=BE
,通过微调顶点A
的坐标,得到肉眼近似相等。但按照上面的方法绘制近似的图形,最后报错了。
Package pgf Error: No shape named `D' is known. ^^I^^I\tkzLabelPoint[below](D){$D$}
Package pgf Error: No shape named `E' is known. ^^I^^I\tkzLabelPoint[right](E){$E$}
想请教下大佬们报错的原因以及怎么应该怎么改正?
另外如果想要精确地按照题目中的要求AE=BE
来绘制,应该是什么样的思路。
三角形高或者从某点到一条线的高绘制方法有哪些。
谢谢!附件如后。
\documentclass[tikz, border=5mm]{standalone}
\usepackage{tkz-euclide}
%\usetkzobj{all} % 解决命令未定义问题 - 加载所有对象类型
\usetikzlibrary{angles, quotes} % 用于绘制角度标记
\begin{document}
\begin{tikzpicture}[scale=0.8]
% 定义三个顶点
\tkzDefPoints{-1.5/0/B, 1.5/0/C, 0/4/A}
% 定义垂心
\tkzDefTriangleCenter[ortho](A,B,C)
\tkzGetPoint{P}
% 定义三个垂足
\tkzDefSpcTriangle[ortho,name=P](A,B,C){D,E,F}
% 画三角形ABC,画三个顶点,连三条高线
\tkzDrawPolygon[thick][color=blue](A,B,C)
% \tkzDrawPoints(A,B,C,P)
% \tkzDrawSegments[thick](A,PD B,PE C,Pc)
\tkzDrawSegments[thick](A,PD B,PE)
% 添加标签
\tkzLabelPoint[above left](P){$P$}
\tkzLabelPoint[above](A){$A$}
\tkzLabelPoint[below left](B){$B$}
\tkzLabelPoint[below right](C){$C$}
\tkzLabelPoint[below](D){$D$}
\tkzLabelPoint[right](E){$E$}
% \tkzAutoLabelPoints[center=P](A,B,C)
\end{tikzpicture}
\end{document}
name=H
意味着得到的垂直实际上名为Ha
、Hb
与Hc
...
\documentclass[tikz, border=5mm]{standalone}
\usepackage{tkz-euclide}
%\usetkzobj{all} % 解决命令未定义问题 - 加载所有对象类型
\usetikzlibrary{angles, quotes} % 用于绘制角度标记
\begin{document}
\begin{tikzpicture}[scale=0.8]
% 定义三个顶点
\tkzDefPoints{-1.5/0/B, 1.5/0/C, 0/4/A}
% 定义垂心
\tkzDefTriangleCenter[ortho](A,B,C)
\tkzGetPoint{P}
% 定义三个垂足
\tkzDefSpcTriangle[ortho,name=P](A,B,C){D,E,F}
% 画三角形ABC,画三个顶点,连三条高线
\tkzDrawPolygon[thick][color=blue](A,B,C)
% \tkzDrawPoints(A,B,C,P)
% \tkzDrawSegments[thick](A,PD B,PE C,Pc)
\tkzDrawSegments[thick](A,PD B,PE)
% 添加标签
\tkzLabelPoint[above left](P){$P$}
\tkzLabelPoint[above](A){$A$}
\tkzLabelPoint[below left](B){$B$}
\tkzLabelPoint[below right](C){$C$}
\tkzLabelPoint[below](PD){$D$}
\tkzLabelPoint[right](PE){$E$}
% \tkzAutoLabelPoints[center=P](A,B,C)
\end{tikzpicture}
\end{document}
Package pgf Error: No shape named `D' is known. ^^I^^I\tkzLabelPoint[below](D){$D$}
Package pgf Error: No shape named `E' is known. ^^I^^I\tkzLabelPoint[right](E){$E$}
查看报错信息,为什么只有D
和E
找不到,看看这两个点是在\tkzDefSpcTriangle
里定义的,回去翻\tkzDefSpcTriangle
的文档:
(此事在文档中亦有记载...)
AE=BE
...这里的E点如果直接用AE=BE
个人觉得会稍显复杂,因为衡量长度似乎稍显代码冗长....
条条大道通罗马...
\documentclass[tikz,border=5mm]{standalone}
\usepackage{tkz-euclide}
\usetikzlibrary{angles}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round]
\tkzDefPoints{-1.5/0/B, 1.5/0/C, 0/4/A}
\tkzDefPointBy[projection = onto B--C](A)
\tkzGetPoint{D}
\tkzDefLine[mediator](A,B)
\tkzGetPoints{P1}{P2}
\tkzInterLL(A,C)(P1,P2)
\tkzGetPoint{E}
\tkzInterLL(A,D)(B,E)
\tkzGetPoint{P}
\tkzDrawSegments[thick](A,D B,E)
\tkzDrawPolygon[semithick](A,B,C)
\tkzLabelPoint[above](A){$A$}
\tkzLabelPoint[below left](B){$B$}
\tkzLabelPoint[below right](C){$C$}
\tkzLabelPoint[below](D){$D$}
\tkzLabelPoint[right](E){$E$}
\end{tikzpicture}
\end{document}
不过这似乎不太直角...
再看看「点A」应该如何定位吧...
嗯,显然∠BAC是45°,对于(-1.5,0) (1.5,0)和(0,4)用余弦定理理论上这个角不是45°,所以要想完全精确最好是不要直接给定ABC的坐标,应该另谋他路来「用最少的点唯一确定这个图形」...
未完待续....
其实对于想完整的画出图形,准确的画出图形,应该是分析完图形的性质之后再进行动手。很明显三角形ABC是等腰三角形,顶角是45度,两个底角是67.5度。在这个基础之上很容易就画出了高。
绘图的事项画出底边BC(此处直接指出顶点b和顶点c的坐标),再画出顶点A(下面给出一个计算的方法得到,也可以通过旋转的方式得到,还可以通过画中垂线的形式得到。方法太多了),最后画出两条高。
\documentclass{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}[scale=1.2]
% 设置点B和点C
\tkzDefPoint(0,0){B}
\tkzDefPoint(10,0){C}
% 计算点A的坐标(使用角度和三角函数)
% 角B = 67.5度,边BC = 10
% AB = BC * sin(C) / sin(A)
% 角A = 180 - 67.5 - 67.5 = 45度
\pgfmathsetmacro{\angleA}{45}
\pgfmathsetmacro{\angleB}{67.5}
\pgfmathsetmacro{\angleC}{67.5}
\pgfmathsetmacro{\AB}{10*sin(\angleC)/sin(\angleA)}
\pgfmathsetmacro{\Ax}{\AB*cos(\angleB)}
\pgfmathsetmacro{\Ay}{\AB*sin(\angleB)}
\tkzDefPoint(\Ax,\Ay){A}
% 绘制三角形ABC
\tkzDrawPolygon(A,B,C)
% 标记点
\tkzLabelPoints[below left](B)
\tkzLabelPoints[below right](C)
\tkzLabelPoints[above](A)
% 绘制高AD(从A到BC的垂线)
\tkzDefPointBy[projection=onto B--C](A) \tkzGetPoint{D}
\tkzDrawSegment[dashed](A,D)
\tkzLabelPoints[below](D)
\tkzMarkRightAngle(A,D,C)
% 绘制高BE(从B到AC的垂线)
\tkzDefPointBy[projection=onto A--C](B) \tkzGetPoint{E}
\tkzDrawSegment[dashed](B,E)
\tkzLabelPoints[above right](E)
\tkzMarkRightAngle(B,E,C)
% 标记角度【根据这个题的图,这个命令标度角是可以不需要的】
\tkzMarkAngle[size=0.8](C,B,A)
\tkzLabelAngle[pos=1.1](C,B,A){$67.5^\circ$}
\tkzMarkAngle[size=0.9](A,C,B)
\tkzLabelAngle[pos=1.2](A,C,B){$67.5^\circ$}
\end{tikzpicture}
\end{document}
这几天几个提问画图的题,应该是先看一下原版的说明书,(已经有大致的中文版了,也在网站里面),然后有了思想之后再来想。
做图就会快很多。
贸然去想的话,不知道绘图软件的一些必要的的一些想法,很难想到一些解决方案。
方法二
以下是使用 tkz-euclide 绘制等腰三角形 ABC 的 LaTeX 代码,其中:
点 B (0,0),点 C (10,0)
角 B = 角 C = 67.5°
角 A = 45°
绘制底边 BC、中垂线、点 A
连接 AC
绘制高 AD 和 BE
\documentclass{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}[scale=1.2]
% 定义点B和点C
\tkzDefPoint(0,0){B}
\tkzDefPoint(10,0){C}
% 绘制底边BC
\tkzDrawSegment(B,C)
\tkzLabelPoints[below left](B)
\tkzLabelPoints[below right](C)
% 绘制BC的中垂线
\tkzDefMidPoint(B,C) \tkzGetPoint{M}
\tkzDefLine[orthogonal=through M](B,C) \tkzGetPoint{M'}
\tkzDrawLine[add=0 and 8](M,M') % 延长中垂线
% 在B点构造67.5度角,与中垂线交于点A
\tkzDefLine[bisector](C,B,M') \tkzGetPoint{b} % 构造角平分线辅助点
\tkzDefShiftPoint[B](\angleB:10){A'} % 临时点用于构造角度
\tkzInterLL(B,A')(M,M') \tkzGetPoint{A}
\tkzDrawPoints(A)
\tkzLabelPoints[above](A)
% 绘制三角形ABC
\tkzDrawPolygon(A,B,C)
% 绘制高AD(从A到BC的垂线)
\tkzDefPointBy[projection=onto B--C](A) \tkzGetPoint{D}
\tkzDrawSegment[dashed](A,D)
\tkzLabelPoints[below](D)
\tkzMarkRightAngle(A,D,C)
% 绘制高BE(从B到AC的垂线)
\tkzDefPointBy[projection=onto A--C](B) \tkzGetPoint{E}
\tkzDrawSegment[dashed](B,E)
\tkzLabelPoints[above right](E)
\tkzMarkRightAngle(B,E,C)
% 标记角度
\tkzMarkAngle[size=0.8](C,B,A)
\tkzLabelAngle[pos=1.1](C,B,A){$67.5^\circ$}
\tkzMarkAngle[size=0.9](A,C,B)
\tkzLabelAngle[pos=1.2](A,C,B){$67.5^\circ$}
\tkzMarkAngle[size=1.0](B,A,C)
\tkzLabelAngle[pos=1.3](B,A,C){$45^\circ$}
\end{tikzpicture}
\end{document}
取巧的办法:
不难注意到:
tan22.5° = √2-1
cot22.5°= √2+1
所以令
A(0,1.5*(sqrt(2)+1))
即可当然,这对数学要求较高,需要记住一些三角函数值...
不过就这个例子而言,为了方便BC水平摆放,BC是要先确定的,而顶角为45°又直接唯一确定了A,所以似乎用这个三角函数是最直接的(?) 换句话讲,这道题中「A点是不能让你自由放置的,隐含的角度关系隐式限制了绘图的自由度」...
如果从倾斜放置的三角形ABC是等腰直角开始画,似乎很难保证BC水平...
蹲蹲有无更好的准确定位思路...
我觉得最直接的就是
projection
?当然如果你的最终目标是垂心,那用你源代码中的
\tkzDefSpcTriangle[ortho,name=P](A,B,C){D,E,F}
显然是更快更方便的...@u70550 不是因为目标是重心而这样绘制的啊,是在翻书的时候看到你最上面提到的那张书里面图的例子。工具书可能需要再慢慢来熟悉去哪里找想要的答案。不过这几天觉得绘图还是一个很有趣的事,以前用手来画图的时候,思考都没有这么多。可惜的是,年纪大了,思考的能力和精力下降太多了。叹口气。
@u70550
\tkzDefPointBy...
,定义某个点通过某个操作,这样理解句子,我好像才能用到绘图里面去。无法得心应手的使用宏包应该与没有把工具书中的词句“翻译”成熟悉的语言呢。要是有大佬们翻译这类书或者写这类书的时候,能够注释出来这些朴素的翻译,应该会更利于学习者掌握。O(∩_∩)O哈哈~@u10189 其实我也是上下翻找了一会儿才找到的这个
projection
方法的,你也可以尝试把文档喂给ai让他帮你找找,但是 自己一定要返回文档原文做验证 。其实入门更直接的方法是「找到手册中哪里可以直接用于你目前的需求」,把他例子里的代码复制一下,自己弄懂,然后用到你自己的图里去。事实上不太需要"翻译",因为这些命令名称是「自解释的」:
\tkzDefPointBy
:定义某个点通过某个操作\tkzDrawSegments
:一次性绘制多条线段\tkzInterLL
: tkz - Intersection - Line Line 线线交点在你的上一个提问的评论区,我也贴了文档的(过时)的中译版,可以供你比较快速了解有哪些功能,实际上你要绘制的「初中数学题」构图都相对简单,多多练习很快就能上手的~
@u70550 是说把那个工具书的文档放在 AI 中,然后再用自然语言问它我们想要的问题么?那倒是真可以试试。
另有一个问题困扰我许久,编译时出现警告,但还是能编译出来。
就是把这些单个绘制的图放在整体的
Tex
中时会出现这样的状况。是的,可以提高查阅速度,提供一些思路
这是字体和编译引擎的问题,和图片没什么关系,目测与
fandol
字体以及fourier-otf
有关,只看报错信息无法debug,如果确实想要消除此警告,给可以复现问题的代码开新的问题。另外,建议为每一张图片新建一个文件夹,其中的
.tex
使用standalone
作为文档类,这样每一张图片都将得到一个.pdf
文件,在主文件main.tex
中\includegraphics
即可。若如此做,各个「画图」与「试卷正文排版」模块间互相独立,更方便管理。