图片解析应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
5.2 KiB

  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()