Guest User

Untitled

a guest
Nov 20th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. using Plots
  2. using LinearAlgebra
  3. using Random
  4. Random.seed!(2018)
  5. gr(size=(300,300),titlefont=font("sans-serif",9))
  6.  
  7.  
  8. module Boids
  9. struct Param
  10. d::Int64 #dimention
  11. N::Int64 #Number of boid
  12. distThresh::Float64 #threshold distance of rule1
  13. maxSpeed::Float64 #maximum speed
  14. minSpeed::Float64 #minimum speed
  15. maxWorld::Float64 #world upper limit
  16. minWorld::Float64 #world lower limit
  17.  
  18. #R::Float64
  19. ω1::Float64 #rule1 weight
  20. ω2::Float64 #rule2 weight
  21. ω3::Float64 #rule3 weight
  22. end
  23. mutable struct Variables
  24. p::Array{Float64,2} #Boid positions
  25. v::Array{Float64,2} #Boid velocities
  26. v1::Array{Float64,2} #rule1 output
  27. v2::Array{Float64,2} #rule2 output
  28. v3::Array{Float64,2} #rule3 output
  29. end
  30. end
  31.  
  32. using .Boids
  33. d=2
  34. N=50
  35.  
  36. distThresh=10.0
  37.  
  38. #R=10.0 #radius
  39. ω1=0.1
  40. ω2=0.4
  41. ω3=1/300
  42.  
  43. maxSpeed=4.0
  44. minSpeed=1.0
  45.  
  46. minWorld=0
  47. maxWorld=150
  48.  
  49. worldSize=abs(maxWorld-minWorld)
  50.  
  51. param1=Boids.Param(d,N,distThresh,maxSpeed,minSpeed,maxWorld,minWorld,ω1,ω2,ω3)
  52.  
  53. p=rand(N,d).*worldSize
  54. v=(rand(N,d).-0.5)
  55. #a=rand(N,d) #acceleration
  56.  
  57. v1=zeros(N,d)
  58. v2=zeros(N,d)
  59. v3=zeros(N,d)
  60.  
  61. var1=Boids.Variables(p,v,v1,v2,v3)
  62.  
  63. #clear output vector
  64. function clear_vec(var)
  65. var.v1.=0.0
  66. var.v2.=0.0
  67. var.v3.=0.0
  68. end
  69.  
  70. #rule1 Collision avoidance
  71. function rule1(param,var)
  72. for i in 1:param.N
  73. for j in 1:param.N
  74. if i==j;continue;end
  75. dist=norm(var.p[j,:].-var.p[i,:])
  76. #If the distance to a boid j is shorter than constant distance
  77. if dist < param.distThresh
  78. var.v1[i,:].-=(var.p[j,:].-var.p[i,:])
  79. end
  80. end
  81. end
  82. end
  83.  
  84. #rule2 Velocity Matching
  85. function rule2(param,var)
  86. for i in 1:param.N
  87. for j in 1:param.N
  88. if i==j;continue;end
  89. var.v2[i,:].+=var.v[j,:]
  90. end
  91. end
  92. var.v2.=var.v2./(param.N-1)
  93. var.v2.=var.v2.-var.v
  94. end
  95.  
  96. #rule3 Flock Centering
  97. function rule3(param,var)
  98. for i in 1:param.N
  99. for j in 1:param.N
  100. if i==j;continue;end
  101. var.v3[i,:].+=var.p[j,:]
  102. end
  103. end
  104. var.v3.=var.v3./(param.N-1)
  105. var.v3.=var.v3.-var.p
  106. end
  107.  
  108. #limit velocity
  109. function limit_vel(param,var)
  110. for i in 1:param.N
  111. speed=norm(var.v[i,:])
  112. clamped=clamp(speed,param.minSpeed,param.maxSpeed)
  113. var.v[i,:].*=(clamped/speed)
  114. end
  115. end
  116.  
  117. #check boundary
  118. function check_boundary(param,var)
  119. for i in 1:param.N
  120. for n in 1:param.d
  121. if ((var.p[i,n]<param.minWorld && var.v[i,n]<0) || (var.p[i,n]>param.maxWorld && var.v[i,n]>0))
  122. var.v[i,n]*=-1.0
  123. end
  124. end
  125. end
  126. end
  127.  
  128. function update(param,var)
  129. clear_vec(var)
  130. rule1(param,var)
  131. rule2(param,var)
  132. rule3(param,var)
  133. var.v.+=param.ω1*var.v1+param.ω2*var.v2+param.ω3*var.v3
  134. limit_vel(param,var)
  135. var.p.+=var.v
  136. check_boundary(param,var)
  137. end
  138. const dt=1.0
  139.  
  140. @time anim = @animate for m in 0:300
  141. t=round(m*dt,digits=2)
  142. quiver(var1.p[:,1],var1.p[:,2],
  143. quiver=(var1.v[:,1].*5.0,var1.v[:,2].*5.0),
  144. xlab="x",xlims=(minWorld-10,maxWorld+10),
  145. ylab="y",ylims=(minWorld-10,maxWorld+10),
  146. #zlab="z",zlims=(minZ,maxZ),
  147. leg=false,
  148. title="Boids,t = $t")
  149. plot!(var1.p[:,1],var1.p[:,2],seriestype=:scatter,markersize=2)
  150. update(param1,var1)
  151.  
  152. end
  153. @time gif(anim,"tmp/Boids4.gif",fps=10)
Add Comment
Please, Sign In to add comment