Spaces:
Sleeping
Sleeping
import pyglet.gl as pgl | |
from sympy.core import S | |
from sympy.plotting.pygletplot.plot_mode_base import PlotModeBase | |
class PlotCurve(PlotModeBase): | |
style_override = 'wireframe' | |
def _on_calculate_verts(self): | |
self.t_interval = self.intervals[0] | |
self.t_set = list(self.t_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.t_interval.v_len) | |
self.verts = [] | |
b = self.bounds | |
for t in self.t_set: | |
try: | |
_e = evaluate(t) # calculate vertex | |
except (NameError, 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]]) | |
self.verts.append(_e) | |
self._calculating_verts_pos += 1.0 | |
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.push_wireframe(self.draw_verts(False)) | |
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_curve(self.verts, | |
self.t_set, | |
set_len=set_work_len, | |
inc_pos=inc_work_pos) | |
self.push_wireframe(self.draw_verts(True)) | |
def calculate_one_cvert(self, t): | |
vert = self.verts[t] | |
return self.color(vert[0], vert[1], vert[2], | |
self.t_set[t], None) | |
def draw_verts(self, use_cverts): | |
def f(): | |
pgl.glBegin(pgl.GL_LINE_STRIP) | |
for t in range(len(self.t_set)): | |
p = self.verts[t] | |
if p is None: | |
pgl.glEnd() | |
pgl.glBegin(pgl.GL_LINE_STRIP) | |
continue | |
if use_cverts: | |
c = self.cverts[t] | |
if c is None: | |
c = (0, 0, 0) | |
pgl.glColor3f(*c) | |
else: | |
pgl.glColor3f(*self.default_wireframe_color) | |
pgl.glVertex3f(*p) | |
pgl.glEnd() | |
return f | |