当前位置: 首页 > news >正文

做编程的 网站有哪些用户体验地图用什么软件画

做编程的 网站有哪些,用户体验地图用什么软件画,重庆公司注册服务,关键词优化公司排名类鸟群#xff1a;仿真鸟群 仔细观察一群鸟或一群鱼#xff0c;你会发现#xff0c;虽然群体由个体生物组成#xff0c;但该群体作为一个整体似乎有它自己的生命。鸟群中的鸟在移动、飞越和绕过障碍物时#xff0c;彼此之间相互定位。受到打扰或惊吓时会破坏编队#xf…类鸟群仿真鸟群 仔细观察一群鸟或一群鱼你会发现虽然群体由个体生物组成但该群体作为一个整体似乎有它自己的生命。鸟群中的鸟在移动、飞越和绕过障碍物时彼此之间相互定位。受到打扰或惊吓时会破坏编队但随后重新集结仿佛被某种更大的力量控制。 1986年Craig Reynolds创造鸟类群体行为的一种逼真模拟称为“类鸟群Boids”模型。关于类鸟群模型值得注意的是只有 3 个简单的规则控制着群体中个体间的相互作用但该模型产生的行为类似于真正的鸟群。类鸟群模型被广泛研究甚至被用来制作群体的计算机动画如电影“蝙蝠侠归来1992”中的行军企鹅。 本项目将利用 Reynolds 的 3 个规则创建一个类鸟群模拟 N 只鸟的群体行为并画出随着时间的推移它们的位置和运动方向。我们还会提供一个方法向鸟群中添加一只鸟以及一种驱散效果可以用于研究群体的局部干扰效果。类鸟群被称为“N 体模拟”因为它模拟了 N 个粒子的动态系统彼此之间施加作用力。 工作原理 模拟类鸟群的三大核心规则如下 分离保持类鸟个体之间的最小距离 列队让每个类鸟个体指向其局部同伴的平均移动方向 内聚让每个类鸟个体朝其局部同伴的质量中心移动。 类鸟群模拟也可以添加其他规则如避开障碍物或受到打扰时驱散鸟群在随后的小节中我们将会探讨这些。这个版本的类鸟群在模拟的每一步中实现了这些核心规则。 对于群体中的所有类鸟个体做以下几件事 应用三大核心规则应用所有附加规则应用所有边界条件。更新类鸟个体的位置和速度。绘制新的位置和速度。 如你所见这些简单的规则创造了一个鸟群它具有演变的复杂行为。 所需模块 下面是该模拟要用到的 Python 工具 numpy 数组用于保存类鸟群的位置和速度matplotlib 库用于生成类鸟群动画argparse用于处理命令行选项scipy.spatial.distance 模块包含一些非常简洁的方法计算点之间的距离。 代码 首先要计算类鸟群的位置和速度。接下来要为模拟设置边界条件看看如何绘制类鸟群并实现前面讨论的类鸟群模拟规则。最后我们会为模拟添加一些有趣的事件即添加一些类鸟个体和驱散类鸟群。 计算类鸟群的位置和速度 类鸟群仿真需要从 numpy 数组取得信息计算每一步中类鸟群个体的位置和速度。模拟开始时将所有类鸟群个体大致放在屏幕中央速度设置为随机的方向。 import math import numpy as npwidth, height 640, 480pos [width/2.0, height/2.0] 10*np.random.rand(2*N).reshape(N, 2) angles 2*math.pi*np.random.rand(N) vel np.array(list(zip(np.sin(angles), np.cos(angles))))开始在第一行导入 math 模块用于接下来的计算。在第二行将 numpy 库导入为 np少一些录入。然后设置屏幕上模拟窗口的宽度和高度。在第四行创建一个 numpy 数组 pos对窗口中心加上 10 个单位以内的随机偏移。代码np.random.rand2 * N创建了一个一维数组包含范围在[01]的 2N 个随机数。然后 reshape()调用将它转换成二维数组的形状N2它将用于保存类鸟群个体的位置。也要注意numpy 的广播规则在这里生效1×2 的数组加到 N×2 的数组的每个元素上。 接下来用以下方法创建随机单位速度矢量数组这些都是模为 1.0 的矢量指向随机的方向给定一个角度 t数字对(cos(t), sin(t))位于半径为 1.0 的圆上中心在原点(0, 0)。如果从原点到圆上的一点画一条线就得到一个单位矢量它取决于角度 A。如果随机选择角度 A就得到一个随机速度矢量。下图展示了这个方案。 在第五行生成一个数组包含 N 个随机角度范围在[0, 2pi]在第六行用前面讨论的随机向量方法生成一个数组并用内置的 zip()方法将坐标分组。 设置边界条件 鸟儿飞翔在无际的天空但类鸟群必须在有限的空间中运动。要创建这个空间就要创建边界条件在这个例子中我们采用“平铺小块边界条件”。 将类鸟群模拟想象成发生在一个平铺的空间如果类鸟群个体离开一个小块它将从相反的方向进入到相同的小块。环形边界条件和小块边界条件之间的主要区别是类鸟群模拟不会发生在离散的网格上而是在一个连续区域移动。下图展示了这些小块边界条件的样子。请看下图中间的小块。飞出右侧的鸟儿正进入右边的小块但该边界条件确保它们实际上通过平铺在左边的小块又回到了中心的小块。在顶部和底部的小块可以看到同样的事情发生。 下面是如何为类鸟群模拟实现平铺小块边界条件 def applyBC(self):apply boundary conditionsdeltaR 2.0for coord in self.pos:if coord[0] width deltaR:coord[0] - deltaRif coord[0] - deltaR:coord[0] width deltaRif coord[1] height deltaR:coord[1] - deltaRif coord[1] - deltaR:coord[1] height deltaR在第五行如果 x 坐标比小块的宽度大则将它设置回小块的左侧边缘。该行中的 deltaR 提供了一个微小的缓冲区它允许类鸟群个体开始从相反方向回来之前稍稍移出小块之外一点从而产生更好的视觉效果。在小块的左侧、顶部和底部边缘执行类似的检查。 绘制类鸟群 要生成动画需要知道类鸟群个体的位置和速度并有办法在每个时间步骤中表示位置和运动方向。 绘制类鸟群个体的身体和头部 为了生成类鸟群动画我们用 matplotlib 和一点小技巧来绘制位置和速度。将每个类鸟群个体画成两个圆如下图所示。较大的圆代表身体较小的圆表示头部。点 P 是身体的中心H 是头部的中心。根据公式 H P k × V 来计算 H 的位置其中 V 是类鸟群个体的速度k 是常数。在任何给定时间类鸟群个体的头指向运动的方向。这指明了类鸟群个体的移动方向比只画身体更好。 在下面的代码片段中利用 matplotlib用圆形标记画出类鸟群个体的身体。 fig plt.figure() ax plt.axes(xlim(0, width), ylim(0, height))pts, ax.plot([], [], markersize10, ck, markero, lsNone) beak, ax.plot([], [], markersize4, cr, markero, lsNone) anim animation.FuncAnimation(fig, tick, fargs(pts, beak, boids),interval50)在第三和第四行分别为类鸟群个体的身体pts和头部beak标记设置大小和形状。在第五行为动画窗口添加鼠标按钮事件。既然知道了如何绘制身体和喙让我们看看如何更新它们的位置。 更新类鸟群个体的位置 动画开始后需要更新身体和头的位置它指明了类鸟群个体移动的方向。用以下代码来实现 vec self.pos 10*self.vel/self.maxVel beak.set_sdata(vec.rehape(2*self.N)[::2], vec.reshape(2*self.N)[1::2])在第一行计算头部的位置即在速度vel的方向上增加 10 个单位的位移。该位移确定了喙和身体之间的距离。在第二行用头部位置的新值来更新reshapematplotlib 的轴set_data。[::2]从速度列表中选出偶数元素x 轴的值[1::2]选出奇数元素Y 轴的值。 应用类鸟群规则 现在要在 Python 中实现类鸟群的 3 个规则。我们用“numpy 的方式”来完成这件事避免循环并利用高度优化的 numpy 方法。 import numpy as np from scipy.spatial.distance import squareform, pdist, cdistdef test2(pos, radius):# get distance matrixdistMatrix squareform(pdist(pos))# apply thresholdD distMatrix radius# compute velocityvel pos*D.sum(axis1).reshape(N, 1) - D.dot(pos)return vel在第五行用 squareform()和 pdist()方法在 scipy 库中定义来计算一组点之间两两的距离从数组中任意取两点计算距离然后针对所有可能的两点对这么做。 squareform()方法给出一个 3×3 矩阵其中项 Mij 给出了点 Pi和 Pj 之间的距离。接下来在第七行基于距离筛选这个矩阵。 在第九行的方法有点复杂。D.sum()方法按列对矩阵中的 True 值求和。reshape 是必需的因为和是 N 个值的一维数组形如(N)而你希望它形如N1这样它就能够与位置数组相乘。D.dot()就是矩阵和位置矢量的点积乘法。 下面的方法利用前面讨论的 numpy 技术应用类鸟群的 3 个规则 def applyRules(self):# apply rule #1: SeparationD distMatrix 25.0vel self.pos*D.sum(axis1).reshape(self.N, 1) - D.dot(self.pos)#应用分离规则时每个个体都被“推离”相邻个体一定距离#计算出的速度被限制在某个最大值以内self.limit(vel, self.maxRuleVel)# distance threshold for alignment (different from separation)D distMatrix 50.0# apply rule #2: Alignmentvel2 D.dot(self.vel)#应用列队规则时50 个单位的半径内所有相邻个体的速度之和限制为一个最大值 self.limit(vel2, self.maxRuleVel)vel vel2;# apply rule #3: Cohesionvel3 D.dot(self.pos) - self.pos#为每个个体增加一个速度矢量它指向一定半径内相邻个体的重心或几何中心 self.limit(vel3, self.maxRuleVel)vel vel3return vel添加个体 类鸟群模拟的核心规则会导致类鸟群展示出群聚行为。但是让我们在模拟过程中添加一个个体看看表现如何让事情变得更有趣。 下面的代码创建一个鼠标事件让你点击鼠标左键添加一个个体。个体将出现在光标的位置具有随机指定的速度 # 用 mpl_connect()方法向 matplotlib 画布添加一个按钮按下事件 cid fig.canvas.mpl_connect(button_press_event, buttonPress)现在为了处理鼠标事件实际创建类鸟群个体添加以下代码 def buttonPress(self, event):event handler for matplotlib button presses#确保鼠标事件是左键点击if event.button is 1:#将(event.xdataevent.ydata)给出的鼠标位置添加到类鸟群的位置数组 self.pos np.concatenate((self.pos, np.array([[event.xdata, event.ydata]])), axis0)# 将一个随机速度矢量添加到类鸟群的速度数组并将类鸟群的计数增加 1angles 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), axis0)self.N 1驱散类鸟群 3 个模拟规则保持类鸟群在移动时成为一个群体。但是群体受到惊扰时会发生什么为了模拟这种情况可以引入一种“驱散”效果如果在用户界面UI窗口中单击右键群体就会分散。你可以认为这是群体面对突然出现的捕食者的反应或突然出现一声巨响惊吓了鸟群。下面是实现该效果的一种方式它作为buttonPress()方法的延续 # 检查鼠标按键是否是右键单击事件elif event.button is 3:# 改变每个个体的速度在干扰出现的点即点击鼠标的位置的相反的方向上增加一个分量 self.vel 0.1*(self.pos - np.array([[event.xdata, event.ydata]]))最初类鸟群将飞离该点但你会看到3 个规则胜出类鸟群将作为群体再次会聚。 命令行参数 下面是类鸟群程序如何处理命令行参数 parser argparse.ArgumentParser(descriptionImplementing CraigReynoldss Boids...)# add arguments parser.add_argument(--num-boids, destN, requiredFalse) args parser.parse_args()# set the initial number of boids N 100 if args.N:N int(args.N)# create boids boids Boids(N)Boids 类 接下来看看 Boids 类它代表了模拟。 class Boids:class that represents Boids simulationdef __init__(self, N):initialize the Boid simulation# 初始化位置和速度数组self.pos [width/2.0, height/2.0] 10*np.random.rand(2*N).reshape(N, 2)# normalized random velocitiesangles 2*math.pi*np.random.rand(N)self.vel np.array(list(zip(np.sin(angles), np.cos(angles))))self.N N # minimum distance of approachself.minDist 25.0# maximum magnitude of velocities calculated by rulesself.maxRuleVel 0.03# maximum magnitude of the final velocityself.maxVel 2.0Boid 类处理初始化更新动画并应用规则。 boids.tick()在每个时间步骤被调用以便更新动画如下所示 def tick(frameNum, pts, beak, boids):#print frameNumupdate function for animationboids.tick(frameNum, pts, beak)return pts, beak我们还需要一种方法来限制某些矢量的值。否则速度将在每个时间步骤无限制地增加模拟将崩溃。 def limitVec(self, vec, maxVal):limit the magnitude of the 2D vectormag norm(vec)if mag maxVal:vec[0], vec[1] vec[0]*maxVal/mag, vec[1]*maxVal/mag#限制了数组中的值采用模拟规则计算出的值def limit(self, X, maxVal):limit the magnitude of 2D vectors in array X to maxValuefor vec in X:self.limitVec(vec, maxVal)完整代码 下面是类鸟群模拟的完整程序: 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 normwidth, height 640, 480class Boids:class that represents Boids simulationdef __init__(self, N):initialize the Boid simulation# 初始化位置和速度数组self.pos [width/2.0, height/2.0] 10*np.random.rand(2*N).reshape(N, 2)# normalized random velocitiesangles 2*math.pi*np.random.rand(N)self.vel np.array(list(zip(np.sin(angles), np.cos(angles))))self.N N # minimum distance of approachself.minDist 25.0# maximum magnitude of velocities calculated by rulesself.maxRuleVel 0.03# maximum magnitude of the final velocityself.maxVel 2.0def tick(self, frameNum, pts, beak):#print frameNumupdate function for animationself.distMatrix squareform(pdist(self.pos))self.vel self.applyRules()self.limit(self.vel, self.maxVel)self.pos self.velself.applyBC()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.maxVelbeak.set_data(vec.reshape(2*self.N)[::2], vec.reshape(2*self.N)[1::2])def limitVec(self, vec, maxVal):limit the magnitude of the 2D vectormag norm(vec)if mag maxVal:vec[0], vec[1] vec[0]*maxVal/mag, vec[1]*maxVal/mag#限制了数组中的值采用模拟规则计算出的值def limit(self, X, maxVal):limit the magnitude of 2D vectors in array X to maxValuefor vec in X:self.limitVec(vec, maxVal)def applyBC(self):apply boundary conditionsdeltaR 2.0for coord in self.pos:if coord[0] width deltaR:coord[0] - deltaRif coord[0] - deltaR:coord[0] width deltaRif coord[1] height deltaR:coord[1] - deltaRif coord[1] - deltaR:coord[1] height deltaRdef applyRules(self):# apply rule #1: SeparationD self.distMatrix 25.0vel self.pos*D.sum(axis1).reshape(self.N, 1) - D.dot(self.pos)self.limit(vel, self.maxRuleVel)# distance threshold for alignment (different from separation)D self.distMatrix 50.0# apply rule #2: Alignmentvel2 D.dot(self.vel)self.limit(vel2, self.maxRuleVel)vel vel2;# apply rule #3: Cohesionvel3 D.dot(self.pos) - self.posself.limit(vel3, self.maxRuleVel)vel vel3return veldef buttonPress(self, event):event handler for matplotlib button presses# left-click to add a boidif event.button is 1:self.pos np.concatenate((self.pos, np.array([[event.xdata, event.ydata]])), axis0)# generate a random velocityangles 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), axis0)self.N 1# right-click to scatter boidselif event.button is 3:# add scattering velocityself.vel 0.1*(self.pos - np.array([[event.xdata, event.ydata]]))def tick(frameNum, pts, beak, boids):boids.tick(frameNum, pts, beak)return pts, beakdef main():print(starting boids...)parser argparse.ArgumentParser(descriptionImplementing CraigReynoldss Boids...)# add argumentsparser.add_argument(--num-boids, destN, requiredFalse)args parser.parse_args()# set the initial number of boidsN 100if args.N:N int(args.N)# create boidsboids Boids(N)fig plt.figure()ax plt.axes(xlim(0, width), ylim(0, height))pts, ax.plot([], [], markersize10, ck, markero, lsNone)beak, ax.plot([], [], markersize4, cr, markero, lsNone)anim animation.FuncAnimation(fig, tick, fargs(pts, beak, boids),interval50)# 用 mpl_connect()方法向 matplotlib 画布添加一个按钮按下事件cid fig.canvas.mpl_connect(button_press_event, boids.buttonPress)plt.show()if __name__ __main__:main()
http://www.tj-hxxt.cn/news/135373.html

相关文章:

  • 请选择一个网站制作软件无代码制作网页
  • 免费个人网站怎么建立步骤网站设计怎么做好
  • 有关网站开发的书籍wordpress 新手
  • 注册网站地址湘潭市网站建设科技有限公司
  • wordpress调用百度网盘视频播放器seo推广主管
  • 网页搜索一个网站全包30条新闻摘抄
  • 建设网站银行网站不备案有什么影响
  • html5 做手机网站wordpress 加下载
  • 安吉做网站南宁网站建设是什么
  • 网站备案能查到什么东西网页游戏浏览器
  • 网站建立的连接不安全网站关键词排名消失
  • 提高网站建设水平无法与wordpress建立连接
  • 网站建设方案主要是做网站资源存储
  • php外贸网站做网站的市场前景
  • 网站建设查看框架的源代码一个企业网站如何能放到互联网上 vps
  • 聊城网站建设潍坊如何创建wordpress
  • 聊城手机站网站公司电话wordpress get_pages()
  • 温岭网站建设公司珠海外贸网站建设
  • 如何做网站布局优化推广类软文
  • 网站开发报价表格江阴招聘网站建设学徒
  • 网站建设表的设计固阳网站建设
  • 哪个网站可以做代码题目网站开发实现的环境
  • 福州网站建设企业哪家好?沈阳市建设工程信息网站
  • 网站微信二维码侧边栏漂浮框怎样建设个人影视网站
  • 青岛仿站定制模板建站网站建设的优点与不足
  • 普通网站建设的缺陷网站文明专栏建设
  • 响应式环保网站wordpress分类随机文章
  • 淘客必须做网站网站底部流程
  • 网站开发面板常州网站建设推广
  • 做网站建设出路在哪里深圳网站设计go