Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 35006) +++ trunk/src/obj_arc.c (revision 35007) @@ -965,6 +965,18 @@ return atan2(-(y - arc->Y), (x - arc->X)) * 180.0 / M_PI + 180.0; } +int pcb_arc_get_xy(pcb_arc_t *arc, rnd_angle_t ang, rnd_coord_t *x, rnd_coord_t *y) +{ + if (!pcb_angle_in_arc(arc, ang, 1)) + return -1; + + *x = rnd_round((double)arc->X - (double)arc->Width * cos(ang * RND_M180)); + *y = rnd_round((double)arc->Y + (double)arc->Height * sin(ang * RND_M180)); + + return 0; +} + + void *pcb_arc_insert_point(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_arc_t *arc) { rnd_angle_t end_ang = arc->StartAngle + arc->Delta; Index: trunk/src/obj_arc.h =================================================================== --- trunk/src/obj_arc.h (revision 35006) +++ trunk/src/obj_arc.h (revision 35007) @@ -83,7 +83,11 @@ /* Convert an x;y coord assumed to be on the arc into arc angle */ rnd_angle_t pcb_arc_get_angle(pcb_arc_t *arc, rnd_coord_t x, rnd_coord_t y); +/* Convert an arc angle to x;y coords; returns 0 on success, -1 on error + (angle out of range) */ +int pcb_arc_get_xy(pcb_arc_t *arc, rnd_angle_t ang, 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) \