为什么病毒期间你要待在家里?代码模拟冠状病毒扩散(附源码)

admin 2025-04-28 77人围观 ,发现117个评论

大家好我们都知道自然界大多数现象都属于正态分布,或者说是高斯分布;

人员的流动也是一样的,也满足高斯分布特征,我们将设计这样的一个程序模拟人员流动情况:

这是一个常量类:

publicclassConstants{/***初始感染数量*/publicstaticintORIGINAL_COUNT=50;/***传播率*/publicstaticfloatBROAD_RATE=0.8f;/***潜伏时间*/publicstaticfloatSHADOW_TIME=140;/***医院收治响应时间*/publicstaticintHOSPITAL_RECEIVE_TIME=100;/***医院床位*/publicstaticintBED_COUNT=250;/***流动意向平均值*/publicstaticfloatu=-0.99f;}

这是程序的主入口:

publicclassMain{publicstaticvoidmain(String[]args){MyPanelp=newMyPanel();ThreadpanelThread=newThread(p);JFrameframe=newJFrame();(p);(1000,800);(null);(true);(_ON_CLOSE);();ListPersonpeople=().getPersonList();for(inti=0;_COUNT;i++){intindex=newRandom().nextInt(()-1);Personperson=(index);while(()){index=newRandom().nextInt(()-1);person=(index);}();}}}

这是一个人员类:

publicclassPerson{privateCitycity;privateintx;privateinty;privateMoveTargetmoveTarget;intsig=1;doubletargetXU;doubletargetYU;doubletargetSig=50;publicPerson(Citycity,intx,inty){=city;=x;=y;targetXU=100*newRandom().nextGaussian()+x;targetYU=100*newRandom().nextGaussian()+y;}publicbooleanwantMove(){doublevalue=sig*newRandom().nextGaussian()+;returnvalue0;}privateintstate=;publicintgetState(){returnstate;}publicvoidsetState(intstate){=state;}publicintgetX(){returnx;}publicvoidsetX(intx){=x;}publicintgetY(){returny;}publicvoidsetY(inty){=y;}intinfectedTime=0;intconfirmedTime=0;publicbooleanisInfected(){returnstate=;}publicvoidbeInfected(){state=;infectedTime=;}publicdoubledistance(Personperson){(((),2)+((),2));}privatevoidfreezy(){state=;}privatevoidmoveTo(intx,inty){+=x;+=y;}privatevoidaction(){if(state==){return;}if(!wantMove()){return;}if(moveTarget==null||()){doubletargetX=targetSig*newRandom().nextGaussian()+targetXU;doubletargetY=targetSig*newRandom().nextGaussian()+targetYU;moveTarget=newMoveTarget((int)targetX,(int)targetY);}intdX=()-x;intdY=()-y;doublelength=((dX,2)+(dY,2));if(length1){(true);return;}intudX=(int)(dX/length);if(udX==0dX!=0){if(dX0){udX=1;}else{udX=-1;}}intudY=(int)(dY/length);if(udY==0udY!=0){if(dY0){udY=1;}else{udY=-1;}}if(x700){moveTarget=null;if(udX0){udX=-udX;}}moveTo(udX,udY);//if(wantMove()){//}}privatefloatSAFE_DIST=2f;publicvoidupdate(){if(state=){return;}if(state===_RECEIVE_TIME){Bedbed=().pickBed();if(bed==null){("设置的隔离区已经没有空床位");}else{state=;x=();y=();(false);}}if(_TIMEstate==){state=;confirmedTime=;}action();ListPersonpeople=().personList;if(state=){return;}for(Personperson:people){if(()==){continue;}floatrandom=newRandom().nextFloat();if(_RATEdistance(person)SAFE_DIST){();}}}}

这是我们的人员的状态类:

publicinterfaceState{intNORMAL=0;//正常状态intSUSPECTED=NORMAL+1;//有嫌疑intSHADOW=SUSPECTED+1;//潜伏期intCONFIRMED=SHADOW+1;//被确诊intFREEZE=CONFIRMED+1;//严重状intCURED=FREEZE+1;//治愈出院}

这是医院类:

publicclassHospital{privateintx=800;privateinty=110;privateintwidth;privateintheight=606;publicintgetWidth(){returnwidth;}publicintgetHeight(){returnheight;}publicintgetX(){returnx;}publicintgetY(){returny;}privatestaticHospitalhospital=newHospital();publicstaticHospitalgetInstance(){returnhospital;}privatePointpoint=newPoint(800,100);privateListBedbeds=newArrayList();privateHospital(){if(_COUNT==0){width=0;height=0;}intcolumn=_COUNT/100;width=column*6;for(inti=0;icolumn;i++){for(intj=10;j=610;j+=6){Bedbed=newBed(()+i*6,()+j);(bed);}}}publicBedpickBed(){for(Bedbed:beds){if(()){returnbed;}}returnnull;}}

这是我们绘制的面板:

publicclassMyPanelextsJPanelimplementsRunnable{privateintpIndex=0;publicMyPanel(){(newColor(0x444444));}@Overridepublicvoidpaint(Graphicsarg0){(arg0);//(newColor(0x00ff00));//绘制一个医院的隔离区(().getX(),().getY(),().getWidth(),().getHeight());ListPersonpeople=().getPersonList();if(people==null){return;}(pIndex).update();for(Personperson:people){switch(()){:{(newColor(0xdddddd));}break;:{(newColor(0xffee00));}break;::{(newColor(0xff0000));}break;}();((),(),3,3);}pIndex++;if(pIndex=()){pIndex=0;}}publicstaticintworldTime=0;@Overridepublicvoidrun(){while(true){();try{(100);worldTime++;}catch(InterruptedExceptione){();}}}}

代码地址:

猜你喜欢
    不容错过