/*! \brief Get line width \param gln line (geoline) \return line width */ float gv_line_length(geoline * gln) { int n; float length = 0.0; for (n = 0; n < gln->npts - 1; n++) { if (gln->p2) { length += GS_P2distance(gln->p2[n + 1], gln->p2[n]); } else { length += GS_distance(gln->p3[n + 1], gln->p3[n]); } } return (length); }
/*! \brief Check if segment intersect vector region Clipping performed: - bgn and end are replaced so that both points are within viewregion - if seg intersects \param gs surface (geosurf) \param bgn begin point \param end end point \return 0 if segment doesn't intersect the viewregion, or intersects only at corner \return otherwise returns 1 */ int seg_intersect_vregion(geosurf * gs, float *bgn, float *end) { float *replace, xl, yb, xr, yt, xi, yi; int inside = 0; xl = 0.0; xr = VCOL2X(gs, VCOLS(gs)); yt = VROW2Y(gs, 0); yb = VROW2Y(gs, VROWS(gs)); if (in_vregion(gs, bgn)) { replace = end; inside++; } if (in_vregion(gs, end)) { replace = bgn; inside++; } if (inside == 2) { return (1); } else if (inside) { /* one in & one out - replace gets first intersection */ if (segs_intersect (bgn[X], bgn[Y], end[X], end[Y], xl, yb, xl, yt, &xi, &yi)) { /* left */ } else if (segs_intersect (bgn[X], bgn[Y], end[X], end[Y], xr, yb, xr, yt, &xi, &yi)) { /* right */ } else if (segs_intersect (bgn[X], bgn[Y], end[X], end[Y], xl, yb, xr, yb, &xi, &yi)) { /* bottom */ } else if (segs_intersect (bgn[X], bgn[Y], end[X], end[Y], xl, yt, xr, yt, &xi, &yi)) { /* top */ } replace[X] = xi; replace[Y] = yi; } else { /* both out - find 2 intersects & replace both */ float pt1[2], pt2[2]; replace = pt1; if (segs_intersect (bgn[X], bgn[Y], end[X], end[Y], xl, yb, xl, yt, &xi, &yi)) { replace[X] = xi; replace[Y] = yi; replace = pt2; inside++; } if (segs_intersect (bgn[X], bgn[Y], end[X], end[Y], xr, yb, xr, yt, &xi, &yi)) { replace[X] = xi; replace[Y] = yi; replace = pt2; inside++; } if (inside < 2) { if (segs_intersect (bgn[X], bgn[Y], end[X], end[Y], xl, yb, xr, yb, &xi, &yi)) { replace[X] = xi; replace[Y] = yi; replace = pt2; inside++; } } if (inside < 2) { if (segs_intersect (bgn[X], bgn[Y], end[X], end[Y], xl, yt, xr, yt, &xi, &yi)) { replace[X] = xi; replace[Y] = yi; inside++; } } if (inside < 2) { return (0); /* no intersect or only 1 point on corner */ } /* compare dist of intersects to bgn - closest replaces bgn */ if (GS_P2distance(bgn, pt1) < GS_P2distance(bgn, pt2)) { bgn[X] = pt1[X]; bgn[Y] = pt1[Y]; end[X] = pt2[X]; end[Y] = pt2[Y]; } else { bgn[X] = pt2[X]; bgn[Y] = pt2[Y]; end[X] = pt1[X]; end[Y] = pt1[Y]; } } return (1); }