在 Asymptote 中,有没有一种简单的方法可以用测量值标记角度?我发现 AoPS 有olympiad
包裹,但它只提供了一种标记角度的方法,而不是用其测量值来标记它们。使用上述包,我设法创建了此图像:
很糟糕。我该如何简单地标记该角度?让您了解我是 Asymptote 的初学者也可能会有所帮助。
以下是上图的代码:
import olympiad;
size(15cm);
markscalefactor = 0.5;
draw((0, 0) -- (22, 63) -- (22, 0) -- cycle);
path angle = anglemark((22, 0), (0, 0), (22, 63));
draw(angle);
draw(rightanglemark((0, 0), (22, 0), (22, 63)));
label("$70^{\circ}$", angle, E);
label("75 m", (0, 0) -- (22, 63), E);
答案1
或者,您可以使用模块markangle
中的函数geometry
,该函数包含在一组基础Asymptote
模块中:
settings.tex="pdflatex";
import geometry;
import fontsize;defaultpen(fontsize(8pt));
texpreamble("\usepackage{lmodern}"+"\usepackage{amsmath}"
+"\usepackage{amsfonts}"+"\usepackage{amssymb}");
void perpMark(picture pic=currentpicture,
pair M, pair O, pair B, real size=5,
pen p=currentpen, filltype filltype = NoFill){
perpendicularmark(pic, M,unit(unit(O-M)+unit(B-M)),size,p,filltype);
}
size(6cm);
pair A=(0,0), B=(12,0), C=(7,9), D=(C.x,0);
real alpha=aTan(abs(C-D)/abs(A-D));
real beta=aTan(abs(C-D)/abs(B-D));
pen p=deepblue+0.6bp;
real w=0.6bp;
markangle(Label("$\alpha$",Relative(0.5)),n=1,radius=-10,C,A,B,red+w);
markangle(Label("$\beta$ ",Relative(0.5)),n=2,radius=-8,A,B,C,deepgreen+w);
markangle(rotate(45+alpha/2)*Label("$90^\circ-\alpha$",Relative(0.5)),n=3,radius=-8,D,C,A,blue+w);
perpMark(D,A,C,gray(0.5)+w,Fill(palegreen));
draw(A--B--C--cycle,deepblue);
draw(D--C,gray(0.5)+w);
dot(A--B--C--D,UnFill);
label("$A$",A,plain.SW);
label("$B$",B,plain.SE);
label("$C$",C,plain.NW);
label("$D$",D,plain.S);
答案2
您的数据似乎不清楚(22,63,75,70
)!您可以根据您的情况调整以下代码。不需要其他包。
一些解释:aTan
以度为单位给出值;atan
以弧度为单位给出值;使用精度数字和 C 语言环境string(real x, int digits=realDigits)
将实数转换为字符串。因此,给出具有 4 个精度数字的值。x
string(angleA,digits=4)
angleA
Asymptote 允许用户高度自定义,也就是说有多种绘制方式。例如,
draw(arc(A,.9,180,180-angleA),red);
可以替换为
draw(arc(A,A+.3*(O-A),B,CW),red);
//http://asymptote.ualberta.ca/
unitsize(1cm);
real a=3, b=4;
pair O=(0,0), A=(a,0), B=(0,b);
real angleA=aTan(b/a); // in degrees
draw(box(O,(.4,.4)),red);
draw(arc(A,.9,180,180-angleA),red);
string Atext=string(angleA,digits=4)+"$^{\circ}$";
label(scale(.5)*Atext,A+.6dir(180-angleA/2),blue);
draw(O--A--B--cycle);
label("$O$",O,SW);
label("$A$",A,SE);
label("$B$",B,NW);
shipout(bbox(5mm,invisible));
更新:这只是为了好玩。我经常创建自己的角度标记命令。该命令rightanglemark
返回一条路径。它可以是draw
、 或 或fill
,并filldraw
带有适当的用途。
unitsize(1.2cm);
// right angle mark as a path
path rightanglemark(pair A, pair C, pair B, real size=.3){
pair Ca=C+size*unit(A-C);
pair Cb=C+size*unit(B-C);
pair Cab=Ca+Cb-C;
return Ca--Cab--Cb;
}
real a=3, b=4;
real c=sqrt(a^2+b^2);
pair O=(0,0), A=(-c/2,0), B=(c/2,0);
real angleA=aTan(b/a), angleB=90-angleA; // in degrees
pair C=c/2*dir(2*angleA);
draw(circle(O,c/2),lightmagenta);
//draw(rightanglemark(A,C,B),red); // to draw angle
//fill(rightanglemark(A,C,B)--C--cycle,palegreen); // >>>to fill angle
filldraw(rightanglemark(A,C,B)--C--cycle,palegreen,red); // >>>to fill and draw angle
draw(arc(A,.4,0,angleA),red);
draw(arc(B,.4,180,180-angleB),red);
draw(arc(B,.45,180,180-angleB),red);
string Atext=string(angleA,digits=4)+"$^{\circ}$";
string Btext=string(angleB,digits=4)+"$^{\circ}$";
label(scale(.6)*Atext,A+.8dir(angleA/2),blue);
label(scale(.6)*Btext,B+.8dir(180-angleB/2),blue);
draw(Label("$a=$ "+string(a),Relative(.5),Rotate(B-C)),B--C);
draw(Label("$c=$ "+string(c),Relative(.5)),A--B);
draw(Label("$b=$ "+string(b),Relative(.5),Rotate(C-A)),C--A);
label("$A$",A,W);
label("$B$",B,E);
label("$C$",C,N);
dot(O,lightmagenta);
shipout(bbox(5mm,invisible));
答案3
使用tzplot
:
\documentclass[tikz]{standalone}
\usepackage{tzplot}
\begin{document}
\begin{tikzpicture}[scale=.1,font=\scriptsize]
\tzcoors(0,0)(A){A}[-135](63,0)(B){B}[0](0,22)(C){C}[135];
\tzpolygon(A)(B){75m}[a](C);
% simple angle marks with labels
\tzanglemark(A)(C)(B){70\textdegree}(5cm)
\tzrightanglemark(B)(A)(C){90\textdegree}[pos=.5,red](5cm)
\tzanglemark[double](A)(B)(C){$\theta$}(5cm)
\end{tikzpicture}
\end{document}