00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "plplotP.h"
00023
00024 #define CIRCLE_SEGMENTS PL_MAXPOLY
00025 #define DEG_TO_RAD(x) ((x) * M_PI / 180.0)
00026
00027 #define PLARC_POINT_X(x, a, b, theta) ((x) + ((a) * cos(theta)))
00028 #define PLARC_POINT_Y(y, a, b, theta) ((y) + ((b) * sin(theta)))
00029
00030
00031
00032
00033
00034
00035
00036 void
00037 plarc_approx(PLFLT x, PLFLT y, PLFLT a, PLFLT b, PLFLT angle1, PLFLT angle2, PLBOOL fill)
00038 {
00039 PLINT i;
00040 PLFLT theta0, theta_step, theta, d_angle;
00041 PLINT segments;
00042 PLFLT xs[CIRCLE_SEGMENTS], ys[CIRCLE_SEGMENTS];
00043
00044
00045 d_angle = DEG_TO_RAD(angle2 - angle1);
00046 if (fabs(d_angle) > M_PI * 2.0)
00047 d_angle = M_PI * 2.0;
00048
00049
00050 segments = d_angle / (2.0 * M_PI) * CIRCLE_SEGMENTS;
00051
00052 if (segments < 2)
00053 segments = 2;
00054
00055
00056 theta0 = DEG_TO_RAD(angle1);
00057
00058 theta_step = d_angle / (segments - 1);
00059
00060
00061 for (i = 0; i < segments; i++) {
00062 theta = theta0 + theta_step * (PLFLT) i;
00063 xs[i] = PLARC_POINT_X(x, a, b, theta);
00064 ys[i] = PLARC_POINT_Y(y, a, b, theta);
00065 }
00066
00067 if (fill) {
00068
00069 if (fabs(d_angle) < M_PI * 2.0) {
00070 xs[segments - 1] = x;
00071 ys[segments - 1] = y;
00072 }
00073
00074 plfill(segments, xs, ys);
00075 }
00076 else {
00077
00078 plline(segments, xs, ys);
00079 }
00080 }
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 void
00104 c_plarc(PLFLT x, PLFLT y, PLFLT a, PLFLT b, PLFLT angle1, PLFLT angle2, PLBOOL fill)
00105 {
00106 PLINT xscl[2], yscl[2];
00107 PLINT clpxmi, clpxma, clpymi, clpyma;
00108 arc_struct *arc_info;
00109
00110
00111 if (plsc->dev_arc && plsc->diorot == 0) {
00112 arc_info = (arc_struct *) malloc((size_t) sizeof(arc_struct));
00113
00114 xscl[0] = plP_wcpcx(x-a);
00115 xscl[1] = plP_wcpcx(x+a);
00116 yscl[0] = plP_wcpcy(y-b);
00117 yscl[1] = plP_wcpcy(y+b);
00118 difilt(xscl,yscl,2,&clpxmi,&clpxma,&clpymi,&clpyma);
00119
00120 arc_info->x = 0.5 * (xscl[1] + xscl[0]);
00121 arc_info->y = 0.5 * (yscl[1] + yscl[0]);
00122 arc_info->a = 0.5 * (xscl[1] - xscl[0]);
00123 arc_info->b = 0.5 * (yscl[1] - yscl[0]);
00124
00125 arc_info->angle1 = angle1;
00126 arc_info->angle2 = angle2;
00127 arc_info->fill = fill;
00128
00129 plP_esc(PLESC_ARC, arc_info);
00130
00131 free(arc_info);
00132 }
00133 else {
00134 plarc_approx(x, y, a, b, angle1, angle2, fill);
00135 }
00136 }
00137