Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 34977) +++ trunk/src/obj_arc.c (revision 34978) @@ -184,7 +184,55 @@ rnd_arc_get_endpt(arc->X, arc->Y, arc->Width, arc->Height, arc->StartAngle, arc->Delta, which, x, y); } +int pcb_angle_in_arc_(double arc_sa, double arc_da, double ang, int inclusive) +{ + double arc_ea; + /* make sure angle is always positive */ + if (ang < 0) + ang += 360.0; + + if (arc_da < 0) { /* swap endpoints so da is always positive */ + arc_sa = arc_sa + arc_da; + arc_da = -arc_da; + } + if (arc_sa < 0) + arc_sa += 360.0; + + arc_ea = arc_sa + arc_da; + + /* if arc spans from some high value through zero, the end angle has + to be larger than 360; if ang is under both start and end, that may + be the case so add a full circle to ang, last chance to get it in + range */ + if ((arc_sa > ang) && (arc_ea > ang)) + ang += 360.0; + + if (inclusive) { + if ((ang >= arc_sa) && (ang <= arc_ea)) + return 1; + } + else { + if ((ang > arc_sa) && (ang < arc_ea)) + return 1; + } + + if (arc_ea > 360.0) { + ang += 360.0; + if (inclusive) { + if ((ang >= arc_sa) && (ang <= arc_ea)) + return 1; + } + else { + if ((ang > arc_sa) && (ang < arc_ea)) + return 1; + } + } + + return 0; +} + + void pcb_arc_set_angles(pcb_layer_t *Layer, pcb_arc_t *a, rnd_angle_t new_sa, rnd_angle_t new_da) { if (new_da >= 360) { Index: trunk/src/obj_arc.h =================================================================== --- trunk/src/obj_arc.h (revision 34977) +++ trunk/src/obj_arc.h (revision 34978) @@ -84,6 +84,13 @@ rnd_angle_t pcb_arc_get_angle(pcb_arc_t *arc, rnd_coord_t x, rnd_coord_t y); +/* Returns whether ang is within an arc (specified by start and delta angle) */ +int pcb_angle_in_arc_(double arc_sa, double arc_da, double ang, int inclusive); +#define pcb_angle_in_arc(arc, ang, inclusive) \ + pcb_angle_in_arc_(arc->StartAngle, arc->Delta, ang, inclusive) + + + /* Call cb() with coords of approximation for an arc from start to end, or end to start (if reverse is true). Resolution is set by res: if it is positive, it is an angle in degrees; if negative, it's an edge length in rnd_coord_t; if