Index: trunk/src/find_geo.c =================================================================== --- trunk/src/find_geo.c (revision 15293) +++ trunk/src/find_geo.c (revision 15294) @@ -824,8 +824,8 @@ vy = (double)dy / -l * ((double)Bloat/2.0); /* long line - consider edge intersection */ - if (pcb_pline_isect_line(pl, x1 + ox + vx, y1 + oy + vy, x2 + ox - vx, y2 + oy - vy)) return pcb_true; - if (pcb_pline_isect_line(pl, x1 - ox + vx, y1 - oy + vy, x2 - ox - vx, y2 - oy - vy)) return pcb_true; + if (pcb_pline_isect_line(pl, x1 + ox + vx, y1 + oy + vy, x2 + ox - vx, y2 + oy - vy, NULL, NULL)) return pcb_true; + if (pcb_pline_isect_line(pl, x1 - ox + vx, y1 - oy + vy, x2 - ox - vx, y2 - oy - vy, NULL, NULL)) return pcb_true; /* A corner case is when the polyline is fully within the line. By now we are sure there's no contour intersection, so if any of the polyline points Index: trunk/src/polygon.h =================================================================== --- trunk/src/polygon.h (revision 15293) +++ trunk/src/polygon.h (revision 15294) @@ -95,7 +95,7 @@ pcb_bool_t pcb_is_point_in_convex_quad(pcb_vector_t p, pcb_vector_t *q); pcb_bool pcb_poly_is_rect_in_p(pcb_coord_t, pcb_coord_t, pcb_coord_t, pcb_coord_t, pcb_poly_t *); pcb_bool pcb_poly_isects_poly(pcb_polyarea_t *, pcb_poly_t *, pcb_bool); -pcb_bool pcb_pline_isect_line(pcb_pline_t *pl, pcb_coord_t lx1, pcb_coord_t ly1, pcb_coord_t lx2, pcb_coord_t ly2); +pcb_bool pcb_pline_isect_line(pcb_pline_t *pl, pcb_coord_t lx1, pcb_coord_t ly1, pcb_coord_t lx2, pcb_coord_t ly2, pcb_coord_t *cx, pcb_coord_t *cy); pcb_bool pcb_pline_isect_circ(pcb_pline_t *pl, pcb_coord_t cx, pcb_coord_t cy, pcb_coord_t r); /* cirlce contour crosses polyline contour */ pcb_bool pcb_pline_embraces_circ(pcb_pline_t *pl, pcb_coord_t cx, pcb_coord_t cy, pcb_coord_t r); /* circle is within the polyline; caller must make sure they do not cross! */ pcb_bool pcb_pline_overlaps_circ(pcb_pline_t *pl, pcb_coord_t cx, pcb_coord_t cy, pcb_coord_t r); /* circle is within or is crossing the polyline */ Index: trunk/src/polygon1.c =================================================================== --- trunk/src/polygon1.c (revision 15293) +++ trunk/src/polygon1.c (revision 15294) @@ -3321,11 +3321,12 @@ /* * pcb_pline_isect_line() - * (C) 2017 Tibor 'Igor2' Palinkas + * (C) 2017, 2018 Tibor 'Igor2' Palinkas */ typedef struct { pcb_vector_t l1, l2; + pcb_coord_t cx, cy; } pline_isect_line_t; static pcb_r_dir_t pline_isect_line_cb(const pcb_box_t * b, void *cl) @@ -3334,13 +3335,16 @@ struct seg *s = (struct seg *)b; pcb_vector_t S1, S2; - if (pcb_vect_inters2(s->v->point, s->v->next->point, ctx->l1, ctx->l2, S1, S2)) + if (pcb_vect_inters2(s->v->point, s->v->next->point, ctx->l1, ctx->l2, S1, S2)) { + ctx->cx = S1[0]; + ctx->cy = S1[1]; return PCB_R_DIR_CANCEL; /* found */ + } return PCB_R_DIR_NOT_FOUND; } -pcb_bool pcb_pline_isect_line(pcb_pline_t *pl, pcb_coord_t lx1, pcb_coord_t ly1, pcb_coord_t lx2, pcb_coord_t ly2) +pcb_bool pcb_pline_isect_line(pcb_pline_t *pl, pcb_coord_t lx1, pcb_coord_t ly1, pcb_coord_t lx2, pcb_coord_t ly2, pcb_coord_t *cx, pcb_coord_t *cy) { pline_isect_line_t ctx; pcb_box_t lbx; @@ -3354,7 +3358,12 @@ if (pl->tree == NULL) pl->tree = (pcb_rtree_t *) make_edge_tree(pl); - return pcb_r_search(pl->tree, &lbx, NULL, pline_isect_line_cb, &ctx, NULL) == PCB_R_DIR_CANCEL; + if (pcb_r_search(pl->tree, &lbx, NULL, pline_isect_line_cb, &ctx, NULL) == PCB_R_DIR_CANCEL) { + if (cx != NULL) *cx = ctx.cx; + if (cy != NULL) *cy = ctx.cy; + return pcb_true; + } + return pcb_false; } /*