void hedge_draw_edge(epswr_figure_t *eps, hedge_arc_t *a, char *laba, char *labb, bool_t nodes) { hedge_arc_t *b = a->twin; hedge_vert_t *org = a->org; hedge_vert_t *dst = b->org; if ((! org->show) && (! dst->show)) { return; } /* Bézier control points for edge proper: */ double p1x, p1y, p2x, p2y; hedge_draw_get_edge_bezier_points(a, &p1x, &p1y, &p2x, &p2y); if (nodes) { /* Draw the node boxes and links, with labels: */ hedge_draw_arc_record(eps, a, p1x, p1y, p2x, p2y, laba); hedge_draw_arc_record(eps, b, p2x, p2y, p1x, p1y, labb); } else { double p0x = org->pos.c[0], p0y = org->pos.c[1]; double p3x = dst->pos.c[0], p3y = dst->pos.c[1]; if ((laba == NULL) && (labb == NULL)) { /* Draw the actual edge: */ epswr_curve(eps, p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y); } else { /* Draw arrowheads on edge and labels: */ if (laba != NULL) { hedge_draw_arc_arrow(eps, p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y); hedge_draw_arc_label(eps, p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, laba); } if (labb != NULL) { hedge_draw_arc_arrow(eps, p3x, p3y, p2x, p2y, p1x, p1y, p0x, p0y); hedge_draw_arc_label(eps, p3x, p3y, p2x, p2y, p1x, p1y, p0x, p0y, labb); } } } } void hedge_draw_arc_label ( epswr_figure_t *eps, double p0x, double p0y, double p1x, double p1y, double p2x, double p2y, double p3x, double p3y, char *lab ) { double t = 0.3; /* Label position along arg. */ double x, dx; hedge_draw_bezier_eval(t, p0x, p1x, p2x, p3x, &x, &dx); double y, dy; hedge_draw_bezier_eval(t, p0y, p1y, p2y, p3y, &y, &dy); double hAlign, vAlign; hedge_draw_choose_arc_lab_align(dx, dy, &hAlign, &vAlign); if (lab != NULL) { epswr_label(eps, lab, "Lg", x, y, 0, TRUE, hAlign, vAlign, TRUE, FALSE); } } void hedge_draw_bezier_eval(double t, double z0, double z1, double z2, double z3, double *z_P, double *dz_P) { double s = 1.0-t; double z01 = s*z0 + t*z1; double dz01 = z1 - z0; double z12 = s*z1 + t*z2; double dz12 = z2 - z1; double z23 = s*z2 + t*z3; double dz23 = z3 - z2; double z012 = s*z01 + t*z12; double dz012 = z12 - z01 + s*dz01 + t*dz12; double z123 = s*z12 + t*z23; double dz123 = z23 - z12 + s*dz12 + t*dz23; double z0123 = s*z012 + t*z123; double dz0123 = z123 - z012 + s*dz012 + t*dz123; (*z_P) = z0123; (*dz_P) = dz0123; } void hedge_draw_choose_lab_align(r2_t *dp, double *hAlign_P, double *vAlign_P); /* Chooses the parameters {hAlign} and {vAlign} for {epswr_label} based on the direction of the displacement {dp} from the labebeld point. The {displacement {dp} must be in the world coordinate system, not the local tangent system. */ void hedge_draw_choose_lab_align(r2_t *dp, double *hAlign_P, double *vAlign_P) { (*hAlign_P) = (dp->c[0] > 0 ? 0.0 : (dp->c[0] < 0 ? 1.0 : 0.5)); (*vAlign_P) = (dp->c[1] > 0 ? 0.0 : (dp->c[1] < 0 ? 1.0 : 0.5)); } double hAlign, vAlign; hedge_draw_choose_lab_align(&dsp, &hAlign, &vAlign); fprintf(stderr, " align = ( %7.2f, %7.2f )\n", hAlign, vAlign); double hAlign, vAlign; hedge_draw_choose_lab_align(&dsp, &hAlign, &vAlign); fprintf(stderr, " align = ( %7.2f, %7.2f )\n", hAlign, vAlign); double hAlign, vAlign; hedge_draw_choose_lab_align(&dp, &hAlign, &vAlign); fprintf(stderr, " align = ( %7.2f, %7.2f )\n", hAlign, vAlign);