I've now properly implemented the rotate option in plarc and updated the documentation. I've also modified example 27 to provide a more rigorous test / demonstration of the plarc capabilities.
This did throw up a problem with filled arcs. For me the code crashed with a malloc error. Reducing the number of segments by 1 fixed the problem so I think it is either a rounding error, or an off-by-one error in the fill code for dealing with cases where there are > PL_MAXPOLY points in the boundary. My workaround is ok for now, but doesn't address the underlying problem. I'll try and take a look unless anyone else gets there first. Andrew On Wed, Aug 03, 2011 at 10:29:34AM +0100, Andrew Ross wrote: > > Actually, on closer inspection the API to plarc in 5.9.8 supports > an argument rotate, but the argument doesn't actually do anything! > I'll see if we can get this cleaned up. Thanks for drawing it to > our attention. > > Andrew > > On Wed, Aug 03, 2011 at 11:36:51AM +0800, l.f.hwang wrote: > > hi guys, > > > > I had write a patch to support drawing eclipse rotated in 5.9.6, pls > > check attachment enclosed. > > > > > > -- > > l.f.hwang > > 2011-08-03 > > _________________________________________________________ > > > > > > > diff -cr plplot-5.9.6/bindings/c++/plstream.cc > > plplot-5.9.6_p1/bindings/c++/plstream.cc > > *** plplot-5.9.6/bindings/c++/plstream.cc 2010-06-06 00:11:39.000000000 > > +0800 > > --- plplot-5.9.6_p1/bindings/c++/plstream.cc 2010-09-24 > > 09:53:24.056339651 +0800 > > *************** > > *** 328,333 **** > > --- 328,343 ---- > > plarc( x, y, a, b, angle1, angle2, fill ); > > } > > > > + > > + void > > + plstream::arcr( PLFLT x, PLFLT y, PLFLT a, PLFLT b, PLFLT angle1, PLFLT > > angle2, PLFLT rotate, > > + PLBOOL fill ) > > + { > > + set_stream(); > > + > > + plarcr( x, y, a, b, angle1, angle2, rotate, fill ); > > + } > > + > > void > > plstream::arrows( PLFLT * u, PLFLT * v, PLFLT * x, PLFLT * y, PLINT n, > > PLFLT scale, PLFLT dx, PLFLT dy ) > > diff -cr plplot-5.9.6/bindings/c++/plstream.h > > plplot-5.9.6_p1/bindings/c++/plstream.h > > *** plplot-5.9.6/bindings/c++/plstream.h 2010-06-06 00:11:39.000000000 > > +0800 > > --- plplot-5.9.6_p1/bindings/c++/plstream.h 2010-09-24 09:53:25.856319962 > > +0800 > > *************** > > *** 123,128 **** > > --- 123,134 ---- > > > > void arc( PLFLT x, PLFLT y, PLFLT a, PLFLT b, PLFLT angle1, PLFLT > > angle2, > > PLBOOL fill ); > > + > > + // Plot an rotate arc > > + > > + void arcr( PLFLT x, PLFLT y, PLFLT a, PLFLT b, PLFLT angle1, PLFLT > > angle2, PLFLT rotate, > > + PLBOOL fill ); > > + > > > > // Simple arrow plotter > > void arrows( PLFLT *u, PLFLT *v, PLFLT *x, PLFLT *y, PLINT n, > > diff -cr plplot-5.9.6/include/plplot.h plplot-5.9.6_p1/include/plplot.h > > *** plplot-5.9.6/include/plplot.h 2010-06-06 00:11:39.000000000 +0800 > > --- plplot-5.9.6_p1/include/plplot.h 2010-09-24 09:37:53.036314838 > > +0800 > > *************** > > *** 623,628 **** > > --- 623,629 ---- > > #define pl_setcontlabelparam c_pl_setcontlabelparam > > #define pladv c_pladv > > #define plarc c_plarc > > + #define plarcr c_plarcr > > #define plaxes c_plaxes > > #define plbin c_plbin > > #define plbop c_plbop > > *************** > > *** 839,845 **** > > --- 840,852 ---- > > PLDLLIMPEXP void > > c_plarc( PLFLT x, PLFLT y, PLFLT a, PLFLT b, PLFLT angle1, PLFLT angle2, > > PLBOOL fill ); > > + > > + /* Plot an rotated arc */ > > > > + PLDLLIMPEXP void > > + c_plarcr( PLFLT x, PLFLT y, PLFLT a, PLFLT b, PLFLT angle1, PLFLT angle2, > > PLFLT rotate, > > + PLBOOL fill ); > > + > > /* This functions similarly to plbox() except that the origin of the axes > > */ > > /* is placed at the user-specified point (x0, y0). */ > > > > diff -cr plplot-5.9.6/src/plarc.c plplot-5.9.6_p1/src/plarc.c > > *** plplot-5.9.6/src/plarc.c 2010-06-06 00:11:39.000000000 +0800 > > --- plplot-5.9.6_p1/src/plarc.c 2010-11-02 13:01:16.260160438 +0800 > > *************** > > *** 141,143 **** > > --- 141,242 ---- > > } > > } > > > > + > > + > > /*------------------------------------------------------------------------- > > + * c_plarcr : Plot an arc with rotate supportd. > > + * > > + * Takes the following arguments: > > + * > > + * x, y: > > + * x and y coordinates for the center of the arc > > + * > > + * a, b: > > + * Radius of the arc's major and minor axes > > + * > > + * angle1: > > + * Start angle (degrees) > > + * > > + * angle2: > > + * End angle (degrees) > > + * > > + * rotate: > > + * rotate angle ( degrees ) > > + * > > + * fill: > > + * Should the arc be filled? > > + * > > + > > *-------------------------------------------------------------------------*/ > > + > > + void > > + plarcr_approx( PLFLT x, PLFLT y, PLFLT a, PLFLT b, PLFLT angle1, PLFLT > > angle2, PLFLT rotate, PLBOOL fill ) > > + { > > + > > + PLINT i; > > + PLFLT theta0, theta_step, theta, d_angle; > > + > > + /* rotatd angle */ > > + PLFLT alpha = DEG_TO_RAD( rotate ); > > + > > + PLFLT cos_alpha = cos( alpha ); > > + PLFLT sin_alpha = sin( alpha ); > > + > > + PLFLT tmp_x; > > + PLFLT tmp_y; > > + > > + PLINT segments; > > + PLFLT xs[CIRCLE_SEGMENTS], ys[CIRCLE_SEGMENTS]; > > + > > + /* The difference between the start and end angles */ > > + d_angle = DEG_TO_RAD( angle2 - angle1 ); > > + if ( fabs( d_angle ) > M_PI * 2.0 ) > > + d_angle = M_PI * 2.0; > > + > > + /* The number of line segments used to approximate the arc */ > > + segments = d_angle / ( 2.0 * M_PI ) * CIRCLE_SEGMENTS; > > + /* Always use at least 2 arc points, otherwise fills will break. */ > > + if ( segments < 2 ) > > + segments = 2; > > + /* The start angle in radians and number of radians in each > > approximating > > + * segment. */ > > + theta0 = DEG_TO_RAD( angle1 ); > > + > > + theta_step = d_angle / ( segments - 1 ); > > + > > + /* The coordinates for the circle outline */ > > + for ( i = 0; i < segments; i++ ) > > + { > > + theta = theta0 + theta_step * (PLFLT) i; > > + > > + tmp_x = a * cos( theta ); > > + tmp_y = b * sin( theta ); > > + > > + xs[i] = tmp_x * cos_alpha - tmp_y * sin_alpha + x; > > + ys[i] = tmp_y * cos_alpha + tmp_x * sin_alpha + y; > > + //xs[i] = a * ( cos( theta ) * cos_alpha - sin( theta ) * > > sin_alpha ) + x; > > + //ys[i] = b * ( cos( theta ) * sin_alpha + sin( theta ) * > > cos_alpha ) + y; > > + } > > + > > + if ( fill ) > > + { > > + /* Add the center point if we aren't drawing a circle */ > > + if ( fabs( d_angle ) < M_PI * 2.0 ) > > + { > > + xs[segments - 1] = x; > > + ys[segments - 1] = y; > > + } > > + /* Draw a filled arc */ > > + plfill( segments, xs, ys ); > > + } > > + else > > + { > > + /* Draw the arc outline */ > > + plline( segments, xs, ys ); > > + } > > + } > > + > > + void > > + c_plarcr( PLFLT x, PLFLT y, PLFLT a, PLFLT b, PLFLT angle1, PLFLT angle2, > > PLFLT rotate, PLBOOL fill ) > > + { > > + plarcr_approx( x, y, a, b, angle1, angle2, rotate, fill ); > > + } > > + > > > ------------------------------------------------------------------------------ > > BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA > > The must-attend event for mobile developers. Connect with experts. > > Get tools for creating Super Apps. See the latest technologies. > > Sessions, hands-on labs, demos & much more. Register early & save! > > http://p.sf.net/sfu/rim-blackberry-1 > > _______________________________________________ > > Plplot-devel mailing list > > Plplot-devel@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/plplot-devel > > > ------------------------------------------------------------------------------ > BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA > The must-attend event for mobile developers. Connect with experts. > Get tools for creating Super Apps. See the latest technologies. > Sessions, hands-on labs, demos & much more. Register early & save! > http://p.sf.net/sfu/rim-blackberry-1 > _______________________________________________ > Plplot-devel mailing list > Plplot-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/plplot-devel > ------------------------------------------------------------------------------ BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA The must-attend event for mobile developers. Connect with experts. Get tools for creating Super Apps. See the latest technologies. Sessions, hands-on labs, demos & much more. Register early & save! http://p.sf.net/sfu/rim-blackberry-1 _______________________________________________ Plplot-devel mailing list Plplot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/plplot-devel