import numpy as np, matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt, matplotlib.patches as mp matplotlib.rcParams['font.family']='Noto Sans CJK JP' R=0.25; SENS=0.85; HALF=35 def robot(ax,x,y,col='white',ec='#333',lab=None,z=5): ax.add_patch(mp.Circle((x,y),R,fc=col,ec=ec,lw=1.4,zorder=z)) if lab: ax.text(x,y,lab,ha='center',va='center',fontsize=9,zorder=z+1) def fan(ax,x,y,deg,col): ax.add_patch(mp.Wedge((x,y),SENS,deg-HALF,deg+HALF,fc=col,ec='none',alpha=0.35,zorder=3)) def base(ax,title,verdict,vcol): ax.add_patch(mp.Rectangle((13.0,11.8),11.6,0.6,fc='#cfcfcf',ec='none')); ax.text(15.0,12.1,'パントリー(壁)',fontsize=10,color='#555',va='center') ax.add_patch(mp.Rectangle((15.5,10.6),3.0,1.2,fc='none',ec='#d23',hatch='///',lw=0.8,alpha=0.6)) ax.plot(17.0,11.45,'*',ms=15,color='#d23',zorder=6); ax.text(17.0,10.45,'受け渡し口の前\n(あけておく所)',ha='center',va='top',fontsize=9,color='#d23') ax.add_patch(mp.Rectangle((24.7,10.2),0.9,1.6,fc='#e9dcc6',ec='#a08050')); ax.text(25.15,11.0,'T57',ha='center',va='center',fontsize=9,color='#7a5a2a') ax.add_patch(mp.Rectangle((23.7,9.0),1.0,2.8,fc='#2a9a2a',ec='none',alpha=0.12)); ax.text(24.2,9.15,'右の卓へ\n上がる道',ha='center',va='bottom',fontsize=8,color='#2a7a2a') ax.set_xlim(12.8,25.8); ax.set_ylim(8.9,12.5); ax.set_aspect('equal'); ax.set_xticks([]); ax.set_yticks([]) ax.set_title(title,loc='left',fontsize=14,fontweight='bold') ax.text(1.0,1.02,verdict,transform=ax.transAxes,ha='right',va='bottom',fontsize=11.5,color=vcol,fontweight='bold',bbox=dict(fc='white',ec=vcol,lw=1.5)) def slots(ax,xs,y=11.35,occ=None): for i,x in enumerate(xs): ax.add_patch(mp.Rectangle((x-0.4,y-0.4),0.8,0.8,fc='#eef3ff',ec='#1f4fb0',ls='--',lw=1,zorder=2)) if occ is None or i in occ: robot(ax,x,y,lab=str(i+1)) def gap(ax,x1,x2,y,txt): ax.annotate('',xy=(x1,y),xytext=(x2,y),arrowprops=dict(arrowstyle='<->',color='#333',lw=1)) ax.text((x1+x2)/2,y+0.06,txt,ha='center',va='bottom',fontsize=9) staff=[(13.75,11.25),(15.75,11.25)] fig,axs=plt.subplots(4,1,figsize=(11,15.5),dpi=130) ax=axs[0]; xs=[19.1+0.8*i for i in range(6)]; base(ax,'今:1列・間0.8m・6点','× 隣の台がセンサーに入って止まる','#d23') slots(ax,xs,occ=[0,1,3,4]); gap(ax,xs[3],xs[4],11.75,'0.8m') rx,ry=20.45,10.9; ax.annotate('',xy=(xs[2],11.2),xytext=(19.0,9.3),arrowprops=dict(arrowstyle='->',color='#e08000',lw=2,connectionstyle='arc3,rad=-0.15')) fan(ax,rx,ry,120,'#d23'); robot(ax,rx,ry,col='#ffe2b3',ec='#e08000',lab='3') ax.text(18.0,9.3,'戻ってくる台3は斜めに寄るので、\n隣の台2がセンサー(薄い扇)に入る',fontsize=10,va='bottom',ha='right') ax=axs[1]; xs=[18.9+1.1*i for i in range(5)]; base(ax,'(1) 1列・間1.1m・5点','△ 斜めに寄ると、まだ隣に届くことがある','#e08000') slots(ax,xs,occ=[0,1,3,4]); gap(ax,xs[3],xs[4],11.75,'1.1m') rx,ry=xs[2]-0.35,10.88; ax.annotate('',xy=(xs[2],11.2),xytext=(19.3,9.3),arrowprops=dict(arrowstyle='->',color='#e08000',lw=2,connectionstyle='arc3,rad=-0.15')) fan(ax,rx,ry,120,'#e08000'); robot(ax,rx,ry,col='#ffe2b3',ec='#e08000',lab='3') ax.text(18.6,9.3,'これより広い間は取れない\n(左の赤い所と右の緑の道があるため)',fontsize=10,va='bottom',ha='right') ax=axs[2]; xs=[19.1+0.8*i for i in range(6)]; base(ax,'(2) 間0.8mのまま、真下まで来てからまっすぐ入る','○ まっすぐ入るので、横の台がセンサーに入らない','#2a8a2a') slots(ax,xs,occ=[0,1,3,4]); gap(ax,xs[3],xs[4],11.75,'0.8m') ax.plot([19.0,xs[2]],[9.3,10.0],color='#e08000',lw=2); ax.annotate('',xy=(xs[2],11.15),xytext=(xs[2],10.0),arrowprops=dict(arrowstyle='->',color='#e08000',lw=2)) ax.plot(xs[2],10.0,'o',ms=6,color='#e08000'); ax.text(xs[2]+0.15,9.95,'入る点(待機点の真下)',fontsize=9,va='top',color='#b06000') fan(ax,xs[2],10.45,90,'#2a8a2a'); robot(ax,xs[2],10.45,col='#ffe2b3',ec='#e08000',lab='3') ax.text(18.6,9.3,'店の形は今と同じ。\nロボットの入り方の決まりを足す',fontsize=10,va='bottom',ha='right') ax=axs[3]; xs=[19.0+1.2*i for i in range(4)]; base(ax,'(3) 1列・間1.2m・4点 + 受け渡し口の左に1点','○ 間は広いが、スタッフの持ち場を動かす','#2a8a2a') slots(ax,xs); gap(ax,xs[2],xs[3],11.75,'1.2m') slots(ax,[14.9],occ=[]); robot(ax,14.9,11.35,lab='5') for (x,y) in staff: ax.add_patch(mp.Rectangle((x-0.15,y-0.15),0.3,0.3,fc='#2a6fd6',ec='none',zorder=6,alpha=0.45)) ax.text(14.2,10.55,'青い四角=今のスタッフの持ち場\n(重なる所は動かす)',fontsize=9,color='#2a6fd6',ha='center',va='top') fig.suptitle('⑧ ロボットの待機点の直し方(上から見た図)\n白い丸=待っているロボット、だいだい=戻ってくるロボット、薄い扇=前のセンサー(中心から0.85m。形は簡単にした絵)',x=0.02,ha='left',fontsize=12) plt.tight_layout(rect=(0,0,1,0.955)); plt.savefig('standby_fix_options.png',facecolor='white')