![如何在具有角度约束的线上创建点?](https://linux22.com/image/382808/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%85%B7%E6%9C%89%E8%A7%92%E5%BA%A6%E7%BA%A6%E6%9D%9F%E7%9A%84%E7%BA%BF%E4%B8%8A%E5%88%9B%E5%BB%BA%E7%82%B9%EF%BC%9F.png)
我想D
在线上定义一个点 (节点) AC
,使得 angleABC
等于 angle CDE
。如何使用 PSTricks 最简单的技巧来实现这一点?
\documentclass[pstricks,border=1cm]{standalone}
\usepackage{pst-eucl}
\begin{document}
\begin{pspicture}(8,-6)
\pstTriangle(0,-6){B}(8,-6){A}(2,0){C}
\pstMarkAngle{A}{B}{C}{}
\pstGeonode[PosAngle=180]([nodesep=4]{B}C){E}
\end{pspicture}
\end{document}
答案1
直线 ED 与水平线之间的角度是 beta-alpha,这就是我们知道直线斜率的原因。
\documentclass[pstricks,border=1cm]{standalone}
\usepackage{pst-eucl}
\begin{document}
\begin{pspicture}(8,-6)
\pstTriangle(0,-6){B}(8,-6){A}(2,0){C}
\pstMarkAngle{A}{B}{C}{}
\pstGeonode[PosAngle=180]([nodesep=4]{B}C){E}%
(! \psGetNodeCenter{A} \psGetNodeCenter{B}
\psGetNodeCenter{C} \psGetNodeCenter{E}
C.y A.y sub A.x C.x sub atan /Alpha ED
C.y B.y sub C.x B.x sub atan /Beta ED
Beta Alpha sub abs Tan E.y add E.x 1 add exch ){D'}
\pstInterLL{C}{A}{E}{D'}{D}
\pstLineAB[linecolor=red]{D}{E}
\pstMarkAngle[linecolor=red]{C}{D}{E}{}
\end{pspicture}
\end{document}
答案2
不确定这是否是最简单的。但它确实有效。
\documentclass[pstricks,border=1cm]{standalone}
\usepackage{pst-eucl}
\begin{document}
\begin{pspicture}(8,-6)
\pstTriangle(0,-6){B}(8,-6){A}(2,0){C}
\pstMarkAngle{A}{B}{C}{}
\pstGeonode[PosAngle=180]([nodesep=4]{B}C){E}
\pstInterLC[PointSymbol=none,PointName=none]{C}{A}{C}{E}{G}{F}
\pstTranslation[PointSymbol=none,PointName=none]{A}{B}{F}
\pstInterLL[PointSymbol=none,PointName=none]{C}{B}{F}{F'}{D'}
\pstInterLC{C}{A}{C}{D'}{G'}{D}
\pstLineAB{D}{E}
\pstMarkAngle{C}{D}{E}{}
%\pstArcOAB[linecolor=blue]{C}{E}{A}
%\pstLineAB{F}{F'}
%\pstArcOAB[linecolor=blue]{C}{D'}{A}
\end{pspicture}
\end{document}
要查看构造,只需删除三个[PointSymbol=none,PointName=none]
并取消注释 中的最后三行pspicture
。
答案3
仅供比较,任何与pst-eucl
语法和文档搏斗的人,可能都想尝试这种类型的东西元帖子,使用线性变量的优雅隐式定义。
\documentclass[border=5mm]{standalone}
\usepackage{luatex85}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
vardef angle_mark(expr a, b, c, r) =
fullcircle scaled 2r
rotated angle (a-b)
shifted b
cutafter (b--c)
enddef;
beginfig(1);
pair A, B, C, D, E;
A = 6 right scaled 1cm;
B = 2 left scaled 1cm;
C = 6 up scaled 1cm;
E = 1/5[B,C]; % or wherever you like along B--C....
numeric a, b, d, e;
a = abs(B-C);
b = abs(C-A);
d = abs(C-E);
a/b = e/d; % implicitly define "e"
D = (e/b)[C,A]; % D is then e/b along C--A...
label.ulft("$a$", 1/2[B,C]) withcolor 2/3 blue;
label.urt ("$b$", 1/2[A,C]) withcolor 2/3 blue;
label.lrt ("$d$", 1/2[C,E]) withcolor 2/3 blue;
label.llft("$e$", 1/2[C,D]) withcolor 2/3 blue;
draw angle_mark(A, B, C, 12) withcolor 2/3 red;
draw angle_mark(C, D, E, 12) withcolor 2/3 red;
draw A--B--C--cycle;
draw D--E;
dotlabel.lrt ("$A$", A);
dotlabel.llft("$B$", B);
dotlabel.top ("$C$", C);
dotlabel.urt ("$D$", D);
dotlabel.ulft("$E$", E);
endfig;
\end{mplibcode}
\end{document}
答案4
只是为了好玩:一个 Ti钾Z 解决方案。请注意,tkz-euclide 包提供了与这些 pstricks 代码非常相似的语法。然而,这个答案的重点只是说在 Ti钾Z 有 calc 语法,诚然,第一次看到它时会有点奇怪。但是,我想说的是,一旦熟悉了它,它就会比市场上的其他助手更强大、更通用。无需为每种目的定义一个新的复杂宏,calc
允许以通用的方式处理所有这些事情。
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw (0,-6) coordinate (B) -- (8,-6) coordinate (A) -- (2,0) coordinate (C)
-- cycle;
\draw let \p1=($(C)-(B)$),\p2=($(A)-(B)$),\n1={(atan2(\y1,\x1)+atan2(\y2,\x2))/2}
in (B) ++ ({\n1}:4) coordinate (D)
(B) -- (intersection cs:first line={(A)--(C)}, second line={(B)--(D)});
\end{tikzpicture}
\end{document}