我试图通过编写循环来缩短包含大量反射的代码:
[asy]
unitsize(1.5 cm);
pair A,B,C;
real alpha=(20);
real beta=(10);
real gamma=(180-alpha-beta);
real rad=(pi/180);
real AC=(3);
real AB=(AC*sin(beta*rad)/sin(gamma*rad));
A=(0,0);
B=(AB*sin(alpha*rad),AB*cos(alpha*rad));
C=(0,AC);
path t=(C--B--A--C);
draw(t);
label("$A$", A,S);
label("$B$", B,W);
label("$C$", C,N);
path reflection1(path t){
t=(reflect(A,B)*t);
draw(t);
pair A=(reflect(A,B)*A);
pair B=(reflect(A,B)*B);
pair C=(reflect(A,B)*C);
return t;
return A;
return B;
return C;}
path reflection2(path t){
path t=(reflect(A,C)*t);
draw(t);
pair A=(reflect(A,C)*A);
pair B=(reflect(A,C)*B);
pair C=(reflect(A,C)*C);
return t;
return A;
return B;
return C;}
path F(path t){
for(int i=0;i<3;++i){
if(i/2==0){
reflection1(t);
}
else{
reflection2(t);
}
}
return t;
}
draw(F(t));
[/asy]
我想要这样的图表
[asy]
unitsize(1.5 cm);
pair A,B,C;
real alpha=(20);
real beta=(10);
real gamma=(180-alpha-beta);
real rad=(pi/180);
real AC=(3);
real AB=(AC*sin(beta*rad)/sin(gamma*rad));
A=(0,0);
B=(AB*sin(alpha*rad),AB*cos(alpha*rad));
C=(0,AC);
path t=(C--B--A--C);
draw(t);
label("$A$", A,S);
label("$B$", B,W);
label("$C$", C,N);
draw(reflect(A,B)*t);
draw(reflect(A,B)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(A,B)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(A,B)*reflect(A,C)*t);
draw(reflect(A,B)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(B,C)*reflect(A,C)*reflect(A,B)*reflect(A,C)*reflect(A,B)*t);
label("$C_n$",(3,1));
label("$A'$",(6,0),S);
label("$B'$",(5.6,1.5));
label("$C'$",(6,3),N);
label("$A_n$",(3,-2.8));
[/asy]
有人可以帮忙吗?
答案1
我建议采用另一种策略,即在循环内围绕点 Cn 进行旋转:
\documentclass{article}
\usepackage{asymptote}
\begin{document}
\begin{asy}
unitsize(1.5 cm);
pair A,B,C;
real alpha=(20);
real beta=(10);
real gamma=(180-alpha-beta);
real rad=(pi/180);
real AC=(3);
real AB=(AC*sin(beta*rad)/sin(gamma*rad));
A=(0,0);
B=(AB*sin(alpha*rad),AB*cos(alpha*rad));
C=(0,AC);
pair C1=reflect(A,B)*C;
pair Cn=rotate(-2*alpha,A)*C1;
pair An=Cn+(0,-AC);
path t1=(C--B--A--cycle);
path t2=reflect(A,B)*t1;
path t3=reflect(A,C1)*t2;
path[] t4={t1,t2,t3};
filldraw(t4^^reflect(An,Cn)*(t4),green);
path[] t5=rotate(-2*alpha,A)*(t2^^t3);
filldraw(t5,blue);
for(int i=1;i<=8;++i){
filldraw(rotate(i*alpha,Cn)*t5,red);
}
pair[] arrABC={A,B,C};
arrABC=reflect(An,Cn)*arrABC;
label("$A$", A,S);
label("$B$", B,W);
label("$C$",C,N);
label("$C1$", C1,N);
label("$C_n$", Cn,N);
label("$A_n$", An,S);
label("$A'$", arrABC[0],S);
label("$B'$", arrABC[1],W);
label("$C'$", arrABC[2],N);
\end{asy}
\end{document}