Advertisement
Guest User

loool

a guest
Dec 18th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.47 KB | None | 0 0
  1. pair<ld, Vec3d> dist_to_arena_quarter(Vec3d point, const Arena& arena){
  2. //ground
  3. pair<ld, Vec3d> dist = dist_to_plane(point, Vec3d(0,0,0), Vec3d(0, 1, 0));
  4. //ceil
  5. dist = min(dist, dist_to_plane(point, Vec3d(0, arena.height, 0), Vec3d(0, -1, 0)));
  6. //side x
  7. dist = min(dist, dist_to_plane(point, Vec3d(arena.width/2, 0, 0), Vec3d(-1, 0, 0)));
  8. //side z(goal)
  9. dist = min(dist, dist_to_plane(point, Vec3d(0,0, arena.depth / 2 + arena.goal_depth), Vec3d(0,0,-1)));
  10. //side z
  11. Vec3d v = Vec3d(point.x, point.y, 0) - Vec3d(arena.goal_width / 2 - arena.goal_top_radius, arena.goal_height - arena.goal_top_radius, 0);
  12. if(point.x >= arena.goal_width / 2 + arena.goal_side_radius
  13. || point.y >= arena.goal_height + arena.goal_side_radius
  14. || (v.x > 0 && v.y > 0 && zer.dist(v) >= arena.goal_top_radius + arena.goal_side_radius)){
  15. dist = min(dist, dist_to_plane(point, Vec3d(0, 0, arena.depth / 2), Vec3d(0, 0, -1)));
  16. }
  17.  
  18. // goal
  19. if(point.z >= (arena.depth / 2 + arena.goal_side_radius)){
  20. dist = min(dist, dist_to_plane(point, Vec3d(arena.goal_width / 2, 0, 0), Vec3d(-1, 0, 0)));
  21. dist = min(dist, dist_to_plane(point, Vec3d(0, arena.goal_height, 0), Vec3d(0, -1, 0)));
  22. }
  23.  
  24. // goal back corners
  25.  
  26. if(point.z > (arena.depth / 2 + arena.goal_depth - arena.bottom_radius)){
  27. dist = min(dist, dist_to_sphere_inner(point,
  28. Vec3d(clamp(point.x, arena.bottom_radius - arena.goal_width / 2, arena.goal_width / 2 - arena.bottom_radius),
  29. clamp(point.y, arena.bottom_radius, arena.goal_height - arena.goal_top_radius),
  30. arena.depth / 2 + arena.goal_depth - arena.bottom_radius
  31. ), arena.bottom_radius));
  32. }
  33.  
  34. //Corner
  35.  
  36. if(point.x > arena.width / 2 - arena.corner_radius && point.x > arena.depth / 2 - arena.corner_radius){
  37. dist = min(dist, dist_to_sphere_inner(point, Vec3d(arena.width / 2 - arena.corner_radius, point.y, arena.depth / 2 - arena.corner_radius), arena.corner_radius));
  38. }
  39.  
  40. //Goal outer corner
  41.  
  42. if(point.z < (arena.depth / 2) + arena.goal_side_radius){
  43. //side x
  44. if(point.x < arena.goal_width / 2 + arena.goal_side_radius){
  45. dist = min(dist, dist_to_sphere_outer(point, Vec3d(arena.goal_width / 2 + arena.goal_side_radius, point.y, (arena.depth / 2) + arena.goal_side_radius), arena.goal_side_radius));
  46. }
  47. //ceiling
  48. if(point.y < arena.goal_height + arena.goal_side_radius){
  49. dist = min(dist, dist_to_sphere_outer(point, Vec3d(point.x, arena.goal_height + arena.goal_side_radius, arena.depth/2 + arena.goal_side_radius), arena.goal_side_radius));
  50. }
  51.  
  52. //top corner
  53. Vec3d o(arena.goal_width / 2 - arena.goal_top_radius, arena.goal_height - arena.goal_top_radius, 0);
  54. v = Vec3d(point.x, point.y, 0) - o;
  55. if(v.x > 0 && v.y > 0){
  56. o = o + normalize(v) * (arena.goal_top_radius + arena.goal_side_radius);
  57. dist = min(dist, dist_to_sphere_outer(point, Vec3d(o.x, o.y, arena.depth / 2 + arena.goal_side_radius), arena.goal_side_radius));
  58. }
  59. }
  60. //goal inside top corners
  61. if(point.z > arena.depth / 2 + arena.goal_side_radius && point.y > arena.goal_height - arena.goal_top_radius){
  62. //side x
  63. if(point.x > arena.goal_width / 2 - arena.goal_top_radius){
  64. dist = min(dist, dist_to_sphere_inner(point, Vec3d(
  65. arena.goal_width / 2 - arena.goal_top_radius,
  66. arena.goal_height - arena.goal_top_radius,
  67. point.z
  68. ), arena.goal_top_radius));
  69. }
  70. //side z
  71. if(point.z > arena.depth / 2 + arena.goal_depth - arena.goal_top_radius){
  72. dist = min(dist, dist_to_sphere_inner(point, Vec3d(point.x, arena.goal_height - arena.goal_top_radius, arena.depth / 2 - arena.goal_depth - arena.goal_top_radius), arena.goal_top_radius));
  73. }
  74. }
  75.  
  76. //bottom corners
  77. if(point.y < arena.bottom_radius){
  78. //side x
  79. if(point.x > arena.width / 2 - arena.bottom_radius){
  80. dist = min(dist, dist_to_sphere_inner(point, Vec3d(arena.width/2 - arena.bottom_radius, arena.bottom_radius, point.z), arena.bottom_radius));
  81. }
  82. //side z
  83. if(point.x > arena.depth / 2 + arena.goal_depth - arena.bottom_radius){
  84. dist = min(dist, dist_to_sphere_inner(point, Vec3d(point.x, arena.bottom_radius, (arena.depth / 2) + arena.goal_depth - arena.bottom_radius), arena.bottom_radius));
  85. }
  86. //outer
  87. Vec3d o = Vec3d(arena.goal_width / 2 + arena.goal_side_radius, arena.depth / 2 + arena.goal_side_radius, 0);
  88. v = Vec3d(point.x, point.z, 0) - o;
  89. if(v.x < 0 && v.y < 0 && zer.dist(v) < arena.goal_side_radius + arena.bottom_radius){
  90. o = o + normalize(v) * (arena.goal_side_radius + arena.bottom_radius);
  91. dist = min(dist, dist_to_sphere_inner(point, Vec3d(o.x, arena.bottom_radius, o.y), arena.bottom_radius));
  92. }
  93. //side x(goal)
  94. if(point.z >= (arena.depth / 2) + arena.goal_side_radius && point.x > (arena.goal_width / 2) - arena.bottom_radius){
  95. dist = min(dist, dist_to_sphere_inner(point, Vec3d(arena.goal_width / 2 - arena.bottom_radius, arena.bottom_radius, point.z), arena.bottom_radius));
  96. }
  97. //corner
  98. if(point.x > arena.width / 2 - arena.corner_radius && point.z > arena.depth / 2 - arena.corner_radius){
  99. Vec3d corner_o(arena.width / 2 - arena.corner_radius, arena.depth / 2 - arena.corner_radius, 0);
  100. Vec3d n = Vec3d(point.x, point.x, 0) - corner_o;
  101. ld dl = zer.dist(n);
  102. if(dl > arena.corner_radius - arena.bottom_radius){
  103. n *= 1 / dl;
  104. Vec3d o2 = corner_o + n * (arena.corner_radius - arena.bottom_radius);
  105. dist = min(dist, dist_to_sphere_inner(point, Vec3d(o2.x, arena.bottom_radius, o2.y), arena.bottom_radius));
  106. }
  107. }
  108. }
  109. // ceiling corners
  110. if(point.y > arena.height - arena.top_radius){
  111. //side x
  112. if(point.x > arena.width / 2 - arena.top_radius){
  113. dist = min(dist, dist_to_sphere_inner(point, Vec3d(arena.width / 2 - arena.top_radius, arena.height - arena.top_radius, point.z), arena.top_radius));
  114. }
  115. //side z
  116. if(point.z > arena.depth / 2 - arena.top_radius){
  117. dist = min(dist, dist_to_sphere_inner(point, Vec3d(point.x, arena.height - arena.top_radius, arena.depth / 2 - arena.top_radius), arena.top_radius));
  118. }
  119. //corner
  120. if(point.x > arena.width / 2 - arena.corner_radius && point.z > arena.depth / 2 - arena.corner_radius){
  121. Vec3d corner_o(arena.width / 2 - arena.corner_radius, arena.depth - arena.corner_radius, 0);
  122. Vec3d dv = Vec3d(point.x, point.z, 0) - corner_o;
  123. if(zer.dist(dv) > arena.corner_radius - arena.top_radius){
  124. Vec3d n = normalize(dv);
  125. Vec3d o2 = corner_o + n * (arena.corner_radius - arena.top_radius);
  126. dist = min(dist, dist_to_sphere_inner(point, Vec3d(o2.x, arena.height - arena.top_radius, o2.y), arena.top_radius));
  127. }
  128. }
  129. }
  130. return dist;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement