C# WPF 自己写的一个模拟病毒传播的程序,有可视化

源代码: https://github.com/t39q/VirusSpread

主要代码

csharp 复制代码
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace VirusSpread.BussnessLogic
{
    public class VirusSpread
    {
        public static ConcurrentBag<Model.PeopleModel.People> peoples;

        public static void Init()
        {
            peoples = new ConcurrentBag<Model.PeopleModel.People>();
            Random random = new Random(DateTime.Now.Millisecond * DateTime.Now.Second);
            for (int i = 0; i < 100; i++)
            {
                Model.PeopleModel.People people = new Model.PeopleModel.People();
                people.ID = i;
                people.X = random.NextDouble() * 400;
                people.Y = random.NextDouble() * 400;
                people.Disease = false;
                peoples.Add(people);
            }
            for (int i = 100; i < 103; i++)
            {
                Model.PeopleModel.People people = new Model.PeopleModel.People();
                people.ID = i;
                people.X = random.NextDouble() * 400;
                people.Y = random.NextDouble() * 400;
                people.Disease = true;
                peoples.Add(people);
            }
        }
        public static void Run(int spreadCount,int moveDistance)
        {
            int count = 0;
            Random random = new Random(DateTime.Now.Millisecond * DateTime.Now.Second);
            while (true)
            {
                if (count > spreadCount)
                {
                    break;
                }
                foreach (var item in peoples)
                {
                    int parity = random.Next(0,200);
                    double tempX, tempY;
                    if (parity % 2 == 0)
                    {
                        tempX = item.X + random.NextDouble() * moveDistance;
                        tempY = item.Y + random.NextDouble() * moveDistance;
                    }
                    else
                    {
                        tempX = item.X - random.NextDouble() * moveDistance;
                        tempY = item.Y - random.NextDouble() * moveDistance;
                    }
                    
                    if (tempX>0 && tempX < 400 && tempY>0 && tempY < 400)
                    {
                        item.X = tempX;
                        item.Y = tempY;
                    }
                    
                }
                Thread.Sleep(1000);
                count++;
            }
        }
        public static void Spread(int spreadCount,int infectious)
        {
            int count = 0;
            while (true)
            {
                if (count > spreadCount)
                {
                    break;
                }
                var healthy = peoples.Where(item => item.Disease == false).ToList();
                var infected = peoples.Where(item => item.Disease == true).ToList();


                var pairsJoin = (from healthyItem in healthy
                                 from infectedItem in infected
                                 select new { healthyItem, infectedItem }).ToList();

                foreach (var item in pairsJoin)
                {
                    CalcDistance(item.healthyItem, item.infectedItem, out double distance);
                    if (distance < infectious)
                    {
                        var infectedLabel = peoples.Where(find => find.ID == item.healthyItem.ID).FirstOrDefault();
                        infectedLabel.Disease = true;
                    }
                }
                Thread.Sleep(1000);
                count++;
            }
        }
        public static void Display(out string statistics)
        {
            statistics = peoples.Where(item => item.Disease == true).Count().ToString();
        }
        public static void CalcDistance(Model.PeopleModel.People A, Model.PeopleModel.People B, out double distance)
        {
            double X = Math.Abs(A.X - B.X);
            double Y = Math.Abs(A.Y - B.Y);
            distance = Math.Sqrt(X * X + Y * Y);
        }
    }
}
相关推荐
南极企鹅18 分钟前
springBoot项目有几个端口
java·spring boot·后端
清风拂山岗 明月照大江24 分钟前
Redis笔记汇总
java·redis·缓存
xiaoxue..39 分钟前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
JQLvopkk1 小时前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
忧郁的Mr.Li1 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端
yq1982043011561 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class1 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
有位神秘人1 小时前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
golang学习记1 小时前
IntelliJ IDEA 2025.3 重磅发布:K2 模式全面接管 Kotlin —— 告别 K1,性能飙升 40%!
java·kotlin·intellij-idea
爬山算法1 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
java·压力测试·hibernate