plot_modes.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. from sympy.utilities.lambdify import lambdify
  2. from sympy.core.numbers import pi
  3. from sympy.functions import sin, cos
  4. from sympy.plotting.pygletplot.plot_curve import PlotCurve
  5. from sympy.plotting.pygletplot.plot_surface import PlotSurface
  6. from math import sin as p_sin
  7. from math import cos as p_cos
  8. def float_vec3(f):
  9. def inner(*args):
  10. v = f(*args)
  11. return float(v[0]), float(v[1]), float(v[2])
  12. return inner
  13. class Cartesian2D(PlotCurve):
  14. i_vars, d_vars = 'x', 'y'
  15. intervals = [[-5, 5, 100]]
  16. aliases = ['cartesian']
  17. is_default = True
  18. def _get_sympy_evaluator(self):
  19. fy = self.d_vars[0]
  20. x = self.t_interval.v
  21. @float_vec3
  22. def e(_x):
  23. return (_x, fy.subs(x, _x), 0.0)
  24. return e
  25. def _get_lambda_evaluator(self):
  26. fy = self.d_vars[0]
  27. x = self.t_interval.v
  28. return lambdify([x], [x, fy, 0.0])
  29. class Cartesian3D(PlotSurface):
  30. i_vars, d_vars = 'xy', 'z'
  31. intervals = [[-1, 1, 40], [-1, 1, 40]]
  32. aliases = ['cartesian', 'monge']
  33. is_default = True
  34. def _get_sympy_evaluator(self):
  35. fz = self.d_vars[0]
  36. x = self.u_interval.v
  37. y = self.v_interval.v
  38. @float_vec3
  39. def e(_x, _y):
  40. return (_x, _y, fz.subs(x, _x).subs(y, _y))
  41. return e
  42. def _get_lambda_evaluator(self):
  43. fz = self.d_vars[0]
  44. x = self.u_interval.v
  45. y = self.v_interval.v
  46. return lambdify([x, y], [x, y, fz])
  47. class ParametricCurve2D(PlotCurve):
  48. i_vars, d_vars = 't', 'xy'
  49. intervals = [[0, 2*pi, 100]]
  50. aliases = ['parametric']
  51. is_default = True
  52. def _get_sympy_evaluator(self):
  53. fx, fy = self.d_vars
  54. t = self.t_interval.v
  55. @float_vec3
  56. def e(_t):
  57. return (fx.subs(t, _t), fy.subs(t, _t), 0.0)
  58. return e
  59. def _get_lambda_evaluator(self):
  60. fx, fy = self.d_vars
  61. t = self.t_interval.v
  62. return lambdify([t], [fx, fy, 0.0])
  63. class ParametricCurve3D(PlotCurve):
  64. i_vars, d_vars = 't', 'xyz'
  65. intervals = [[0, 2*pi, 100]]
  66. aliases = ['parametric']
  67. is_default = True
  68. def _get_sympy_evaluator(self):
  69. fx, fy, fz = self.d_vars
  70. t = self.t_interval.v
  71. @float_vec3
  72. def e(_t):
  73. return (fx.subs(t, _t), fy.subs(t, _t), fz.subs(t, _t))
  74. return e
  75. def _get_lambda_evaluator(self):
  76. fx, fy, fz = self.d_vars
  77. t = self.t_interval.v
  78. return lambdify([t], [fx, fy, fz])
  79. class ParametricSurface(PlotSurface):
  80. i_vars, d_vars = 'uv', 'xyz'
  81. intervals = [[-1, 1, 40], [-1, 1, 40]]
  82. aliases = ['parametric']
  83. is_default = True
  84. def _get_sympy_evaluator(self):
  85. fx, fy, fz = self.d_vars
  86. u = self.u_interval.v
  87. v = self.v_interval.v
  88. @float_vec3
  89. def e(_u, _v):
  90. return (fx.subs(u, _u).subs(v, _v),
  91. fy.subs(u, _u).subs(v, _v),
  92. fz.subs(u, _u).subs(v, _v))
  93. return e
  94. def _get_lambda_evaluator(self):
  95. fx, fy, fz = self.d_vars
  96. u = self.u_interval.v
  97. v = self.v_interval.v
  98. return lambdify([u, v], [fx, fy, fz])
  99. class Polar(PlotCurve):
  100. i_vars, d_vars = 't', 'r'
  101. intervals = [[0, 2*pi, 100]]
  102. aliases = ['polar']
  103. is_default = False
  104. def _get_sympy_evaluator(self):
  105. fr = self.d_vars[0]
  106. t = self.t_interval.v
  107. def e(_t):
  108. _r = float(fr.subs(t, _t))
  109. return (_r*p_cos(_t), _r*p_sin(_t), 0.0)
  110. return e
  111. def _get_lambda_evaluator(self):
  112. fr = self.d_vars[0]
  113. t = self.t_interval.v
  114. fx, fy = fr*cos(t), fr*sin(t)
  115. return lambdify([t], [fx, fy, 0.0])
  116. class Cylindrical(PlotSurface):
  117. i_vars, d_vars = 'th', 'r'
  118. intervals = [[0, 2*pi, 40], [-1, 1, 20]]
  119. aliases = ['cylindrical', 'polar']
  120. is_default = False
  121. def _get_sympy_evaluator(self):
  122. fr = self.d_vars[0]
  123. t = self.u_interval.v
  124. h = self.v_interval.v
  125. def e(_t, _h):
  126. _r = float(fr.subs(t, _t).subs(h, _h))
  127. return (_r*p_cos(_t), _r*p_sin(_t), _h)
  128. return e
  129. def _get_lambda_evaluator(self):
  130. fr = self.d_vars[0]
  131. t = self.u_interval.v
  132. h = self.v_interval.v
  133. fx, fy = fr*cos(t), fr*sin(t)
  134. return lambdify([t, h], [fx, fy, h])
  135. class Spherical(PlotSurface):
  136. i_vars, d_vars = 'tp', 'r'
  137. intervals = [[0, 2*pi, 40], [0, pi, 20]]
  138. aliases = ['spherical']
  139. is_default = False
  140. def _get_sympy_evaluator(self):
  141. fr = self.d_vars[0]
  142. t = self.u_interval.v
  143. p = self.v_interval.v
  144. def e(_t, _p):
  145. _r = float(fr.subs(t, _t).subs(p, _p))
  146. return (_r*p_cos(_t)*p_sin(_p),
  147. _r*p_sin(_t)*p_sin(_p),
  148. _r*p_cos(_p))
  149. return e
  150. def _get_lambda_evaluator(self):
  151. fr = self.d_vars[0]
  152. t = self.u_interval.v
  153. p = self.v_interval.v
  154. fx = fr * cos(t) * sin(p)
  155. fy = fr * sin(t) * sin(p)
  156. fz = fr * cos(p)
  157. return lambdify([t, p], [fx, fy, fz])
  158. Cartesian2D._register()
  159. Cartesian3D._register()
  160. ParametricCurve2D._register()
  161. ParametricCurve3D._register()
  162. ParametricSurface._register()
  163. Polar._register()
  164. Cylindrical._register()
  165. Spherical._register()