prefig 0.3.7.dev20250722203657__tar.gz → 0.3.8.dev20250725054648__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/PKG-INFO +1 -1
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/slope_field.py +108 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/tags.py +3 -1
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/pyproject.toml +1 -1
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/LICENSE +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/README.md +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/__init__.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/cli.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/CTM.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/__init__.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/annotations.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/area.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/arrow.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/axes.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/calculus.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/circle.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/clip.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/compat.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/coordinates.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/definition.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/diagram.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/diffeqs.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/graph.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/grid_axes.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/group.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/implicit.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/label.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/label_tools.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/legend.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/line.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/math_utilities.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/network.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/parametric_curve.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/parse.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/path.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/point.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/polygon.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/read.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/rectangle.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/repeat.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/riemann_sum.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/shape.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/statistics.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/tangent_line.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/user_namespace.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/utilities.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/vector.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/engine.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/diagcess/diagcess.html +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/diagcess/diagcess.js +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/de-system.xml +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/derivatives.xml +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/diffeqs.xml +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/implicit.xml +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/projection.xml +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/riemann.xml +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/roots_of_unity.xml +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/examples/tangent.xml +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/fonts/Braille29.ttf +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/js/mj-sre-page.js +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/js/package.json +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/schema/pf_schema.rnc +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/schema/pf_schema.rng +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/template/pf_publication.xml +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/scripts/__init__.py +0 -0
- {prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/scripts/install_mj.py +0 -0
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/slope_field.py
RENAMED
|
@@ -8,6 +8,7 @@ from . import utilities
|
|
|
8
8
|
from . import grid_axes
|
|
9
9
|
from . import group
|
|
10
10
|
from . import math_utilities as math_util
|
|
11
|
+
from . import calculus
|
|
11
12
|
|
|
12
13
|
log = logging.getLogger('prefigure')
|
|
13
14
|
|
|
@@ -112,3 +113,110 @@ def slope_field(element, diagram, parent, outline_status):
|
|
|
112
113
|
|
|
113
114
|
group.group(element, diagram, parent, outline_status)
|
|
114
115
|
|
|
116
|
+
# Add a graphical element for slope fields
|
|
117
|
+
def vector_field(element, diagram, parent, outline_status):
|
|
118
|
+
if outline_status == 'finish_outline':
|
|
119
|
+
finish_outline(element, diagram, parent)
|
|
120
|
+
return
|
|
121
|
+
|
|
122
|
+
try:
|
|
123
|
+
f = un.valid_eval(element.get('function'))
|
|
124
|
+
except:
|
|
125
|
+
log.error(f"Error retrieving slope-field function={element.get('function')}")
|
|
126
|
+
return
|
|
127
|
+
bbox = diagram.bbox()
|
|
128
|
+
|
|
129
|
+
# We're going to turn this element into a group and add lines to it
|
|
130
|
+
element.tag = "group"
|
|
131
|
+
if element.get('outline', 'no') == 'yes':
|
|
132
|
+
element.set('outline', 'always')
|
|
133
|
+
|
|
134
|
+
# Now we'll construct a line with all the graphical information
|
|
135
|
+
# and make copies of it
|
|
136
|
+
line_template = ET.Element('line')
|
|
137
|
+
|
|
138
|
+
if diagram.output_format() == 'tactile':
|
|
139
|
+
line_template.set('stroke', 'black')
|
|
140
|
+
else:
|
|
141
|
+
line_template.set('stroke', element.get('stroke', 'blue'))
|
|
142
|
+
line_template.set('thickness', element.get('thickness', '2'))
|
|
143
|
+
if element.get('arrows', 'yes') == 'yes':
|
|
144
|
+
line_template.set('arrows', '1')
|
|
145
|
+
|
|
146
|
+
if element.get('arrow-width', None) is not None:
|
|
147
|
+
line_template.set('arrow-width', element.get('arrow-width'))
|
|
148
|
+
if element.get('arrow-angles', None) is not None:
|
|
149
|
+
line_template.set('arrow-angles', element.get('arrow-angles'))
|
|
150
|
+
|
|
151
|
+
spacings = element.get('spacings', None)
|
|
152
|
+
if spacings is not None:
|
|
153
|
+
try:
|
|
154
|
+
spacings = un.valid_eval(spacings)
|
|
155
|
+
rx, ry = spacings
|
|
156
|
+
except:
|
|
157
|
+
log.error(f"Error parsing slope-field attribute @spacings={element.get('spacings')}")
|
|
158
|
+
return
|
|
159
|
+
else:
|
|
160
|
+
rx = grid_axes.find_gridspacing((bbox[0], bbox[2]))
|
|
161
|
+
ry = grid_axes.find_gridspacing((bbox[1], bbox[3]))
|
|
162
|
+
|
|
163
|
+
# we will go through and generate the vectors first
|
|
164
|
+
# since we'll need to scale them
|
|
165
|
+
field_data = []
|
|
166
|
+
max_scale = 0
|
|
167
|
+
x = rx[0]
|
|
168
|
+
while x <= rx[2]:
|
|
169
|
+
y = ry[0]
|
|
170
|
+
while y <= ry[2]:
|
|
171
|
+
f_value = f(x, y)
|
|
172
|
+
try:
|
|
173
|
+
if len(f_value) != 2:
|
|
174
|
+
log.error("Only two-dimensional vector fields are supported")
|
|
175
|
+
return;
|
|
176
|
+
except:
|
|
177
|
+
pass
|
|
178
|
+
max_scale = max(max_scale,
|
|
179
|
+
abs((f_value[0])/rx[1]),
|
|
180
|
+
abs((f_value[1])/ry[1]))
|
|
181
|
+
field_data.append([np.array([x,y]), f_value])
|
|
182
|
+
y += ry[1]
|
|
183
|
+
x += rx[1]
|
|
184
|
+
|
|
185
|
+
scale_factor = min(1, 0.75 / max_scale)
|
|
186
|
+
if element.get('scale') is not None:
|
|
187
|
+
scale = un.valid_eval(element.get('scale'))
|
|
188
|
+
scale_factor = scale
|
|
189
|
+
|
|
190
|
+
for datum in field_data:
|
|
191
|
+
p, v = datum
|
|
192
|
+
v = scale_factor * v
|
|
193
|
+
# is this long enough to add?
|
|
194
|
+
tail = p
|
|
195
|
+
tip = p+v
|
|
196
|
+
p0 = diagram.transform(tail)
|
|
197
|
+
p1 = diagram.transform(tip)
|
|
198
|
+
if math_util.distance(p0, p1) < 2:
|
|
199
|
+
continue
|
|
200
|
+
|
|
201
|
+
line_el = copy.deepcopy(line_template)
|
|
202
|
+
line_el.set('p1', utilities.pt2long_str(tail, spacer=','))
|
|
203
|
+
line_el.set('p2', utilities.pt2long_str(tip, spacer=','))
|
|
204
|
+
element.append(line_el)
|
|
205
|
+
|
|
206
|
+
group.group(element, diagram, parent, outline_status)
|
|
207
|
+
|
|
208
|
+
def gradient(element, diagram, parent, outline_status):
|
|
209
|
+
try:
|
|
210
|
+
f = un.valid_eval(element.get("function"))
|
|
211
|
+
except:
|
|
212
|
+
log.error("Error retrieving function in gradient element")
|
|
213
|
+
return
|
|
214
|
+
|
|
215
|
+
def grad(a, b):
|
|
216
|
+
f_x_trace = lambda x: f(x, b)
|
|
217
|
+
f_y_trace = lambda y: f(a, y)
|
|
218
|
+
return np.array([calculus.derivative(f_x_trace, a),
|
|
219
|
+
calculus.derivative(f_y_trace, b)])
|
|
220
|
+
un.enter_namespace("__grad", grad)
|
|
221
|
+
element.set("function", "__grad")
|
|
222
|
+
vector_field(element, diagram, parent, outline_status)
|
|
@@ -45,6 +45,7 @@ tag_dict = {
|
|
|
45
45
|
'definition': definition.definition,
|
|
46
46
|
'derivative': definition.derivative,
|
|
47
47
|
'ellipse': circle.ellipse,
|
|
48
|
+
'gradient': slope_field.gradient,
|
|
48
49
|
'graph': graph.graph,
|
|
49
50
|
'grid': grid_axes.grid,
|
|
50
51
|
'grid-axes': grid_axes.grid_axes,
|
|
@@ -72,7 +73,8 @@ tag_dict = {
|
|
|
72
73
|
'tangent-line': tangent_line.tangent,
|
|
73
74
|
'translate': CTM.transform_translate,
|
|
74
75
|
'triangle': polygon.triangle,
|
|
75
|
-
'vector': vector.vector
|
|
76
|
+
'vector': vector.vector,
|
|
77
|
+
'vector-field': slope_field.vector_field
|
|
76
78
|
}
|
|
77
79
|
|
|
78
80
|
log = logging.getLogger('prefigure')
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/annotations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/coordinates.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/label_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/math_utilities.py
RENAMED
|
File without changes
|
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/parametric_curve.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/riemann_sum.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/tangent_line.py
RENAMED
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/core/user_namespace.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/js/mj-sre-page.js
RENAMED
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/resources/js/package.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/scripts/__init__.py
RENAMED
|
File without changes
|
{prefig-0.3.7.dev20250722203657 → prefig-0.3.8.dev20250725054648}/prefig/scripts/install_mj.py
RENAMED
|
File without changes
|