123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- import pyglet.gl as pgl
- from sympy.core import S
- from sympy.plotting.pygletplot.plot_mode_base import PlotModeBase
- class PlotSurface(PlotModeBase):
- default_rot_preset = 'perspective'
- def _on_calculate_verts(self):
- self.u_interval = self.intervals[0]
- self.u_set = list(self.u_interval.frange())
- self.v_interval = self.intervals[1]
- self.v_set = list(self.v_interval.frange())
- self.bounds = [[S.Infinity, S.NegativeInfinity, 0],
- [S.Infinity, S.NegativeInfinity, 0],
- [S.Infinity, S.NegativeInfinity, 0]]
- evaluate = self._get_evaluator()
- self._calculating_verts_pos = 0.0
- self._calculating_verts_len = float(
- self.u_interval.v_len*self.v_interval.v_len)
- verts = []
- b = self.bounds
- for u in self.u_set:
- column = []
- for v in self.v_set:
- try:
- _e = evaluate(u, v) # calculate vertex
- except ZeroDivisionError:
- _e = None
- if _e is not None: # update bounding box
- for axis in range(3):
- b[axis][0] = min([b[axis][0], _e[axis]])
- b[axis][1] = max([b[axis][1], _e[axis]])
- column.append(_e)
- self._calculating_verts_pos += 1.0
- verts.append(column)
- for axis in range(3):
- b[axis][2] = b[axis][1] - b[axis][0]
- if b[axis][2] == 0.0:
- b[axis][2] = 1.0
- self.verts = verts
- self.push_wireframe(self.draw_verts(False, False))
- self.push_solid(self.draw_verts(False, True))
- def _on_calculate_cverts(self):
- if not self.verts or not self.color:
- return
- def set_work_len(n):
- self._calculating_cverts_len = float(n)
- def inc_work_pos():
- self._calculating_cverts_pos += 1.0
- set_work_len(1)
- self._calculating_cverts_pos = 0
- self.cverts = self.color.apply_to_surface(self.verts,
- self.u_set,
- self.v_set,
- set_len=set_work_len,
- inc_pos=inc_work_pos)
- self.push_solid(self.draw_verts(True, True))
- def calculate_one_cvert(self, u, v):
- vert = self.verts[u][v]
- return self.color(vert[0], vert[1], vert[2],
- self.u_set[u], self.v_set[v])
- def draw_verts(self, use_cverts, use_solid_color):
- def f():
- for u in range(1, len(self.u_set)):
- pgl.glBegin(pgl.GL_QUAD_STRIP)
- for v in range(len(self.v_set)):
- pa = self.verts[u - 1][v]
- pb = self.verts[u][v]
- if pa is None or pb is None:
- pgl.glEnd()
- pgl.glBegin(pgl.GL_QUAD_STRIP)
- continue
- if use_cverts:
- ca = self.cverts[u - 1][v]
- cb = self.cverts[u][v]
- if ca is None:
- ca = (0, 0, 0)
- if cb is None:
- cb = (0, 0, 0)
- else:
- if use_solid_color:
- ca = cb = self.default_solid_color
- else:
- ca = cb = self.default_wireframe_color
- pgl.glColor3f(*ca)
- pgl.glVertex3f(*pa)
- pgl.glColor3f(*cb)
- pgl.glVertex3f(*pb)
- pgl.glEnd()
- return f
|