Thank you for your patch. This functionality is already implemented in 
the current version of plplot (5.9.8), although the documentation has
not been properly updated. I will fix this in the subversion repository.

Regards

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

Reply via email to