# 仿真鸟群-Python实现（Win11）

Python 3.10.5 。

## 安装相关包

pip install numpy

pip install matplotlib

pip install scipy

D:\Programs\Python\Python310\python.exe -m pip install –upgrade pip

## 源代码

"""

boids.py

Implementation of Craig Reynold's BOIDs

Author: Mahesh Venkitachalam

"""

import sys, argparse

import math

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.animation as animation

from scipy.spatial.distance import squareform, pdist, cdist

from numpy.linalg import norm

width, height = 640, 480

class Boids:

"""Class that represents Boids simulation"""

def __init__(self, N):

""" initialize the Boid simulation"""

# init position & velocities

self.pos = [width/2.0, height/2.0] + 10*np.random.rand(2*N).reshape(N, 2)

# normalized random velocities

angles = 2*math.pi*np.random.rand(N)

self.vel = np.array(list(zip(np.sin(angles), np.cos(angles))))

self.N = N

# min dist of approach

self.minDist = 25.0

# max magnitude of velocities calculated by "rules"

self.maxRuleVel = 0.03

# max maginitude of final velocity

self.maxVel = 2.0

"""Update the simulation by one time step."""

# get pairwise distances

self.distMatrix = squareform(pdist(self.pos))

# apply rules:

self.vel += self.applyRules()

self.limit(self.vel, self.maxVel)

self.pos += self.vel

self.applyBC()

# update data

pts.set_data(self.pos.reshape(2*self.N)[::2],

self.pos.reshape(2*self.N)[1::2])

vec = self.pos + 10*self.vel/self.maxVel

beak.set_data(vec.reshape(2*self.N)[::2],

vec.reshape(2*self.N)[1::2])

def limitVec(self, vec, maxVal):

"""limit magnitide of 2D vector"""

mag = norm(vec)

if mag > maxVal:

vec[0], vec[1] = vec[0]*maxVal/mag, vec[1]*maxVal/mag

def limit(self, X, maxVal):

"""limit magnitide of 2D vectors in array X to maxValue"""

for vec in X:

self.limitVec(vec, maxVal)

def applyBC(self):

"""apply boundary conditions"""

deltaR = 2.0

for coord in self.pos:

if coord[0] > width + deltaR:

coord[0] = - deltaR

if coord[0] < - deltaR:

coord[0] = width + deltaR

if coord[1] > height + deltaR:

coord[1] = - deltaR

if coord[1] < - deltaR:

coord[1] = height + deltaR

def applyRules(self):

# apply rule #1 - Separation

D = self.distMatrix < 25.0

vel = self.pos*D.sum(axis=1).reshape(self.N, 1) - D.dot(self.pos)

self.limit(vel, self.maxRuleVel)

# different distance threshold

D = self.distMatrix < 50.0

# apply rule #2 - Alignment

vel2 = D.dot(self.vel)

self.limit(vel2, self.maxRuleVel)

vel += vel2;

# apply rule #1 - Cohesion

vel3 = D.dot(self.pos) - self.pos

self.limit(vel3, self.maxRuleVel)

vel += vel3

return vel

def buttonPress(self, event):

"""event handler for matplotlib button presses"""

# left click - add a boid

if event.button is 1:

self.pos = np.concatenate((self.pos,

np.array([[event.xdata, event.ydata]])),

axis=0)

# random velocity

angles = 2*math.pi*np.random.rand(1)

v = np.array(list(zip(np.sin(angles), np.cos(angles))))

self.vel = np.concatenate((self.vel, v), axis=0)

self.N += 1

# right click - scatter

elif event.button is 3:

self.vel += 0.1*(self.pos - np.array([[event.xdata, event.ydata]]))

"""update function for animation"""

return pts, beak

main() function

def main():

# use sys.argv if needed

print('starting boids...')

parser = argparse.ArgumentParser(description="Implementing Craig Reynold's Boids...")

args = parser.parse_args()

# number of boids

N = 100

if args.N:

N = int(args.N)

# create boids

boids = Boids(N)

# setup plot

fig = plt.figure()

ax = plt.axes(xlim=(0, width), ylim=(0, height))

pts, = ax.plot([], [], markersize=10,

c='k', marker='o', ls='None')

beak, = ax.plot([], [], markersize=4,

c='r', marker='o', ls='None')

anim = animation.FuncAnimation(fig, tick, fargs=(pts, beak, boids),

interval=50)

# add a "button press" event handler

cid = fig.canvas.mpl_connect('button_press_event', boids.buttonPress)

plt.show()

call main

if __name__ == '__main__':

main()


## 运行结果

Original: https://blog.csdn.net/Alexabc3000/article/details/126512405
Author: Alexabc3000
Title: 仿真鸟群-Python实现（Win11）

(0)

### 大家都在看

• #### Python入门——函数封装

当工程量比较大时，我们可以采取”函数封装”的方法实现函数的重复使用，避免”重复造轮子”。 步骤 手动创建一个包，只需进行以下 2 步…

Python 2023年8月3日
091
• #### python入门——Pandas透视表(pivot_table)

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Python 2023年1月10日
086
• #### Python 矩阵基本运算【numpy】

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Python 2023年1月10日
0100
• #### 当代人工智能复习2022

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Python 2023年1月27日
097
• #### [selenium]等待

selenium显式等待、隐式等待和期望条件 前言 当网络不稳定或应用页面加载问题时，可以设置等待，以避免网络问题导致找不到元素等异常。 [En] When the network…

Python 2023年5月23日
048
• #### 1┃音视频直播系统之浏览器中通过WebRTC访问摄像头

一、WebRTC的由来 对于前端开发小伙伴而言，如果用 JavaScript 做音视频处理 在以前是不可想象的，因为首先就要考虑浏览器的性能是否跟得上音视频的采集 但是 Googl…

Python 2023年6月10日
054
• #### 【设计模式】Java设计模式 – 享元模式

Java设计模式 – 享元模式 😄 不断学习才是王道🔥 继续踏上学习之路，学之分享笔记👊 总有一天我也能像各位大佬一样🏆原创作品，更多关注我CSDN: 一个有梦有戏的人…

Python 2023年10月21日
036
• #### 学习记录-Python的局部变量和全局变量

1 定义 2 作用域的重要性 2.1 全局作用域中的代码不能使用任何局部变量 2.2 局部作用域中的代码可以访问全局变量 2.3 不同局部作用域中的变量不能相互调用 2.4 在不同…

Python 2023年10月20日
022
• #### python3字符串的常见转义字符

Python 2023年5月24日
060
• #### “华为杯”第十五届中国研究生数学建模竞赛-对恐怖袭击事件记录数据的量化分析（Python,Pandas,Scikit-learn,PyTorch，Matplotlib,seaborn）

首先先说一下编程的工具 Python：编程语言 Pandas:数据处理，清洗,分析的工具 Scikit-learn:机器学习工具箱 PyTorch:深度学习搭建神经网络，训练等的工…

Python 2023年8月31日
0112
• #### 数据库如何加密连接

文章目录 * – 1. 前言 – 2. 如何加密？ – 3. 使用Druid实现加密 – 4. 生成密文 – 5. 添加…

Python 2023年10月7日
034
• #### np.cross()、np.stack()、np.hstack()、np.vstack()、numpy.dstack()、np.split()、np.hsplit()、np.vsplit()函数详解

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Python 2023年1月10日
0144
• #### Python学习笔记#1：使用genfromtxt读取txt中数据

Python学习笔记#1：使用genfromtxt读取txt中数据 1. 语法： numpy.genfromtxt(fname, dtype= 从文本文件加载数据，缺失值按指定处理…

Python 2023年8月26日
092
• #### Pycharm远程调试及MySQL数据库授权问题

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Python 2022年12月28日
095
• #### 【实用教程】使用AlphaFold2进行蛋白质结构在线预测

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Python 2022年8月21日
0820
• #### pytorch:tensor与numpy转换 & .cpu.numpy()和.numpy() & torch.from_numpy VS torch.Tensor

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Python 2023年1月10日
0130