Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.39 KB | None | 0 0
  1. import numpy as np
  2. import math
  3. from joblib import Parallel, delayed
  4.  
  5. def internal_raycast (equipment_data, xe, ye, ze, x1, y1, z1):
  6. x2 = xe + 0.5
  7. y2 = ye + 0.5
  8. z2 = ze + 0.5
  9.  
  10. i = int(math.floor(x1))
  11. j = int(math.floor(y1))
  12. k = int(math.floor(z1))
  13.  
  14. iend = int(math.floor(x2))
  15. jend = int(math.floor(y2))
  16. kend = int(math.floor(z2))
  17.  
  18. di = 1 if x1 < x2 else -1 if x1 > x2 else 0
  19. dj = 1 if y1 < y2 else -1 if y1 > y2 else 0
  20. dk = 1 if z1 < z2 else -1 if z1 > z2 else 0
  21.  
  22. deltatx = float('inf') if di == 0 else 1.0 / abs(x2 - x1)
  23. deltaty = float('inf') if dj == 0 else 1.0 / abs(y2 - y1)
  24. deltatz = float('inf') if dk == 0 else 1.0 / abs(z2 - z1)
  25.  
  26. minx = math.floor(x1)
  27. miny = math.floor(y1)
  28. minz = math.floor(z1)
  29.  
  30. maxx = minx + 1
  31. maxy = miny + 1
  32. maxz = minz + 1
  33.  
  34. tx = deltatx * ((x1 - minx) if x1 > x2 else (maxx - x1))
  35. ty = deltaty * ((y1 - miny) if y1 > y2 else (maxy - y1))
  36. tz = deltatz * ((z1 - minz) if z1 > z2 else (maxz - z1))
  37.  
  38. result = []
  39. result_full = []
  40.  
  41. stop = False
  42. while True:
  43. if (tx <= ty and tx <= tz):
  44. if (i == iend):
  45. break
  46. tx = tx + deltatx
  47. i = i + di
  48. elif (ty <= tz):
  49. if (j == jend):
  50. break
  51. ty = ty + deltaty
  52. j = j + dj
  53. else:
  54. if (k == kend):
  55. break
  56. tz = tz + deltatz
  57. k = k + dk
  58.  
  59. result_full.append((i,j,k,True))
  60. if (not stop):
  61. result.append((i, j, k, True))
  62. if (equipment_data[i][j][k]):
  63. stop = True
  64.  
  65. return [result, result_full]
  66.  
  67. def raycast (vertex, shell, equipment):
  68.  
  69. dim = shell.dims[0]
  70.  
  71. result = np.zeros(shape=(dim,dim,dim), dtype=np.bool_)
  72. result_full = np.zeros(shape=(dim,dim,dim), dtype=np.bool_)
  73.  
  74. result = result.tolist()
  75. result_full = result_full.tolist()
  76. equipment_data = equipment.data.tolist()
  77.  
  78. xs, ys, zs = vertex
  79. x1,y1,z1 = [e+0.5 for e in vertex]
  80.  
  81. result[xs][ys][zs] = True
  82. result_full[xs][ys][zs] = True
  83.  
  84. r = Parallel(n_jobs=len(shell.data[0]))(delayed(internal_raycast)(equipment_data, shell.data[0][index], shell.data[1][index], shell.data[2][index], x1, y1, z1) for index in range (len(shell.data[0]))
  85. results_multi, results_full_multi = zip(*r)
  86.  
  87. for res in results_multi:
  88. #for res in result_multi:
  89. result[res[0]][res[1]][res[2]] = res[3]
  90.  
  91. for res_f in results_full_multi:
  92. #for res_f in result_full_multi:
  93. result_full[res_f[0]][res_f[2]][res_f[2]] = res_f[3]
  94.  
  95. return [np.asarray(result), np.asarray(result_full)]
  96.  
  97. def voxelCoordinate (vertex, voxel_length, translate):
  98. return [int((v-t)/voxel_length - 0.5) for v,t in zip(vertex,translate)]
  99.  
  100. def is_inside (voxel, dim):
  101. return (voxel[0]>=0 and voxel[1]>=0 and voxel[2]>=0 and voxel[0]<dim and voxel[1]<dim and voxel[2]<dim)
  102.  
  103. def bresenham3d (vertex, shell, equipment):
  104.  
  105. dim = shell.dims[0]
  106.  
  107. result = np.zeros(shape=(dim,dim,dim), dtype=np.bool_)
  108. result_full = np.zeros(shape=(dim,dim,dim), dtype=np.bool_)
  109.  
  110. result = result.tolist()
  111. result_full = result_full.tolist()
  112. equipment_data = equipment.data.tolist()
  113.  
  114. for index in range (len(shell.data[0])):
  115.  
  116. #point = vertex[:]
  117. point = [vertex[0],vertex[1],vertex[2]]
  118. dx = shell.data[0][index] - point[0]
  119. dy = shell.data[1][index] - point[1]
  120. dz = shell.data[2][index] - point[2]
  121.  
  122. x_inc = -1 if dx<0 else 1
  123. l = abs(dx)
  124. y_inc = -1 if dy<0 else 1
  125. m = abs(dy)
  126. z_inc = -1 if dz<0 else 1
  127. n = abs(dz)
  128. dx2 = l << 1
  129. dy2 = m << 1
  130. dz2 = n << 1
  131.  
  132. stop = False
  133. if ((l >= m) and (l >= n)):
  134. err_1 = dy2 - l
  135. err_2 = dz2 - l
  136. for i in range(l):
  137. if (not stop):
  138. result[point[0]][point[1]][point[2]] = True
  139. if (equipment_data[point[0]][point[1]][point[2]]):
  140. stop = True
  141. result_full[point[0]][point[1]][point[2]] = True
  142.  
  143. if (err_1 > 0):
  144. point[1] = point[1] + y_inc
  145. err_1 = err_1 - dx2
  146.  
  147. if (err_2 > 0):
  148. point[2] = point[2] + z_inc
  149. err_2 = err_2 - dx2
  150.  
  151. err_1 = err_1 + dy2
  152. err_2 = err_2 + dz2
  153. point[0] = point[0] + x_inc
  154.  
  155. elif ((m >= l) and (m >= n)):
  156. err_1 = dx2 - m
  157. err_2 = dz2 - m
  158. for i in range(m):
  159. if (not stop):
  160. result[point[0]][point[1]][point[2]] = True
  161. if (equipment_data[point[0]][point[1]][point[2]]):
  162. stop = True
  163. result_full[point[0]][point[1]][point[2]] = True
  164.  
  165. if (err_1 > 0):
  166. point[0] = point[0] + x_inc
  167. err_1 = err_1 - dy2
  168.  
  169. if (err_2 > 0):
  170. point[2] = point[2] + z_inc
  171. err_2 = err_2 - dy2
  172.  
  173. err_1 = err_1 + dx2
  174. err_2 = err_2 + dz2
  175. point[1] = point[1] + y_inc
  176.  
  177. else:
  178. err_1 = dy2 - n
  179. err_2 = dx2 - n
  180. for i in range(n):
  181. if (not stop):
  182. result[point[0]][point[1]][point[2]] = True
  183. if (equipment_data[point[0]][point[1]][point[2]]):
  184. stop = True
  185. result_full[point[0]][point[1]][point[2]] = True
  186.  
  187. if (err_1 > 0):
  188. point[1] = point[1] + y_inc
  189. err_1 = err_1 - dz2
  190.  
  191. if (err_2 > 0):
  192. point[0] = point[0] + x_inc
  193. err_2 = err_2 - dz2
  194.  
  195. err_1 = err_1 + dy2
  196. err_2 = err_2 + dx2
  197. point[2] = point[2] + z_inc
  198.  
  199. if (not stop):
  200. result[point[0]][point[1]][point[2]] = True
  201. if (equipment.data[point[0]][point[1]][point[2]]):
  202. stop = True
  203. result_full[point[0]][point[1]][point[2]] = True
  204.  
  205. return [np.asarray(result), np.asarray(result_full)]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement