|
https://www.washingtonpost.com/graphics/2020/world/corona-simulator/?itid=hp_hp-top-table-main_virus-simulator520pm%3Ahomepage%2Fstory-ans
というワシントンポストのコロナ・シミュレータが気になったので適当にプログラムしてみました。
手直しするところか「こうする」と早くなるなど
色々教えていただけると有難い。
割合などは超適当です。
OPTION ANGLE DEGREES
!' 感染シミュレータ
RANDOMIZE
SET POINT STYLE 7
SET COLOR MIX(9) 1,0.4,0.2
SET COLOR MIX(10) 0.4,1,0.2
LET ppls=100
LET wwd=300
LET wwdy=INT(wwd*0.6)
LET wwdyy=wwdy+10
SET WINDOW 0,wwd,0,wwd
! 設定
LET ppls=200 ! 人数
DIM ppl(ppls,10)
LET pk=0.05 ! 感染率
LET pl=10 ! 感染から発症 未実装
LET pm=10 ! 発症から治癒
LET dm=150 ! 一日の動数
FOR g=1 TO 100
!' 配置と動き
FOR i=1 TO ppls
LET x=wwd/10+wwd*8/10*RND
LET y=wwd/10+wwdy*8/10*RND
DO
LET chk=0
FOR j=1 TO i-1
IF (x-ppl(j,1))^2+(y-ppl(j,2))^2<=64 THEN
LET chk=1
LET x=wwd/10+wwd*8/10*RND
LET y=wwd/10+wwdy*8/10*RND
EXIT FOR
END IF
NEXT j
LOOP UNTIL chk=0
LET ppl(i,1)=x
LET ppl(i,2)=y
LET ppl(i,3)=8
LET ppl(i,4)=360*RND
LET ppl(i,5)=RND*pm
PRINT ".";
IF MOD(i , 10) =0 THEN PRINT
NEXT i
! 感染者
LET ks=INT(ppls*0.05)
FOR k=1 TO ks
DO
LET i=INT(RND*ppls)+1
LOOP UNTIL i>0 AND ppl(i,3)=8
LET ppl(i,3)=9
NEXT k
!' 描画
SET DRAW MODE HIDDEN
FOR i=1 TO ppls
!' DRAW disk WITH SCALE(1/2)*SHIFT(ppl(i,1),ppl(i,2))
SET POINT COLOR ppl(i,3)
PLOT POINTS: ppl(i,1),ppl(i,2)
NEXT I
SET DRAW MODE EXPLICIT
LET t=0
LET cs=0
DO WHILE ks>0
LET t=t+1
LET tt=MOD(t,wwd*12)/18
PRINT ppls-(ks+cs);ks;cs
SET LINE COLOR 8
PLOT LINES : tt,wwdyy;tt,wwdyy+ppls/2
SET LINE COLOR 9
PLOT LINES : tt,wwdyy;tt,wwdyy+ks/2
SET LINE COLOR 10
PLOT LINES : tt,wwdyy+(ppls-cs)/2;tt,wwdyy+ppls/2
SET DRAW MODE HIDDEN
FOR i=1 TO ppls
SET POINT COLOR 0
PLOT POINTS: ppl(i,1),ppl(i,2)
IF RND<1/3 THEN
LET r=RND*2
IF ppl(i,1)+COS(ppl(i,4))<wwd/20 THEN
LET ppl(i,4)=180-ppl(i,4)
ELSEIF ppl(i,1)+COS(ppl(i,4))>19*wwd/20 THEN
LET ppl(i,4)=180-ppl(i,4)
END IF
IF ppl(i,2)+SIN(ppl(i,4))<wwd/20 THEN
LET ppl(i,4)=-ppl(i,4)
ELSEIF ppl(i,2)+SIN(ppl(i,4))>19*wwdy/20 THEN
LET ppl(i,4)=-ppl(i,4)
END if
LET ppl(i,1)=ppl(i,1)+COS(ppl(i,4))*r/3
LET ppl(i,2)=ppl(i,2)+SIN(ppl(i,4))*r/3
END if
IF RND<1/3 THEN
LET ppl(i,4)=ppl(i,4)+RND*6-3
END IF
NEXT I
LET ks=0
FOR i=1 TO ppls
IF ppl(i,3)=9 THEN
LET ppl(i,5)=ppl(i,5)-1/dm
IF ppl(i,5)<0 THEN
LET ppl(i,3)=10
LET cs=cs+1
ELSE
LET ks=ks+1
LET x=ppl(i,1)
LET y=ppl(i,2)
FOR j=1 TO ppls
IF i<>j THEN
IF (x-ppl(j,1))^2+(y-ppl(j,2))^2<=4 AND ppl(j,3)=8 THEN
LET ppl(j,3)=9
LET ks=ks+1
END if
END IF
NEXT j
END IF
END IF
NEXT i
FOR i=1 TO ppls
SET POINT COLOR ppl(i,3)
PLOT POINTS: ppl(i,1),ppl(i,2)
NEXT I
SET DRAW MODE EXPLICIT
LOOP
CLEAR
NEXT g
END
|
|