From: <md...@us...> - 2007-12-10 16:17:46
|
Revision: 4688 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4688&view=rev Author: mdboom Date: 2007-12-10 08:17:42 -0800 (Mon, 10 Dec 2007) Log Message: ----------- Merged revisions 4669-4682 via svnmerge from http://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib ........ r4670 | mdboom | 2007-12-07 14:18:58 -0500 (Fri, 07 Dec 2007) | 2 lines Updating CHANGELOG. ........ r4679 | mdboom | 2007-12-10 09:50:40 -0500 (Mon, 10 Dec 2007) | 2 lines Use an 8-spline approximation of an ellipse instead of a 4-spline one. ........ Modified Paths: -------------- branches/transforms/CHANGELOG branches/transforms/lib/matplotlib/backends/backend_ps.py branches/transforms/lib/matplotlib/patches.py Added Paths: ----------- branches/transforms/unit/ellipse_large.py Property Changed: ---------------- branches/transforms/ Property changes on: branches/transforms ___________________________________________________________________ Name: svnmerge-integrated - /trunk/matplotlib:1-4668 + /trunk/matplotlib:1-4682 Modified: branches/transforms/CHANGELOG =================================================================== --- branches/transforms/CHANGELOG 2007-12-10 16:17:16 UTC (rev 4687) +++ branches/transforms/CHANGELOG 2007-12-10 16:17:42 UTC (rev 4688) @@ -1,3 +1,5 @@ +2007-12-07 Issue a warning when drawing an image on a non-linear axis. - MGD + 2007-12-06 let widgets.Cursor initialize to the lower x and y bounds rather than 0,0, which can cause havoc for dates and other transforms - DSD @@ -6,6 +8,10 @@ 2007-12-06 fixed a bug in rcsetup, see bug 1845057 - DSD +2007-12-05 Fix how fonts are cached to avoid loading the same one multiple times. + (This was a regression since 0.90 caused by the refactoring of + font_manager.py) - MGD + =============================================================== 2007-11-27 Released 0.91.1 at revision 4517 Modified: branches/transforms/lib/matplotlib/backends/backend_ps.py =================================================================== --- branches/transforms/lib/matplotlib/backends/backend_ps.py 2007-12-10 16:17:16 UTC (rev 4687) +++ branches/transforms/lib/matplotlib/backends/backend_ps.py 2007-12-10 16:17:42 UTC (rev 4688) @@ -1430,4 +1430,31 @@ clip newpath } bind def""", +<<<<<<< .working +======= + # angle1 angle2 rx ry x y *ellipse* - + """/ellipse { + newpath + matrix currentmatrix 7 1 roll + translate + scale + 0 0 1 5 3 roll arc + setmatrix + closepath + } bind def""", + """/unitcircle { + newpath +0. -1. moveto +0.2652031 -1.0 0.519579870785 -0.894633691588 0.707106781187 -0.707106781187 curveto +0.894633691588 -0.519579870785 1.0 -0.2652031 1.0 0.0 curveto +1.0 0.2652031 0.894633691588 0.519579870785 0.707106781187 0.707106781187 curveto +0.519579870785 0.894633691588 0.2652031 1.0 0.0 1.0 curveto +-0.2652031 1.0 -0.519579870785 0.894633691588 -0.707106781187 0.707106781187 curveto +-0.894633691588 0.519579870785 -1.0 0.2652031 -1.0 0.0 curveto +-1.0 -0.2652031 -0.894633691588 -0.519579870785 -0.707106781187 -0.707106781187 curveto +-0.519579870785 -0.894633691588 -0.2652031 -1.0 0.0 -1.0 curveto +closepath + } bind def""", + +>>>>>>> .merge-right.r4679 ] Modified: branches/transforms/lib/matplotlib/patches.py =================================================================== --- branches/transforms/lib/matplotlib/patches.py 2007-12-10 16:17:16 UTC (rev 4687) +++ branches/transforms/lib/matplotlib/patches.py 2007-12-10 16:17:42 UTC (rev 4688) @@ -820,6 +820,49 @@ """ A scale-free ellipse """ +<<<<<<< .working +======= + MAGIC = 0.2652031 + SQRT2 = npy.sqrt(0.5) + MAGIC45 = npy.sqrt((MAGIC*MAGIC) / 2.0) + + circle = npy.array( + [[0.0, -1.0], + + [MAGIC, -1.0], + [SQRT2-MAGIC45, -SQRT2-MAGIC45], + [SQRT2, -SQRT2], + + [SQRT2+MAGIC45, -SQRT2+MAGIC45], + [1.0, -MAGIC], + [1.0, 0.0], + + [1.0, MAGIC], + [SQRT2+MAGIC45, SQRT2-MAGIC45], + [SQRT2, SQRT2], + + [SQRT2-MAGIC45, SQRT2+MAGIC45], + [MAGIC, 1.0], + [0.0, 1.0], + + [-MAGIC, 1.0], + [-SQRT2+MAGIC45, SQRT2+MAGIC45], + [-SQRT2, SQRT2], + + [-SQRT2-MAGIC45, SQRT2-MAGIC45], + [-1.0, MAGIC], + [-1.0, 0.0], + + [-1.0, -MAGIC], + [-SQRT2-MAGIC45, -SQRT2+MAGIC45], + [-SQRT2, -SQRT2], + + [-SQRT2+MAGIC45, -SQRT2-MAGIC45], + [-MAGIC, -1.0], + [0.0, -1.0]], + npy.float_) + +>>>>>>> .merge-right.r4679 def __str__(self): return "Ellipse(%d,%d;%dx%d)"%(self.center[0],self.center[1],self.width,self.height) @@ -855,10 +898,17 @@ def get_patch_transform(self): return self._patch_transform +<<<<<<< .working def contains(self,ev): if ev.x is None or ev.y is None: return False,{} x, y = self.get_transform().inverted().transform_point((ev.x, ev.y)) return (x*x + y*y) <= 1.0, {} +======= + xcenter = self.convert_xunits(xcenter) + width = self.convert_xunits(width) + ycenter = self.convert_yunits(ycenter) + height = self.convert_xunits(height) +>>>>>>> .merge-right.r4679 def _get_center(self): return self._center @@ -882,6 +932,105 @@ angle = property(_get_angle, _set_angle) +<<<<<<< .working +======= + rtheta = angle*npy.pi/180. + R = npy.array([ + [npy.cos(rtheta), -npy.sin(rtheta)], + [npy.sin(rtheta), npy.cos(rtheta)], + ]) + + + x, y = npy.dot(R, npy.array([x, y])) + x += xcenter + y += ycenter + + return zip(x, y) + + def draw(self, renderer): + if not self.get_visible(): return + #renderer.open_group('patch') + gc = renderer.new_gc() + gc.set_foreground(self._edgecolor) + gc.set_linewidth(self._linewidth) + gc.set_alpha(self._alpha) + gc.set_antialiased(self._antialiased) + self._set_gc_clip(gc) + + gc.set_capstyle('projecting') + + if not self.fill or self._facecolor is None: rgbFace = None + else: rgbFace = colors.colorConverter.to_rgb(self._facecolor) + + if self._hatch: + gc.set_hatch(self._hatch ) + + + if not hasattr(renderer, 'draw_path'): + mpl.verbose.report('patches.Ellipse renderer does not support path drawing; falling back on vertex approximation for nonlinear transformation') + renderer.draw_polygon(gc, rgbFace, self.get_verts()) + return + + + x, y = self.center + x = self.convert_xunits(x) + y = self.convert_yunits(y) + w = self.convert_xunits(self.width)/2. + h = self.convert_yunits(self.height)/2. + + theta = self.angle * npy.pi/180. + T = npy.array([ + [1, 0, x], + [0, 1, y], + [0, 0, 1]]) + + + + + S = npy.array([ + [w, 0, 0], + [0, h, 0], + [0, 0, 1]]) + + + + # rotate by theta + R = npy.array([ + [npy.cos(theta), -npy.sin(theta), 0], + [npy.sin(theta), npy.cos(theta), 0], + [0, 0, 1]]) + + # transform unit circle into ellipse + E = npy.dot(T, npy.dot(R, S)) + + + # Apply the display affine + sx, b, c, sy, tx, ty = self.get_transform().as_vec6_val() + + # display coords + D = npy.array([ + [sx, b, tx], + [c, sy, ty], + [0, 0, 1]], npy.float_) + + M = npy.dot(D,E) + + C = npy.ones((3, len(self.circle))) + C[0:2,:] = self.circle.T + + ellipse = npy.dot(M, C).T[:,:2] + + path = agg.path_storage() + path.move_to(*ellipse[0]) + for i in range(1, 25, 3): + path.curve4(*ellipse[i:i+3].flat) + path.close_polygon() + + renderer.draw_path(gc, rgbFace, path) + + +>>>>>>> .merge-right.r4679 + class Circle(Ellipse): """ A circle patch Copied: branches/transforms/unit/ellipse_large.py (from rev 4679, trunk/matplotlib/unit/ellipse_large.py) =================================================================== --- branches/transforms/unit/ellipse_large.py (rev 0) +++ branches/transforms/unit/ellipse_large.py 2007-12-10 16:17:42 UTC (rev 4688) @@ -0,0 +1,107 @@ + +# This example can be boiled down to a more simplistic example +# to show the problem, but bu including the upper and lower +# bound ellipses, it demonstrates how significant this error +# is to our plots. + +import math +from pylab import * +from matplotlib.patches import Ellipse + +# given a point x, y +x = 2692.440 +y = 6720.850 + +# get is the radius of a circle through this point +r = math.sqrt( x*x+y*y ) + +# show some comparative circles +delta = 6 + + +################################################## +def custom_ellipse( ax, x, y, major, minor, theta, numpoints = 750, **kwargs ): + xs = [] + ys = [] + incr = 2.0*math.pi / numpoints + incrTheta = 0.0 + while incrTheta <= (2.0*math.pi): + a = major * math.cos( incrTheta ) + b = minor * math.sin( incrTheta ) + l = math.sqrt( ( a**2 ) + ( b**2 ) ) + phi = math.atan2( b, a ) + incrTheta += incr + + xs.append( x + ( l * math.cos( theta + phi ) ) ) + ys.append( y + ( l * math.sin( theta + phi ) ) ) + # end while + + incrTheta = 2.0*math.pi + a = major * math.cos( incrTheta ) + b = minor * math.sin( incrTheta ) + l = sqrt( ( a**2 ) + ( b**2 ) ) + phi = math.atan2( b, a ) + xs.append( x + ( l * math.cos( theta + phi ) ) ) + ys.append( y + ( l * math.sin( theta + phi ) ) ) + + ellipseLine = ax.plot( xs, ys, **kwargs ) + + +################################################## +# make the axes +ax = subplot( 211, aspect='equal' ) +ax.set_aspect( 'equal', 'datalim' ) + +# make the lower-bound ellipse +diam = (r - delta) * 2.0 +lower_ellipse = Ellipse( (0.0, 0.0), diam, diam, 0.0, fill=False, edgecolor="darkgreen" ) +ax.add_patch( lower_ellipse ) + +# make the target ellipse +diam = r * 2.0 +target_ellipse = Ellipse( (0.0, 0.0), diam, diam, 0.0, fill=False, edgecolor="darkred" ) +ax.add_patch( target_ellipse ) + +# make the upper-bound ellipse +diam = (r + delta) * 2.0 +upper_ellipse = Ellipse( (0.0, 0.0), diam, diam, 0.0, fill=False, edgecolor="darkblue" ) +ax.add_patch( upper_ellipse ) + +# make the target +diam = delta * 2.0 +target = Ellipse( (x, y), diam, diam, 0.0, fill=False, edgecolor="#DD1208" ) +ax.add_patch( target ) + +# give it a big marker +ax.plot( [x], [y], marker='x', linestyle='None', mfc='red', mec='red', markersize=10 ) + +################################################## +# now lets do the same thing again using a custom ellipse function + +# make the axes +ax = subplot( 212, aspect='equal', sharex=ax, sharey=ax ) +ax.set_aspect( 'equal', 'datalim' ) + +# make the lower-bound ellipse +custom_ellipse( ax, 0.0, 0.0, r-delta, r-delta, 0.0, color="darkgreen" ) + +# make the target ellipse +custom_ellipse( ax, 0.0, 0.0, r, r, 0.0, color="darkred" ) + +# make the upper-bound ellipse +custom_ellipse( ax, 0.0, 0.0, r+delta, r+delta, 0.0, color="darkblue" ) + +# make the target +custom_ellipse( ax, x, y, delta, delta, 0.0, color="#BB1208" ) + +# give it a big marker +ax.plot( [x], [y], marker='x', linestyle='None', mfc='red', mec='red', markersize=10 ) + +################################################## +# lets zoom in to see the area of interest + +ax.set_xlim(2650, 2735) +ax.set_ylim(6705, 6735) +show() + +savefig("ellipse") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |