123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /**
- \file vector/vedit/distance.c
- \brief Vedit library - distance calculation
- (C) 2007-2008 by the GRASS Development Team
- This program is free software under the GNU General Public License
- (>=v2). Read the file COPYING that comes with GRASS for details.
- \author Martin Landa <landa.martin gmail.com>
- \date 2007-2008
- */
- #include <grass/vedit.h>
- /**
- \brief Calculate distances between two lines
-
- \todo LL projection
- \param Points1 first line geometry
- \param Points2 second line geometry
- \param[out] index of minimal distance
- \return minimal distance betwen two lines (their nodes)
- */
- double Vedit_get_min_distance(struct line_pnts *Points1,
- struct line_pnts *Points2, int with_z,
- int *mindistidx)
- {
- unsigned int i;
- double distances[4];
- /*
- distances[0] = first-first
- distances[1] = first-last
- distances[2] = last-first
- distances[3] = last-last
- */
- distances[0] =
- Vect_points_distance(Points1->x[0], Points1->y[0], Points1->z[0],
- Points2->x[0], Points2->y[0], Points2->z[0],
- with_z);
- distances[1] =
- Vect_points_distance(Points1->x[0], Points1->y[0], Points1->z[0],
- Points2->x[Points2->n_points - 1],
- Points2->y[Points2->n_points - 1],
- Points2->z[Points2->n_points - 1], with_z);
- distances[2] = Vect_points_distance(Points1->x[Points1->n_points - 1],
- Points1->y[Points1->n_points - 1],
- Points1->z[Points1->n_points - 1],
- Points2->x[0], Points2->y[0],
- Points2->z[0], with_z);
- distances[3] = Vect_points_distance(Points1->x[Points1->n_points - 1],
- Points1->y[Points1->n_points - 1],
- Points1->z[Points1->n_points - 1],
- Points2->x[Points2->n_points - 1],
- Points2->y[Points2->n_points - 1],
- Points2->z[Points2->n_points - 1],
- with_z);
- /* find the minimal distance between first or last point of both lines */
- *mindistidx = 0;
- for (i = 0; i < sizeof(distances) / sizeof(double); i++) {
- if (distances[i] >= 0.0 && distances[i] < distances[*mindistidx])
- *mindistidx = i;
- }
- G_debug(3, "Vedit_get_min_distance(): dists=%f,%f,%f,%f",
- distances[0], distances[1], distances[2], distances[3]);
- return distances[*mindistidx];
- }
|