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&reg; 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&reg; 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&reg; 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

Reply via email to