海波
海波
这家伙很懒,什么也没写!

注册于 5年前

回答
11
文章
0
关注者
0

方法二

以下是使用  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}

其实对于想完整的画出图形,准确的画出图形,应该是分析完图形的性质之后再进行动手。很明显三角形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}

这几天几个提问画图的题,应该是先看一下原版的说明书,(已经有大致的中文版了,也在网站里面),然后有了思想之后再来想。

做图就会快很多。

贸然去想的话,不知道绘图软件的一些必要的的一些想法,很难想到一些解决方案。

法四

\documentclass{article}
\usepackage{tikz}
\usepackage{floatrow} % 提供更灵活的浮动排版

\begin{document}

\begin{figure}[ht]
  \floatsetup{floatrowsep=qquad}
  \begin{floatrow}
    \centering
    \begin{tikzpicture}
      \draw (0,0) circle (1cm);
      \node at (0,0) {左图};
    \end{tikzpicture}
    \caption{左图}
    \qquad
    \begin{tikzpicture}
      \draw (0,0) rectangle (2,1);
      \node at (1,0.5) {右图};
    \end{tikzpicture}
    \caption{右图}
  \end{floatrow}
  \caption{并列的两个图形}
\end{figure}

\end{document}

法三

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tabular}{cc}
  \begin{tikzpicture}
    \draw (0,0) circle (1cm);
    \node at (0,0) {左图};
  \end{tikzpicture} &
  \begin{tikzpicture}
    \draw (0,0) rectangle (2,1);
    \node at (1,0.5) {右图};
  \end{tikzpicture} \\
  左图 & 右图 \\
\end{tabular}

\end{document}

法二

\documentclass{article}
\usepackage{tikz}
\usepackage{subcaption} % 提供 subfigure 环境

\begin{document}

\begin{figure}[ht]
  \centering
  \begin{subfigure}[t]{0.48\textwidth}
    \centering
    \begin{tikzpicture}
      \draw (0,0) circle (1cm);
      \node at (0,0) {左图};
    \end{tikzpicture}
    \caption{左图}
  \end{subfigure}
  \hfill
  \begin{subfigure}[t]{0.48\textwidth}
    \centering
    \begin{tikzpicture}
      \draw (0,0) rectangle (2,1);
      \node at (1,0.5) {右图};
    \end{tikzpicture}
    \caption{右图}
  \end{subfigure}
  \caption{并列的两个图形}
\end{figure}

\end{document}

见下

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{minipage}[t]{0.48\textwidth}
  \centering
  \begin{tikzpicture}
    \draw (0,0) circle (1cm);
    \node at (0,0) {左图};
  \end{tikzpicture}
  \captionof{figure}{左图}
\end{minipage}
\hfill
\begin{minipage}[t]{0.48\textwidth}
  \centering
  \begin{tikzpicture}
    \draw (0,0) rectangle (2,1);
    \node at (1,0.5) {右图};
  \end{tikzpicture}
  \captionof{figure}{右图}
\end{minipage}

\end{document}

要解决你的问题,我们需要让 mydraw 命令能够同时处理自定义的键值对(如 color)和标准的 TikZ 绘图选项。以下是改进后的解决方案:

\documentclass{article}
\usepackage{tikz}

\pgfkeys{
  /mycmd/.is family,
  /mycmd/.cd,
  default/.style={color=black},
  color/.store in = \mycmdcolor,
  color=black, % 默认值
}

\newcommand{\mydraw}[1][]{%
  \pgfkeys{/mycmd, default}% 先设置默认值
  \pgfkeys{/mycmd, #1}% 处理用户提供的键值
  \edef\myoptions{color=\mycmdcolor}% 基础选项
  \pgfkeysgetvalue{/mycmd/@unknown}{\unknownkeys}% 获取未知键
  \ifx\unknownkeys\empty\else
    \edef\myoptions{\myoptions, \unknownkeys}% 添加未知键
  \fi
  \draw[\myoptions] (0,0) -- (4,0);%
}

\begin{document}
\begin{tikzpicture}
  \mydraw[color=blue, ->, thick, dashed]
  \mydraw[->, thick, dashed] % 使用默认颜色
  \mydraw[red, line width=2pt] % 直接使用颜色名
\end{tikzpicture}
\end{document}

解决方案说明:

键处理机制:

我们使用 /mycmd 命名空间来处理自定义键(如 color)

默认值设为 black

使用 .store in 存储 color 值到 mycmdcolor

处理未知键:

pgfkeys 会自动将无法识别的键存储在 /mycmd/@unknown 中

我们通过 pgfkeysgetvalue 获取这些未知键

如果存在未知键,将它们添加到绘图选项中

灵活的调用方式:

可以混合使用自定义键和标准 TikZ 选项

可以直接使用颜色名(如 red)而不必写 color=red

支持所有标准 draw 选项(如 ->, thick, dashed 等)

调用示例:

\begin{tikzpicture}
  \mydraw[color=blue, ->, thick, dashed] % 指定颜色和样式
  \mydraw[->, thick, dashed] % 使用默认颜色
  \mydraw[red, line width=2pt] % 直接使用颜色名
  \mydraw[] % 完全使用默认值
\end{tikzpicture}

这种方法既保持了自定义键的处理能力,又能无缝集成所有标准 TikZ 绘图选项。

'''
documentclass{standalone}
usepackage{tkz-euclide}

begin{document}
begin{tikzpicture}

% 定义初始点
\tkzDefPoint(0,0){A}
\tkzDefPoint(10,0){B}
\tkzDefPoint(2,5){D'}
\tkzDefPoint(12,5){C'}

% 绘制线段AB
\tkzDrawSegment(A,B)

% 绘制AD'和BC'
\tkzDrawSegment(A,D')
\tkzDrawSegment(B,C')

% 标记点
\tkzLabelPoints[below left](A)
\tkzLabelPoints[below right](B)
\tkzLabelPoints[above left](D')
\tkzLabelPoints[above right](C')

% 绘制角BAD'的平分线
\tkzDefLine[bisector](D',A,B) \tkzGetPoint{AD_bisector}
\tkzDrawLine[add=0 and 1,color=red](A,AD_bisector)

% 绘制角ABC'的平分线
\tkzDefLine[bisector](C',B,A) \tkzGetPoint{AB_bisector}
\tkzDrawLine[add=0 and 1,color=blue](B,AB_bisector)

% 找到两条角平分线的交点E
\tkzInterLL(A,AD_bisector)(B,AB_bisector) \tkzGetPoint{E}
\tkzLabelPoints[above](E)

% 过E点画任意直线,与AD'和BC'相交于D和C
\tkzDefLine[through=E](E,D') \tkzGetPoint{tempD}
\tkzInterLL(A,D')(E,tempD) \tkzGetPoint{D}

\tkzDefLine[through=E](E,C') \tkzGetPoint{tempC}
\tkzInterLL(B,C')(E,tempC) \tkzGetPoint{C}

% 绘制点D和C
\tkzDrawPoints(D,C)
\tkzLabelPoints[above left](D)
\tkzLabelPoints[above right](C)

% 绘制线段DC
\tkzDrawSegment(D,C)

end{tikzpicture}
end{document}
'''
(手机多次操作,回答代码会异常,好在不影响理解)

这段代码会:

1.定义点 A(0,0)、B(10,0)、D'(2,5) 和 C'(12,5)

2.绘制线段 AB、AD' 和 BC'

3.绘制角 BAD' 和角 ABC' 的平分线(红色和蓝色)

4.找到两条角平分线的交点 E

5.过 E 点画直线与 AD' 和 BC' 相交于 D 和 C

6.绘制线段 DC 并标记所有点

您可以根据需要调整点的位置或添加更多标记。

以下是用 tkz-euclide 绘制您描述的图形的 LaTeX 代码:

documentclass{standalone} usepackage{tkz-euclide} begin{document} begin{tikzpicture} % 定义初始点 tkzDefPoint(0,0){A} tkzDefPoint(10,0){B} tkzDefPoint(2,5){D'} tkzDefPoint(12,2){C'} % 绘制线段AB tkzDrawSegment(A,B) % 绘制AD'和BC' tkzDrawSegment(A,D') tkzDrawSegment(B,C') % 标记点 tkzLabelPointsbelow left tkzLabelPointsbelow right tkzLabelPointsabove left tkzLabelPointsabove right % 绘制角BAD'的平分线 tkzDefLinebisector tkzGetPoint{AD_bisector} tkzDrawLineadd=0 and 1,color=red % 绘制角ABC'的平分线 tkzDefLinebisector tkzGetPoint{AB_bisector} tkzDrawLineadd=0 and 1,color=blue % 找到两条角平分线的交点E tkzInterLL(A,AD_bisector)(B,AB_bisector) tkzGetPoint{E} tkzLabelPointsabove % 过E点画任意直线,与AD'和BC'相交于D和C tkzDefLinethrough=E tkzGetPoint{tempD} tkzInterLL(A,D')(E,tempD) tkzGetPoint{D} tkzDefLinethrough=E tkzGetPoint{tempC} tkzInterLL(B,C')(E,tempC) tkzGetPoint{C} % 绘制点D和C tkzDrawPoints(D,C) tkzLabelPointsabove left tkzLabelPointsabove right % 绘制线段DC tkzDrawSegment(D,C) end{tikzpicture} end{document}

这段代码会:

定义点 A(0,0)、B(10,0)、D'(2,5) 和 C'(12,2)

绘制线段 AB、AD' 和 BC'

绘制角 BAD' 和角 ABC' 的平分线(红色和蓝色)

找到两条角平分线的交点 E

过 E 点画直线与 AD' 和 BC' 相交于 D 和 C

绘制线段 DC 并标记所有点

您可以根据需要调整点的位置或添加更多标记。

水平画一个ab,之后随意画一个ad和bc。之后画两个角平分线,通过交点E任意画一条直线,跟另外两条有交点就解决了。

其中点a点b任意指定,点c和点d的坐标,你可以大致指定,角平分线有直接的命令,他们生成交点E之后,过E画直线你可以自己指定,最后的交点(其实是D,C,前面的可用其他字母)自动生成好的。

我将点的名称,与标注内容分开,为的方便看。如果再有类似的地方,可以晚方便的看出要改动的地方。比如,我只是将标注的式子更了,可以只看那一部分代码。

发布
问题