|
From: <jo...@us...> - 2008-09-07 10:57:18
|
Revision: 6072
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6072&view=rev
Author: jouni
Date: 2008-09-07 10:57:15 +0000 (Sun, 07 Sep 2008)
Log Message:
-----------
Fix conversion of quadratic to cubic Bezier curves in PDF
and PS backends. Patch by Jae-Joon Lee.
Modified Paths:
--------------
trunk/matplotlib/CHANGELOG
trunk/matplotlib/examples/tests/backend_driver.py
trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
trunk/matplotlib/lib/matplotlib/backends/backend_ps.py
trunk/matplotlib/lib/matplotlib/cbook.py
Added Paths:
-----------
trunk/matplotlib/examples/api/quad_bezier.py
Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG 2008-09-06 21:37:53 UTC (rev 6071)
+++ trunk/matplotlib/CHANGELOG 2008-09-07 10:57:15 UTC (rev 6072)
@@ -1,3 +1,6 @@
+2008-09-07 Fix conversion of quadratic to cubic Bezier curves in PDF
+ and PS backends. Patch by Jae-Joon Lee. - JKS
+
2008-09-06 Added 5-point star marker to plot command - EF
2008-09-05 Fix hatching in PS backend - MGD
Added: trunk/matplotlib/examples/api/quad_bezier.py
===================================================================
--- trunk/matplotlib/examples/api/quad_bezier.py (rev 0)
+++ trunk/matplotlib/examples/api/quad_bezier.py 2008-09-07 10:57:15 UTC (rev 6072)
@@ -0,0 +1,17 @@
+import numpy as np
+import matplotlib.path as mpath
+import matplotlib.patches as mpatches
+import matplotlib.pyplot as plt
+
+fig = plt.figure()
+ax = fig.add_subplot(111)
+pp1 = mpatches.PathPatch(
+ mpath.Path([(0, 0), (1, 0), (1, 1), (0, 0)], [1, 3, 3, 5]),
+ fc="none", transform=ax.transData)
+
+ax.add_patch(pp1)
+ax.plot([0.75], [0.25], "ro")
+ax.set_title('The red point should be on the path')
+
+plt.draw()
+
Modified: trunk/matplotlib/examples/tests/backend_driver.py
===================================================================
--- trunk/matplotlib/examples/tests/backend_driver.py 2008-09-06 21:37:53 UTC (rev 6071)
+++ trunk/matplotlib/examples/tests/backend_driver.py 2008-09-07 10:57:15 UTC (rev 6072)
@@ -127,7 +127,8 @@
'colorbar_only.py',
'color_cycle.py',
'donut_demo.py',
- 'path_patch_demo.py'
+ 'path_patch_demo.py',
+ 'quad_bezier.py'
]
units_dir = os.path.join('..', 'units')
Modified: trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py 2008-09-06 21:37:53 UTC (rev 6071)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py 2008-09-07 10:57:15 UTC (rev 6072)
@@ -26,7 +26,7 @@
FigureManagerBase, FigureCanvasBase
from matplotlib.backends.backend_mixed import MixedModeRenderer
from matplotlib.cbook import Bunch, is_string_like, reverse_dict, \
- get_realpath_and_stat, is_writable_file_like, maxdict
+ get_realpath_and_stat, is_writable_file_like, maxdict, quad2cubic
from matplotlib.figure import Figure
from matplotlib.font_manager import findfont, is_opentype_cff_font
from matplotlib.afm import AFM
@@ -1096,6 +1096,7 @@
tpath = transform.transform_path(path)
cmds = []
+ last_points = None
for points, code in tpath.iter_segments():
if code == Path.MOVETO:
cmds.extend(points)
@@ -1104,15 +1105,15 @@
cmds.extend(points)
cmds.append(Op.lineto)
elif code == Path.CURVE3:
- cmds.extend([points[0], points[1],
- points[0], points[1],
- points[2], points[3],
- Op.curveto])
+ points = quad2cubic(*(list(last_points[-2:]) + list(points)))
+ cmds.extend(points)
+ cmds.append(Op.curveto)
elif code == Path.CURVE4:
cmds.extend(points)
cmds.append(Op.curveto)
elif code == Path.CLOSEPOLY:
cmds.append(Op.closepath)
+ last_points = points
return cmds
pathOperations = staticmethod(pathOperations)
Modified: trunk/matplotlib/lib/matplotlib/backends/backend_ps.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_ps.py 2008-09-06 21:37:53 UTC (rev 6071)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_ps.py 2008-09-07 10:57:15 UTC (rev 6072)
@@ -20,7 +20,7 @@
FigureManagerBase, FigureCanvasBase
from matplotlib.cbook import is_string_like, get_realpath_and_stat, \
- is_writable_file_like, maxdict
+ is_writable_file_like, maxdict, quad2cubic
from matplotlib.figure import Figure
from matplotlib.font_manager import findfont, is_opentype_cff_font
@@ -448,22 +448,23 @@
path = transform.transform_path(path)
ps = []
+ last_points = None
for points, code in path.iter_segments():
if code == Path.MOVETO:
ps.append("%g %g m" % tuple(points))
elif code == Path.LINETO:
ps.append("%g %g l" % tuple(points))
elif code == Path.CURVE3:
+ points = quad2cubic(*(list(last_points[-2:]) + list(points)))
ps.append("%g %g %g %g %g %g c" %
- (points[0], points[1],
- points[0], points[1],
- points[2], points[3]))
+ tuple(points[2:]))
elif code == Path.CURVE4:
ps.append("%g %g %g %g %g %g c" % tuple(points))
elif code == Path.CLOSEPOLY:
ps.append("cl")
+ last_points = points
+
ps = "\n".join(ps)
-
return ps
def _get_clip_path(self, clippath, clippath_transform):
Modified: trunk/matplotlib/lib/matplotlib/cbook.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/cbook.py 2008-09-06 21:37:53 UTC (rev 6071)
+++ trunk/matplotlib/lib/matplotlib/cbook.py 2008-09-07 10:57:15 UTC (rev 6072)
@@ -1390,6 +1390,20 @@
"""
return np.all(X[0] == X[-1])
+def quad2cubic(q0x, q0y, q1x, q1y, q2x, q2y):
+ """
+ Converts a quadratic Bezier curve to a cubic approximation.
+
+ The inputs are the x and y coordinates of the three control points
+ of a quadratic curve, and the output is a tuple of x and y
+ coordinates of the four control points of the cubic curve.
+ """
+ # c0x, c0y = q0x, q0y
+ c1x, c1y = q0x + 2./3. * (q1x - q0x), q0y + 2./3. * (q1y - q0y)
+ c2x, c2y = c1x + 1./3. * (q2x - q0x), c1y + 1./3. * (q2y - q0y)
+ # c3x, c3y = q2x, q2y
+ return q0x, q0y, c1x, c1y, c2x, c2y, q2x, q2y
+
# a dict to cross-map linestyle arguments
_linestyles = [('-', 'solid'),
('--', 'dashed'),
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|