Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 34967) +++ trunk/src/obj_arc.c (revision 34968) @@ -912,11 +912,16 @@ return Arc; } +rnd_angle_t pcb_arc_get_angle(pcb_arc_t *arc, rnd_coord_t x, rnd_coord_t y) +{ + return atan2(-(y - arc->Y), (x - arc->X)) * 180.0 / M_PI + 180.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; rnd_coord_t x = pcb_crosshair.X, y = pcb_crosshair.Y; - rnd_angle_t angle = atan2(-(y - arc->Y), (x - arc->X)) * 180.0 / M_PI + 180.0; + rnd_angle_t angle = pcb_arc_get_angle(arc, x, y); pcb_arc_t *new_arc; if (end_ang > 360.0) Index: trunk/src/obj_arc.h =================================================================== --- trunk/src/obj_arc.h (revision 34967) +++ trunk/src/obj_arc.h (revision 34968) @@ -80,6 +80,10 @@ void pcb_arc_get_end(pcb_arc_t *Arc, int which, rnd_coord_t *x, rnd_coord_t *y); void pcb_arc_middle(const pcb_arc_t *arc, rnd_coord_t *x, rnd_coord_t *y); +/* 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); + + /* 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