Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. import math
  2.  
  3. EPS = 0.00000000001
  4.  
  5. OUTSIDE = 'OUTSIDE'
  6. OUTER = 'OUTER'
  7. INNER = 'INNER'
  8.  
  9. class Part():
  10. x = None
  11. y = None
  12. u = None
  13. v = None
  14. pos = None
  15.  
  16. def GetTimeOfCollision(x0, y0, r, p):
  17. t = math.pow(r, 2) * ( math.pow(p.u, 2) + math.pow(p.v, 2)) - math.pow(p.u * (y0 - p.y) - p.v * (x0 - p.x), 2)
  18. if t < 0:
  19. return None
  20. else:
  21. d = math.sqrt(t)
  22. if (d < EPS):
  23. return None
  24. t1 = (p.u * (x0 - p.x) + p.v * (y0 - p.y) - d) / (math.pow(p.u, 2) + math.pow(p.v, 2))
  25. t2 = (p.u * (x0 - p.x) + p.v * (y0 - p.y) + d) / (math.pow(p.u, 2) + math.pow(p.v, 2))
  26. if (min(t1, t2) > EPS):
  27. return min(t1, t2)
  28. elif (max(t1, t2) > EPS):
  29. return max(t1, t2)
  30. else:
  31. return None
  32.  
  33. with open('input.txt',) as inp:
  34. s = inp.readline().split()
  35. x0 = float(s[0])
  36. y0 = float(s[1])
  37. r1 = float(s[2])
  38. r2 = float(s[3])
  39. s = inp.readline().split()
  40. t = float(s[0])
  41. m = int(s[1])
  42. s = inp.readline().split()
  43. n = int(s[0])
  44. parts = []
  45. for i in range(n):
  46. parts.append(Part())
  47. for i in range(n):
  48. s = inp.readline().split()
  49. parts[i].x = float(s[0])
  50. parts[i].y = float(s[1])
  51. parts[i].u = float(s[2])
  52. parts[i].v = float(s[3])
  53. if ( math.pow(parts[i].x - x0, 2) + math.pow(parts[i].y - y0, 2) < math.pow(r1, 2)):
  54. parts[i].pos = INNER
  55. elif ( math.pow(parts[i].x - x0, 2) + math.pow(parts[i].y - y0, 2) < math.pow(r2, 2)):
  56. parts[i].pos = OUTER
  57. else:
  58. parts[i].pos = OUTSIDE
  59.  
  60. with open('output.txt', 'w') as outp:
  61. for i in range(m):
  62. for j in range(n):
  63. deltaT = t / float(m)
  64. if (abs(parts[j].u) > EPS or abs(parts[j].v) > EPS):
  65. while (deltaT > EPS):
  66. collisionTime = None
  67. if (parts[j].pos == INNER):
  68. collisionTime = GetTimeOfCollision(x0, y0, r1, parts[j])
  69. elif (parts[j].pos == OUTER):
  70. ct1 = GetTimeOfCollision(x0, y0, r1, parts[j])
  71. ct2 = GetTimeOfCollision(x0, y0, r2, parts[j])
  72. if (ct1 == None):
  73. collisionTime = ct2
  74. elif (ct2 == None):
  75. collisionTime = ct1
  76. else:
  77. collisionTime = min(ct1, ct2)
  78. else:
  79. collisionTime = GetTimeOfCollision(x0, y0, r2, parts[j])
  80.  
  81. if (collisionTime == None or collisionTime - deltaT > EPS):
  82. parts[j].x += parts[j].u * deltaT
  83. parts[j].y += parts[j].v * deltaT
  84. break
  85. else:
  86. deltaT -= collisionTime
  87. parts[j].x += parts[j].u * collisionTime
  88. parts[j].y += parts[j].v * collisionTime
  89. xnn = (x0 - parts[j].x) / math.sqrt((x0 - parts[j].x)*(x0 - parts[j].x) + (y0 - parts[j].y)*(y0 - parts[j].y))
  90. ynn = (y0 - parts[j].y) / math.sqrt((x0 - parts[j].x)*(x0 - parts[j].x) + (y0 - parts[j].y)*(y0 - parts[j].y))
  91. d = (parts[j].u * xnn + parts[j].v * ynn)
  92. parts[j].u -= 2.0 * d * xnn
  93. parts[j].v -= 2.0 * d * ynn
  94. outp.write("%.5f %.5f\n" % (parts[j].x, parts[j].y))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement