Risa/Asirで円を描くことを考える.
今回はBezier曲線を用いて円を描くことにする.
まず,コードを以下に示す.
引数には中心の座標と,円の半径を指定している.
import("glib3.rr");
/*
https://postd.cc/bezier-curves/
*/
Glib_math_coordinate=1;
glib_window(-2,-2,2,2);
glib_clear();
def draw_bezier3(P,Q,R,S) {
Step=0.01; T=0;
X=P[0]*(1-T)^3+3*Q[0]*T*(1-T)^2+3*R[0]*T^2*(1-T)+S[0]*T^3;
Y=P[1]*(1-T)^3+3*Q[1]*T*(1-T)^2+3*R[1]*T^2*(1-T)+S[1]*T^3;
for (T=Step; T<=1.0; T += Step) {
X2=P[0]*(1-T)^3+3*Q[0]*T*(1-T)^2+3*R[0]*T^2*(1-T)+S[0]*T^3;
Y2=P[1]*(1-T)^3+3*Q[1]*T*(1-T)^2+3*R[1]*T^2*(1-T)+S[1]*T^3;
glib_line(X,Y,X2,Y2 | color=0x0000ff);
X=X2; Y=Y2;
}
}
def draw_Circle2(C,R){
P=deval(R*4*deval(dsqrt(2)-1)/3);
P0=[deval(C[0]+R),deval(C[1])];
P1=[deval(C[0]+R),deval(C[1]+P)];
P2=[deval(C[0]+P),deval(C[1]+R)];
P3=[deval(C[0]),deval(C[1]+R)];
P4=[deval(C[0]-P),deval(C[1]+R)];
P5=[deval(C[0]-R),deval(C[1]+P)];
P6=[deval(C[0]-R),deval(C[1])];
P7=[deval(C[0]-R),deval(C[1]-P)];
P8=[deval(C[0]-P),deval(C[1]-R)];
P9=[deval(C[0]),deval(C[1]-R)];
P10=[deval(C[0]+P),deval(C[1]-R)];
P11=[deval(C[0]+R),deval(C[1]-P)];
draw_bezier3(P0,P1,P2,P3);
draw_bezier3(P3,P4,P5,P6);
draw_bezier3(P6,P7,P8,P9);
draw_bezier3(P9,P10,P11,P0);
}
Glib_math_coordinate=1;
glib_window(-4,-4,4,4);
glib_clear();
draw_Circle2([0,0],2);
glib_flush();
end;
ターミナルで0が出る場合,;を$に置き換えることで解決できる.