Index: trunk/src/plugins/rt_topo/crbs_cdt.c =================================================================== --- trunk/src/plugins/rt_topo/crbs_cdt.c (revision 1360) +++ trunk/src/plugins/rt_topo/crbs_cdt.c (revision 1361) @@ -31,6 +31,54 @@ #include "geo.h" #include "gengeo2d/cline.h" +static void long_constrained_edge(cdt_t *cdt, point_t *p1, point_t *p2, double maxlen2, double maxlen, void *udata) +{ + edge_t *e; + double dx = p2->pos.x - p1->pos.x, dy = p2->pos.y - p1->pos.y; + double len2 = dx*dx + dy*dy; + + + if (len2 > maxlen2) { + double d, len, x, y; + long spn, n; + point_t *lp, *p; + + len = sqrt(len2); + spn = ceil(len/maxlen); +printf("A dx;dy=%f;%f\n", dx, dy); + dx /= ((double)spn+1); + dy /= ((double)spn+1); +printf("B dx;dy=%f;%f\n", dx, dy); + x = p1->pos.x; + y = p1->pos.y; + lp = p1; + +printf("spn=%d\n", spn); + for(n = 0; n < spn; n++) { + x += dx; + y += dy; +printf(" [%ld] %f %f\n", n, x, y); + p = cdt_insert_point(cdt, x, y); + if (p == NULL) { +printf(" oops\n"); + continue; + } + e = cdt_insert_constrained_edge(cdt, lp, p); + e->data = udata; + lp = p; + } +printf(" end %f %f\n", p2->pos.x, p2->pos.y); + + e = cdt_insert_constrained_edge(cdt, lp, p2); + e->data = udata; +printf("ok\n"); + } + else { + e = cdt_insert_constrained_edge(cdt, p1, p2); + e->data = udata; + } +} + void rt_topo_crbs_cdt_init(rtrnd_t *ctx, rtrnd_layer_t *ly, crbs_t *crbs) { rtrnd_any_obj_t *obj; @@ -41,7 +89,10 @@ rtp_vertex_t *v; edge_t *e; long n; + double maxl2, maxlen = (rt_topo_cfg.wire_thick + rt_topo_cfg.wire_clr/2) * 50; /* split long constrained edges so that no segment is longer than this value */ + maxl2 = maxlen*maxlen; + cdt_init(cdt, ctx->board->hdr.bbox.x1, ctx->board->hdr.bbox.y1, ctx->board->hdr.bbox.x2, ctx->board->hdr.bbox.y2); for(via = rtrnd_rtree_all_first(&it, &ctx->board->vias); via != NULL; via = rtrnd_rtree_all_next(&it)) @@ -52,10 +103,7 @@ case RTRND_LINE: p1 = cdt_insert_point(&crbs->cdt, obj->line.cline.p1.x, obj->line.cline.p1.y); p2 = cdt_insert_point(&crbs->cdt, obj->line.cline.p2.x, obj->line.cline.p2.y); - if (p1 != p2) { - e = cdt_insert_constrained_edge(cdt, p1, p2); - e->data = obj; - } + long_constrained_edge(&crbs->cdt, p1, p2, maxl2, maxlen, obj); break; case RTRND_POLY: v = gdl_last(&obj->poly.rtpoly.lst); @@ -62,8 +110,7 @@ p2 = cdt_insert_point(&crbs->cdt, v->x, v->y); for(v = gdl_first(&obj->poly.rtpoly.lst); v != NULL; v = gdl_next(&obj->poly.rtpoly.lst, v)) { p1 = cdt_insert_point(&crbs->cdt, v->x, v->y); - e = cdt_insert_constrained_edge(cdt, p1, p2); - e->data = obj; + long_constrained_edge(&crbs->cdt, p1, p2, maxl2, maxlen, obj); p2 = p1; } break; @@ -75,7 +122,7 @@ if (crbs->enable_mid_virt) { vtd0_t np = {0}; - double minlen2 = (rt_topo_cfg.wire_thick + rt_topo_cfg.wire_clr/2) * 4; /* minimum length of an edge to split */ + double minlen2 = (rt_topo_cfg.wire_thick + rt_topo_cfg.wire_clr/2) * 16; /* minimum length of an edge to split */ minlen2 = minlen2 * minlen2;