Q and A, 2022-11-11
Bezier 曲線の間を塗りつぶしたい
import("glib3.rr")$
/*
https://postd.cc/bezier-curves/
*/
def fill_rectangle(V1,V2,VV1,VV2,Color) {
Step=1/30;
V1=matrix_list_to_matrix(V1);
V2=matrix_list_to_matrix(V2);
VV1=matrix_list_to_matrix(VV1);
VV2=matrix_list_to_matrix(VV2);
for (T=0; T<=1; T += Step) {
P=number_eval(V1*T+V2*(1-T));
Q=number_eval(VV1*T+VV2*(1-T));
glib_line(P[0],P[1],Q[0],Q[1] | color=Color);
}
}
/*
P,Q,R で定義される bezier2 と
PP,QQ,RR で定義される bezier2
の間を塗りつぶす.
*/
def draw_bezier2_fill(P,Q,R,PP,QQ,RR,Color) {
Step=0.05; T=0;
X=P[0]*(1-T)^2+2*Q[0]*T*(1-T)+R[0]*T^2;
Y=P[1]*(1-T)^2+2*Q[1]*T*(1-T)+R[1]*T^2;
XX=PP[0]*(1-T)^2+2*QQ[0]*T*(1-T)+RR[0]*T^2;
YY=PP[1]*(1-T)^2+2*QQ[1]*T*(1-T)+RR[1]*T^2;
for (T=Step; T<=1.0; T += Step) {
X2=P[0]*(1-T)^2+2*Q[0]*T*(1-T)+R[0]*T^2;
Y2=P[1]*(1-T)^2+2*Q[1]*T*(1-T)+R[1]*T^2;
XX2=PP[0]*(1-T)^2+2*QQ[0]*T*(1-T)+RR[0]*T^2;
YY2=PP[1]*(1-T)^2+2*QQ[1]*T*(1-T)+RR[1]*T^2;
glib_line(X,Y,X2,Y2 | color=Color);
glib_line(XX,YY,XX2,YY2 | color=Color);
fill_rectangle([X,Y],[X2,Y2],[XX,YY],[XX2,YY2],Color);
X=X2; Y=Y2;
XX=XX2; YY=YY2;
}
/* はじが切れる問題の対策 */
glib_line(X,Y,R[0],R[1]);
glib_line(XX,YY,RR[0],RR[1]);
fill_rectangle([X,Y],[R[0],R[1]],[XX,YY],[RR[0],RR[1]],Color);
}
Glib_math_coordinate=1$
glib_window(-4,-4,4,4)$
glib_clear()$
draw_bezier2_fill([-3,0],[1,1],[3,0], [-2,1],[1,2],[3.5,2],0x0000ff);
glib_flush()$
end$