'■ アンチエイリアシングのテスト '■ 右側: アンチエイリアシングなし '■ 左側: あり screen 0 dim x(100),y(100) *loop cls 0 t = 50 fg_color = rgb(31,23,12) : ' 塗りつぶし色 bg_color = rgb(0,0,31) : ' 背景色 color ,,,bg_color '▼ 外側の頂点を定義する(必ず時計周り) for i=0 to t-1 r = 30+rnd(50) x(i) = int(90-xcos(i/t+0.2)*r):y(i) = int(90-xsin(i/t+0.2)*r) next '▼ 内側の頂点を定義する(必ず反時計周り) for i=t to 2*t-1 r = 25-rnd(15) x(i) = int(90-xcos(-i/t+0.2)*r):y(i) = int(90-xsin(-i/t+0.2)*r) next '▼ 頂点を結ぶ for i=0 to t-1 j = (i+1)mod t : x0 = x(i) : y0 = y(i) : x1 = x(j) : y1 = y(j) line(x0+160,y0)-(x1+160,y1),fg_color gosub *draw_line x0 = x(i+t) : y0 = y(i+t) : x1 = x(j+t) : y1 = y(j+t) line(x0+160,y0)-(x1+160,y1),fg_color gosub *draw_line next '▼ 図形ぬりつぶし xx = (x(0)+x(t))/2 yy = (y(0)+y(t))/2 paint(xx+160,yy) ON fg_color paint(xx,yy) ON fg_color '▼ キー入力待ち *key_wait vsync if inkey$<>"" or int(pad(0,1)/8) then *loop goto *key_wait '================================================ '◆ (x0,y0)から(x1,y1)に向かって線を引くルーチン ' 進行方向に対して右手側が塗り潰されたとき矛盾 ' がないように中間色を割り当てる '================================================ *draw_line x0 = int(x0) : y0 = int(y0) x1 = int(x1) : y1 = int(y1) if x0=x1 and y0=y1 then pset (x0,y0),fg_color gosub *dl_calc_color_init if abs(x1-x0) > abs(y1-y0) then draw_line_u = y0+0.5 draw_line_stp = (y1-y0)/abs(x1-x0) if x0>=x1 then dl_flag = 0 else dl_flag = 1 for draw_line_i=x0 to x1 step sgn(x1-x0) gosub *dl_calc_color pset(draw_line_i,draw_line_u),draw_line_c draw_line_u = draw_line_u + draw_line_stp next else draw_line_u = x0+0.5 draw_line_stp = (x1-x0)/abs(y1-y0) if y0<=y1 then dl_flag = 0 else dl_flag = 1 for draw_line_i=y0 to y1 step sgn(y1-y0) gosub *dl_calc_color pset(draw_line_u,draw_line_i),draw_line_c draw_line_u = draw_line_u + draw_line_stp next endif return *dl_calc_color_init dl_fg_R = fg_color and 31 dl_fg_G = (fg_color/32) and 31 dl_fg_B = (fg_color/1024)and 31 dl_bg_R = bg_color and 31 dl_bg_G = (bg_color/32) and 31 dl_bg_B = (bg_color/1024)and 31 return '▼ 中間色を計算する *dl_calc_color dlc_0 = frac(draw_line_u) dlc_1 = &h.fffc-dlc_0 if dl_flag then swap dlc_0,dlc_1 dlc_R = (dlc_0*dl_fg_R + dlc_1*dl_bg_R) + 0.5 dlc_G = (dlc_0*dl_fg_G + dlc_1*dl_bg_G) + 0.5 dlc_B = (dlc_0*dl_fg_B + dlc_1*dl_bg_B) + 0.5 draw_line_c = rgbadd(0,dlc_R,dlc_G,dlc_B) return