line_dist.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include <grass/gis.h>
  2. /* compute square of distance of point (x,y) to line segment (x1,y1 - x2,y2) */
  3. #define ZERO(x) x < tolerance && x > -tolerance
  4. #define TOLERANCE 1.0e-10
  5. static double tolerance = TOLERANCE;
  6. void G_set_distance_to_line_tolerance(double t)
  7. {
  8. if (t <= 0.0)
  9. t = TOLERANCE;
  10. tolerance = t;
  11. }
  12. double G_distance2_point_to_line(double x, double y, /* point */
  13. double x1, double y1, double x2, double y2)
  14. { /* line segment */
  15. double dx, dy, t;
  16. dx = x2 - x1;
  17. dy = y2 - y1;
  18. if (ZERO(dx) && ZERO(dy)) { /* line is degenerate */
  19. dx = x1 - x;
  20. dy = y1 - y;
  21. return dx * dx + dy * dy; /* compute distance x,y to x1,y1 */
  22. }
  23. t = (dx * (x - x1) + dy * (y - y1)) / (dx * dx + dy * dy);
  24. if (t < 0.0) { /* go to x1,y1 */
  25. dx = x - x1;
  26. dy = y - y1;
  27. }
  28. else if (t > 1.0) { /* go to x2,y2 */
  29. dx = x - x2;
  30. dy = y - y2;
  31. }
  32. else { /* go t from x1,y1 towards x2,y2 */
  33. dx = x - (dx * t + x1);
  34. dy = y - (dy * t + y1);
  35. }
  36. return dx * dx + dy * dy;
  37. }