modeling_simple
/
.venv
/lib
/python3.14
/site-packages
/sympy
/plotting
/pygletplot
/plot_surface.py
| 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 | |