123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #include <stdio.h>
- #include <math.h>
- #include <grass/vector.h>
- #include "sw_defs.h"
- #include "defs.h"
- #include "write.h"
- /*-extend_line() finds coordinates along the boundary of a window
- * that also lie on a specified line (ax+by=c). The
- * line can cross at least two boundaries---the line
- * that intersects the midpoint of s1 and s2 determines
- * which coordinates are placed in (c_x, c_y).
- *
- * The limits of the window are described by:
- * e: east
- * w: west
- * s: south
- * n: north
- * Note that the following constraints must be true:
- * ( w < e ) ( s < n )
- *
- * x and y are points on the line ax + by = c that are assumed
- * to lie within the window.
- *
- * the c_x and c_y values are changed.
- *
- * returns: 0 on error, 1 otherwise
- */
- int extend_line(double s, double n, double w, double e,
- double a, double b, double c, double x, double y,
- double *c_x, double *c_y, int knownPointAtLeft)
- {
- double nx, ny; /* intesection coordinates */
- if (x > w && x < e && y > s && y < n) {
- /* vertical line? */
- if (a == 0) {
- *c_y = c / b;
- *c_x = knownPointAtLeft ? s : n;
- }
- /* horizontal line? */
- if (b == 0) {
- *c_x = c / a;
- *c_y = knownPointAtLeft ? e : w;
- }
- /* south */
- nx = (c - b * s) / a;
- if (Vect_point_in_box(nx, s, 0.0, &Box) &&
- ((nx > x && knownPointAtLeft) || (nx <= x && !knownPointAtLeft)))
- {
- *c_x = nx;
- *c_y = s;
- return 1;
- }
- /* north */
- nx = (c - b * n) / a;
- if (Vect_point_in_box(nx, n, 0.0, &Box) &&
- ((nx > x && knownPointAtLeft) || (nx <= x && !knownPointAtLeft)))
- {
- *c_x = nx;
- *c_y = n;
- return 1;
- }
- if (knownPointAtLeft) {
- /* east */
- ny = (c - a * e) / b;
- if (Vect_point_in_box(e, ny, 0.0, &Box)) {
- *c_x = e;
- *c_y = ny;
- return 1;
- }
- }
- else {
- /* west */
- ny = (c - a * w) / b;
- if (Vect_point_in_box(w, ny, 0.0, &Box)) {
- *c_x = w;
- *c_y = ny;
- return 1;
- }
- }
- }
- return 0;
- }
|