感染が話題なので

 投稿者:moonlight  投稿日:2020年 3月17日(火)20時13分44秒
  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
 

戻る