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$