PHOBOSS

Formation_Generator_lib.lua

Apr 22nd, 2022 (edited)
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.18 KB | None | 0 0
  1. local s_utils = require 'swarm_utilities'
  2.  
  3. local FORMATION_GENERATOR = {}
  4.  
  5. local TWPI = math.pi*2
  6.  
  7. function rotatePointOnXAxis(radians,point)
  8. local s = math.sin(radians);
  9. local c = math.cos(radians);
  10.  
  11. local ynew = point.y * c - point.z * s;
  12. local znew = point.y * s + point.z * c;
  13. return {x=point.x,y=ynew,z=znew}
  14. end
  15.  
  16. function rotatePointOnYAxis(radians,point)
  17. local s = math.sin(radians);
  18. local c = math.cos(radians);
  19.  
  20. local xnew = point.x * c - point.z * s;
  21. local znew = point.x * s + point.z * c;
  22. return {x=xnew,y=point.y,z=znew}
  23. end
  24.  
  25. function rotatePointOnZAxis(radians,point)
  26. local s = math.sin(radians);
  27. local c = math.cos(radians);
  28.  
  29. local xnew = point.x * c - point.y * s;
  30. local ynew = point.x * s + point.y * c;
  31. return {x=xnew,y=ynew,z=point.z}
  32. end
  33.  
  34. rotate = {
  35. ["X"] = function(i,basePoint) return rotatePointOnXAxis(i,basePoint) end,
  36. ["Y"] = function(i,basePoint) return rotatePointOnYAxis(i,basePoint) end,
  37. ["Z"] = function(i,basePoint) return rotatePointOnZAxis(i,basePoint) end
  38. }
  39.  
  40.  
  41.  
  42. function FORMATION_GENERATOR.rotateFormation(axis,radians,formationTable) --***************************--
  43. local newFormationTable = {}
  44. for k,position in pairs(formationTable) do
  45. local newPos = rotate[axis](radians,{x=position[1],y=position[2],z=position[3]})
  46. table.insert(newFormationTable,{newPos.x,newPos.y,newPos.z})
  47. end
  48. return newFormationTable
  49. end
  50.  
  51. --[[
  52. print("\nTriangle:")
  53. t = TriangleFormation("Y:spanX",2,4,2,1,{x=0,y=0,z=0})
  54. for k,v in pairs(t) do
  55. print(v.x,v.y,v.z)
  56. end
  57.  
  58.  
  59.  
  60. print("\nRotated Triangle:")
  61. new_t = rotateFormation("Y",math.pi/2,t)
  62.  
  63. for k,v in pairs(new_t) do
  64. print(v.x,v.y,v.z)
  65. end
  66.  
  67. print("\nHollow Square:")
  68. hsqr = hollowSquareFormation("Y",5,3,{x=0,y=0,z=0})
  69. for k,v in pairs(hsqr) do
  70. print(v.x,v.y,v.z)
  71. end
  72.  
  73. XXXXX
  74. XOOOX
  75. XXXXX
  76.  
  77. print("\nRotated Hollow Square:")
  78. new_t = rotateFormation("Z",math.pi/2,hsqr)
  79. for k,v in pairs(new_t) do
  80. print(v.x,v.y,v.z)
  81. end
  82. ]]
  83.  
  84. function FORMATION_GENERATOR.circleFormation(axis,droneCount,basePoint) --***************************--
  85. --print("\nA Circle with ",droneCount,"drone(s):")
  86. local rot_div = TWPI/droneCount
  87. local formationTable = {}
  88. for i = 0,TWPI-rot_div, rot_div do
  89. local c = rotate[axis](i,basePoint)
  90. table.insert(formationTable,{c.x,c.y,c.z})
  91. end
  92. return formationTable
  93. end
  94. --[[
  95. circ = circleFormation("Y",4,{x=0,y=0,z=5})
  96. for k,v in pairs(circ) do
  97. print(v.x,v.y,v.z)
  98. end
  99. ]]
  100.  
  101.  
  102. planeAxis = {
  103. ["X"] = function(l,w,pos) return {x=pos.x,y=pos.y+w,z=pos.z+l} end,
  104. ["Y"] = function(l,w,pos) return {x=pos.x+w,y=pos.y,z=pos.z+l} end,
  105. ["Z"] = function(l,w,pos) return {x=pos.x+w,y=pos.y+l,z=pos.z} end
  106. }
  107. --[[
  108. function FORMATION_GENERATOR.SquareFormation(droneCount,basePoint) --***************************--
  109. --print("\nA Circle with ",droneCount,"drone(s):")
  110. local rot_div = TWPI/droneCount
  111. local formationTable = {}
  112. for i = 0,TWPI-rot_div, rot_div do
  113. local c = rotate[axis](i,basePoint)
  114. table.insert(formationTable,{c.x,c.y,c.z})
  115. end
  116. return formationTable
  117. end
  118. ]]
  119. function FORMATION_GENERATOR.squareFormation(plane_axis,width,length,basePoint) --***************************--
  120. local formationTable = {}
  121. for l=0,length-1 do
  122. for w=0,width-1 do
  123. local derivedPos = planeAxis[plane_axis](l,w,basePoint)
  124. table.insert(formationTable,{derivedPos.x,derivedPos.y,derivedPos.z})
  125. end
  126. end
  127. return formationTable
  128. end
  129. --[[
  130. print("5X3:")
  131. s = squareFormation("Y",5,3,{x=0,y=0,z=0})
  132. for k,v in pairs(s) do
  133. print(v.x,v.y,v.z)
  134. end
  135. ]]
  136. function FORMATION_GENERATOR.hollowSquareFormation(plane_axis,width,length,scale,basePoint) --****************************--
  137. local formationTable = {}
  138. for l=0,length-1 do
  139. for w=0,width-1 do
  140. if not (w > 0 and w < width-1 and l > 0 and l<length-1) then
  141. local derivedPos = planeAxis[plane_axis](l,w,basePoint)
  142. derivedPos = s_utils.mul(derivedPos,scale)
  143. table.insert(formationTable,{derivedPos.x,derivedPos.y,derivedPos.z})
  144. end
  145. end
  146. end
  147. return formationTable
  148. end
  149.  
  150. --[[
  151. print("hollowSquare:")
  152. print("5X2:")
  153. hs = hollowSquareFormation("Y",5,2,{x=0,y=0,z=0})
  154. for k,v in pairs(hs) do
  155. print(v.x,v.y,v.z)
  156. end
  157.  
  158. P == {x=0,y=0,z=0}
  159.  
  160. XXXXX
  161. PXXXX
  162.  
  163. print("5X3:")
  164. hsqr = hollowSquareFormation("Y",5,3,{x=-2,y=0,z=-1})
  165. for k,v in pairs(hs) do
  166. print(v.x,v.y,v.z)
  167. end
  168.  
  169. P == {x=-2,y=0,z=-1}
  170.  
  171. XXXXX
  172. XOOOX
  173. PXXXX
  174.  
  175.  
  176. print("5X5:")
  177. hs = hollowSquareFormation("Y",5,5,{x=0,y=0,z=0})
  178. for k,v in pairs(hs) do
  179. print(v.x,v.y,v.z)
  180. end
  181.  
  182. P == {x=0,y=0,z=0}
  183.  
  184. XXXXX
  185. XOOOX
  186. XOOOX
  187. XOOOX
  188. PXXXX
  189.  
  190. print("2X2:")
  191. hs = hollowSquareFormation("Y",2,2,{x=0,y=0,z=0})
  192. for k,v in pairs(hs) do
  193. print(v.x,v.y,v.z)
  194. end
  195.  
  196. P == {x=0,y=0,z=0}
  197.  
  198. XX
  199. PX
  200.  
  201. print("3X2:")
  202. hs = hollowSquareFormation("Y",3,2,{x=0,y=0,z=0})
  203. for k,v in pairs(hs) do
  204. print(v.x,v.y,v.z)
  205. end
  206.  
  207. P == {x=0,y=0,z=0}
  208. XXX
  209. PXX
  210.  
  211.  
  212. ]]
  213.  
  214. --[[
  215. X X X X X
  216. X X
  217. X X
  218. X X
  219. X
  220. ]]
  221. triangleDirection = {
  222. ["Y:spanZ"] = function(height_rise,b_run,basePoint)
  223. return {x=basePoint.x,y=basePoint.y+height_rise,z=basePoint.z+b_run},
  224. {x=basePoint.x,y=basePoint.y+height_rise,z=basePoint.z-b_run}
  225. end,
  226. ["-Y:spanZ"] = function(height_rise,b_run,basePoint)
  227. return {x=basePoint.x,y=basePoint.y-height_rise,z=basePoint.z+b_run},
  228. {x=basePoint.x,y=basePoint.y-height_rise,z=basePoint.z-b_run}
  229. end,
  230. ["Y:spanX"] = function(height_rise,b_run,basePoint)
  231. return {x=basePoint.x+b_run,y=basePoint.y+height_rise,z=basePoint.z},
  232. {x=basePoint.x-b_run,y=basePoint.y+height_rise,z=basePoint.z}
  233. end,
  234. ["-Y:spanX"] = function(height_rise,b_run,basePoint)
  235. return {x=basePoint.x+b_run,y=basePoint.y-height_rise,z=basePoint.z},
  236. {x=basePoint.x-b_run,y=basePoint.y-height_rise,z=basePoint.z}
  237. end,
  238. ["X:spanZ"] = function(height_rise,b_run,basePoint)
  239. return {x=basePoint.x+height_rise,y=basePoint.y,z=basePoint.z+b_run},
  240. {x=basePoint.x+height_rise,y=basePoint.y,z=basePoint.z-b_run}
  241. end,
  242. ["-X:spanZ"] = function(height_rise,b_run,basePoint)
  243. return {x=basePoint.x-height_rise,y=basePoint.y,z=basePoint.z+b_run},
  244. {x=basePoint.x-height_rise,y=basePoint.y,z=basePoint.z-b_run}
  245. end,
  246. ["X:spanY"] = function(height_rise,b_run,basePoint)
  247. return {x=basePoint.x+height_rise,y=basePoint.y+b_run,z=basePoint.z},
  248. {x=basePoint.x+height_rise,y=basePoint.y-b_run,z=basePoint.z}
  249. end,
  250. ["-X:spanY"] = function(height_rise,b_run,basePoint)
  251. return {x=basePoint.x-height_rise,y=basePoint.y+b_run,z=basePoint.z},
  252. {x=basePoint.x-height_rise,y=basePoint.y-b_run,z=basePoint.z}
  253. end,
  254. ["Z:spanX"] = function(height_rise,b_run,basePoint)
  255. return {x=basePoint.x+b_run,y=basePoint.y,z=basePoint.z+height_rise},
  256. {x=basePoint.x-b_run,y=basePoint.y,z=basePoint.z+height_rise}
  257. end,
  258. ["-Z:spanX"] = function(height_rise,b_run,basePoint)
  259. return {x=basePoint.x+b_run,y=basePoint.y,z=basePoint.z-height_rise},
  260. {x=basePoint.x-b_run,y=basePoint.y,z=basePoint.z-height_rise}
  261. end,
  262. ["Z:spanY"] = function(height_rise,b_run,basePoint)
  263. return {x=basePoint.x,y=basePoint.y+b_run,z=basePoint.z+height_rise},
  264. {x=basePoint.x,y=basePoint.y-b_run,z=basePoint.z+height_rise}
  265. end,
  266. ["-Z:spanY"] = function(height_rise,b_run,basePoint)
  267. return {x=basePoint.x,y=basePoint.y+b_run,z=basePoint.z-height_rise},
  268. {x=basePoint.x,y=basePoint.y-b_run,z=basePoint.z-height_rise}
  269. end,
  270. }
  271.  
  272. --[[
  273. function FORMATION_GENERATOR.TriangleFormation(plane_axis,height,base,scale,basePoint) --***************************--
  274. local formationTable = {}
  275. local slope = height/(base*0.5)
  276. table.insert(formationTable,{basePoint.x,basePoint.y,basePoint.z})
  277. local run = 0
  278.  
  279. for rise = 1,height do
  280. run = rise/slope
  281. local pos,neg = triangleDirection[plane_axis](rise,run,basePoint)
  282. table.insert(formationTable,{pos.x,pos.y,pos.z})
  283. table.insert(formationTable,{neg.x,neg.y,neg.z})
  284. end
  285. for b = run-1,1,-1 do
  286. local pos,neg = triangleDirection[plane_axis](height,b,basePoint)
  287.  
  288. if not s_utils.isEqual(pos,neg) then
  289. pos = s_utils.mul(pos,scale)
  290. table.insert(formationTable,{neg.x,neg.y,neg.z})
  291. end
  292. pos = s_utils.mul(pos,scale)
  293. table.insert(formationTable,{pos.x,pos.y,pos.z})
  294. end
  295. return formationTable
  296. end
  297. ]]
  298. function FORMATION_GENERATOR.TriangleFormation(plane_axis,height,base,scale,basePoint)
  299. local formationTable = {}
  300. local slope = height/(base*0.5)
  301. local bp_scaled = s_utils.mul(basePoint,scale)
  302. table.insert(formationTable,{bp_scaled.x,bp_scaled.y,bp_scaled.z})
  303. local run = 0
  304.  
  305. for rise = 1,height do
  306. run = rise/slope
  307. local pos,neg = triangleDirection[plane_axis](rise,run,basePoint)
  308. pos,neg = s_utils.mul(pos,scale),s_utils.mul(neg,scale)
  309. table.insert(formationTable,{pos.x,pos.y,pos.z})
  310. table.insert(formationTable,{neg.x,neg.y,neg.z})
  311. end
  312. for b = run-1,1,-1 do
  313. local pos,neg = triangleDirection[plane_axis](height,b,basePoint)
  314. if not s_utils.isEqual(pos,neg) then
  315. neg = s_utils.mul(neg,scale)
  316. table.insert(formationTable,{neg.x,neg.y,neg.z})
  317. end
  318. pos = s_utils.mul(pos,scale)
  319. table.insert(formationTable,{pos.x,pos.y,pos.z})
  320. end
  321. return formationTable
  322. end
  323. --[[
  324. print("\nTriangle:")
  325. t = TriangleFormation("Y:spanX",2,4,1,{x=0,y=0,z=0})
  326. for k,v in pairs(t) do
  327. print(v.x,v.y,v.z)
  328. end
  329.  
  330. OUTPUT:
  331. Triangle:
  332. 0 0 0
  333. 1.0 1 0
  334. -1.0 1 0
  335. 0.0 2 0
  336.  
  337. ]]
  338. return FORMATION_GENERATOR
  339.  
Add Comment
Please, Sign In to add comment