[GRASS-SVN] r38864 - in grass/trunk: include lib/vector/Vlib
svn_grass at osgeo.org
svn_grass at osgeo.org
Tue Aug 25 12:12:27 EDT 2009
Author: martinl
Date: 2009-08-25 12:12:27 -0400 (Tue, 25 Aug 2009)
New Revision: 38864
Modified:
grass/trunk/include/vector.h
grass/trunk/lib/vector/Vlib/cats.c
grass/trunk/lib/vector/Vlib/line.c
grass/trunk/lib/vector/Vlib/list.c
Log:
vlib: new fns - Vect_line_get_point() & Vect_get_num_line_points()
Vect_destroy*() return void
Modified: grass/trunk/include/vector.h
===================================================================
--- grass/trunk/include/vector.h 2009-08-25 16:10:26 UTC (rev 38863)
+++ grass/trunk/include/vector.h 2009-08-25 16:12:27 UTC (rev 38864)
@@ -18,6 +18,9 @@
int Vect_append_points(struct line_pnts *, const struct line_pnts *, int);
int Vect_line_insert_point(struct line_pnts *, int, double, double, double);
int Vect_line_delete_point(struct line_pnts *, int);
+int Vect_line_get_point(const struct line_pnts *, int ,
+ double *, double *, double *);
+int Vect_get_num_line_points(const struct line_pnts *);
int Vect_line_prune(struct line_pnts *);
int Vect_line_prune_thresh(struct line_pnts *, double);
void Vect_line_reverse(struct line_pnts *);
@@ -25,8 +28,8 @@
int);
int Vect_copy_pnts_to_xyz(const struct line_pnts *, double *, double *, double *,
int *);
-int Vect_reset_line(struct line_pnts *);
-int Vect_destroy_line_struct(struct line_pnts *);
+void Vect_reset_line(struct line_pnts *);
+void Vect_destroy_line_struct(struct line_pnts *);
int Vect_point_on_line(const struct line_pnts *, double, double *, double *,
double *, double *, double *);
int Vect_line_segment(const struct line_pnts *, double, double, struct line_pnts *);
@@ -36,7 +39,7 @@
int Vect_line_distance(const struct line_pnts *, double, double, double, int,
double *, double *, double *, double *, double *,
double *);
-int Vect_line_box(const struct line_pnts *, struct bound_box *);
+void Vect_line_box(const struct line_pnts *, struct bound_box *);
void Vect_line_parallel(struct line_pnts *, double, double, int,
struct line_pnts *);
void Vect_line_parallel2(struct line_pnts *, double, double,
@@ -65,7 +68,7 @@
int Vect_field_cat_get(const struct line_cats *, int, struct ilist *);
int Vect_cat_in_array(int, const int *, int);
int Vect_reset_cats(struct line_cats *);
-int Vect_destroy_cats_struct(struct line_cats *);
+void Vect_destroy_cats_struct(struct line_cats *);
int Vect_get_area_cats(const struct Map_info *, int, struct line_cats *);
int Vect_get_area_cat(const struct Map_info *, int, int);
int Vect_get_line_cat(const struct Map_info *, int, int);
@@ -75,7 +78,7 @@
int Vect_str_to_cat_list(const char *, struct cat_list *);
int Vect_array_to_cat_list(const int *, int, struct cat_list *);
int Vect_cat_in_cat_list(int, const struct cat_list *);
-int Vect_destroy_cat_list(struct cat_list *);
+void Vect_destroy_cat_list(struct cat_list *);
/* Vector array */
struct varray *Vect_new_varray(int);
@@ -117,7 +120,7 @@
int Vect_list_delete_list(struct ilist *, const struct ilist *);
int Vect_val_in_list(const struct ilist *, int);
int Vect_reset_list(struct ilist *);
-int Vect_destroy_list(struct ilist *);
+void Vect_destroy_list(struct ilist *);
/* Bounding box (MBR) */
int Vect_point_in_box(double, double, double, const struct bound_box *);
Modified: grass/trunk/lib/vector/Vlib/cats.c
===================================================================
--- grass/trunk/lib/vector/Vlib/cats.c 2009-08-25 16:10:26 UTC (rev 38863)
+++ grass/trunk/lib/vector/Vlib/cats.c 2009-08-25 16:12:27 UTC (rev 38864)
@@ -75,10 +75,8 @@
including the struct itself.
\param p line_cats structure
-
- \return 0
*/
-int Vect_destroy_cats_struct(struct line_cats *p)
+void Vect_destroy_cats_struct(struct line_cats *p)
{
if (p) { /* probably a moot test */
if (p->n_cats) {
@@ -87,8 +85,6 @@
}
G_free((void *)p);
}
-
- return 0;
}
/*!
@@ -325,11 +321,9 @@
/*!
\brief Frees allocated cat_list memory.
- \param[in] p line_cats structure
-
- \return 0
+ \param p pointer to line_cats structure
*/
-int Vect_destroy_cat_list(struct cat_list *p)
+void Vect_destroy_cat_list(struct cat_list *p)
{
if (p) { /* probably a moot test */
if (p->n_ranges) {
@@ -338,8 +332,6 @@
}
G_free((void *)p);
}
-
- return 0;
}
Modified: grass/trunk/lib/vector/Vlib/line.c
===================================================================
--- grass/trunk/lib/vector/Vlib/line.c 2009-08-25 16:10:26 UTC (rev 38863)
+++ grass/trunk/lib/vector/Vlib/line.c 2009-08-25 16:12:27 UTC (rev 38864)
@@ -1,7 +1,7 @@
/*!
- \file line.c
+ \file vector/Vlib/line.c
- \brief Vector library - geometry manipulation
+ \brief Vector library - vector feature geometry
(C) 2001-2009 by the GRASS Development Team
@@ -10,6 +10,7 @@
\author Original author CERL, probably Dave Gerdes or Mike Higgins.
\author Update to GRASS 5.7 Radim Blazek and David D. Gray.
+ \author Some updates for GRASS 7 by Martin Landa <landa.martin gmail.com>
*/
#include <grass/config.h>
@@ -20,34 +21,26 @@
#include <grass/glocale.h>
/*!
- \brief Creates and initializes a struct line_pnts.
+ \brief Creates and initializes a struct line_pnts (internal use only)
- Use Vect_new_line_struct() instead.
+ Use Vect_new_line_struct() instead.
- This structure is used for reading and writing vector lines and
- polygons. The library routines handle all memory allocation. If
- 3 lines in memory are needed at the same time, then simply 3
- line_pnts structures have to be used
-
- \param void
-
- \return pointer to line_pnts
- \return NULL on error
+ \return pointer to allocated line_pnts structure
+ \return NULL on error
*/
struct line_pnts *Vect__new_line_struct(void);
/*!
- \brief Creates and initializes a struct line_pnts.
+ \brief Creates and initializes a line_pnts structure
- This structure is used for reading and writing vector lines and
- polygons. The library routines handle all memory allocation. If
- 3 lines in memory are needed at the same time, then simply 3
- line_pnts structures have to be used
+ This structure is used for reading and writing vector lines and
+ polygons. The library routines handle all memory allocation. If 3
+ lines in memory are needed at the same time, then simply 3 line_pnts
+ structures have to be used.
- \param void
+ Calls G_fatal_error() on error.
- \return pointer to line_pnts
- \return NULL on error
+ \return pointer to line_pnts
*/
struct line_pnts *Vect_new_line_struct()
{
@@ -76,13 +69,12 @@
}
/*!
- \brief Frees all memory associated with a struct line_pnts, including the struct itself
+ \brief Frees all memory associated with a line_pnts structure,
+ including the structure itself
\param p pointer to line_pnts structure
-
- \return 0
*/
-int Vect_destroy_line_struct(struct line_pnts *p)
+void Vect_destroy_line_struct(struct line_pnts *p)
{
if (p) { /* probably a moot test */
if (p->alloc_points) {
@@ -92,28 +84,25 @@
}
G_free((char *)p);
}
-
- return 0;
}
/*!
- \brief Copy points from array to line structure
+ \brief Copy points from array to line_pnts structure
- \param Points line structure
- \param x,y,z coordinates
+ \param Points pointer to line_ptns structure
+ \param x,y,z array of coordinates
\param number of points to be copied
\return 0 on success
\return -1 on out of memory
*/
-int
-Vect_copy_xyz_to_pnts(struct line_pnts *Points, const double *x, const double *y,
- const double *z, int n)
+int Vect_copy_xyz_to_pnts(struct line_pnts *Points, const double *x, const double *y,
+ const double *z, int n)
{
- register int i;
+ int i;
if (0 > dig_alloc_points(Points, n))
- return (-1);
+ return -1;
for (i = 0; i < n; i++) {
Points->x[i] = x[i];
@@ -124,41 +113,36 @@
Points->z[i] = 0;
Points->n_points = n;
}
-
- return (0);
+
+ return 0;
}
/*!
- \brief Reset line
+ \brief Reset line
- Make sure line structure is clean to be re-used, i.e. it
- has no points associated with it Points must have previously been
- created with Vect_new_line_struct().
+ Make sure line structure is clean to be re-used, i.e. it has no
+ points associated with it Points must have previously been created
+ with Vect_new_line_struct().
- \param Points line to be reset
-
- \return 0
+ \param Points pointer to line_pnts structure to be reset
*/
-int Vect_reset_line(struct line_pnts *Points)
+void Vect_reset_line(struct line_pnts *Points)
{
Points->n_points = 0;
-
- return 0;
}
/*!
- \brief Appends one point to the end of a line.
+ \brief Appends one point to the end of a line.
- Returns new number of points or -1 on out of memory Note, this will
- append to whatever is in line struct. If you are re-using a line
- struct, be sure to clear out old data first by calling
- Vect_reset_line().
+ If you are re-using a line struct, be sure to clear out old data
+ first by calling Vect_reset_line().
+
+ \param Points pointer to line_pnts structure
+ \param x,y,z point coordinates to be added
- \param Points line
- \param x,y,z point coordinates to be added
-
- \return number of points
+ \return number of points
+ \return -1 on error (out of memory)
*/
int Vect_append_point(struct line_pnts *Points, double x, double y, double z)
{
@@ -176,27 +160,27 @@
}
/*!
- \brief Insert new point at index position and move all old points at that position and above up
+ \brief Insert new point at index position and move all old points
+ at that position and above up
+
+ \param Points pointer to line_pnts structure
+ \param index (from 0 to Points->n_points-1)
+ \param x,y,z point coordinates
- \param Points line
- \param index (from 0 to Points->n_points-1)
- \param x,y,z point coordinates
-
- \return number of points
- \return -1 on error (alocation)
+ \return number of points
+ \return -1 on error (alocation)
*/
-int
-Vect_line_insert_point(struct line_pnts *Points, int index, double x,
- double y, double z)
+int Vect_line_insert_point(struct line_pnts *Points, int index, double x,
+ double y, double z)
{
- register int n;
+ int n;
if (index < 0 || index > Points->n_points - 1)
- G_fatal_error("%s Vect_line_insert_point()",
+ G_fatal_error("Vect_line_insert_point(): %s",
_("Index out of range in"));
if (0 > dig_alloc_points(Points, Points->n_points + 1))
- return (-1);
+ return -1;
/* move up */
for (n = Points->n_points; n > index; n--) {
@@ -208,25 +192,26 @@
Points->x[index] = x;
Points->y[index] = y;
Points->z[index] = z;
+
return ++(Points->n_points);
}
/*!
- \brief Delete point at given index and move all points above down
+ \brief Delete point at given index and move all points above down
- \param Points line
- \param index (from 0 to Points->n_points-1)
+ \param Points pointer to line_pnts structure
+ \param index point (from 0 to Points->n_points-1)
- \return number of points
+ \return number of points
*/
int Vect_line_delete_point(struct line_pnts *Points, int index)
{
- register int n;
-
+ int n;
+
if (index < 0 || index > Points->n_points - 1)
- G_fatal_error("%s Vect_line_insert_point()",
+ G_fatal_error("Vect_line_insert_point(): %s",
_("Index out of range in"));
-
+
if (Points->n_points == 0)
return 0;
@@ -236,14 +221,56 @@
Points->y[n] = Points->y[n + 1];
Points->z[n] = Points->z[n + 1];
}
-
+
return --(Points->n_points);
}
/*!
+ \brief Get line point of given index
+
+ Calls G_fatal_error() when index is not range in.
+
+ \param Points pointer to line_pnts structure
+ \param index point index (from 0 to Points->n_points-1)
+ \param x pointer to x coordinate or NULL
+ \param y pointer to y coordinate or NULL
+ \param z pointer to z coordinate or NULL
+
+ \return number of points
+*/
+int Vect_line_get_point(const struct line_pnts *Points, int index,
+ double *x, double *y, double *z)
+{
+ if (index < 0 || index > Points->n_points - 1)
+ G_fatal_error("Vect_line_get_point(): %s",
+ _("Index out of range in"));
+
+ if (x)
+ *x = Points->x[index];
+ if (y)
+ *y = Points->y[index];
+ if (z)
+ *z = Points->z[index];
+
+ return Points->n_points;
+}
+
+/*!
+ \brief Get number of line points
+
+ \param Points pointer to line_pnts structure
+
+ \return number of points
+*/
+int Vect_get_num_line_points(const struct line_pnts *Points)
+{
+ return Points->n_points;
+}
+
+/*!
\brief Remove duplicate points, i.e. zero length segments
- \param Points line
+ \param Points pointer to line_pnts structure
\return number of points
*/
@@ -272,7 +299,7 @@
/*!
\brief Remove points in threshold
- \param Points line
+ \param Points pointer to line_pnts structure
\param threshold threshold value
\return number of points in result
@@ -290,22 +317,21 @@
}
/*!
- \brief Appends points to the end of a line.
+ \brief Appends points to the end of a line.
+
+ Note, this will append to whatever is in line_pnts structure. If you
+ are re-using a line struct, be sure to clear out old data first by
+ calling Vect_reset_line().
- Note, this will append to whatever is in line struct. If you are
- re-using a line struct, be sure to clear out old data first by
- calling Vect_reset_line().
-
- \param Points line
- \param APoints points to be included
- \param direction direction (GV_FORWARD, GV_BACKWARD)
-
- \return new number of points
- \return -1 on out of memory
- */
-int
-Vect_append_points(struct line_pnts *Points, const struct line_pnts *APoints,
- int direction)
+ \param Points pointer to line_pnts structure
+ \param APoints points to be included
+ \param direction direction (GV_FORWARD, GV_BACKWARD)
+
+ \return new number of points
+ \return -1 on out of memory
+*/
+int Vect_append_points(struct line_pnts *Points, const struct line_pnts *APoints,
+ int direction)
{
int i, n, on, an;
@@ -338,23 +364,22 @@
/*!
- \brief Copy points from line structure to array
+ \brief Copy points from line structure to array
- x/y/z arrays MUST be at least as large as Points->n_points
+ x/y/z arrays MUST be at least as large as Points->n_points
- Also note that n is a pointer to int.
+ Also note that n is a pointer to int.
- \param Points line
- \param x,y,z coordinates arrays
- \param n number of points
-
- \return number of points copied
- */
-int
-Vect_copy_pnts_to_xyz(const struct line_pnts *Points, double *x, double *y,
- double *z, int *n)
+ \param Points pointer to line_pnts structure
+ \param x,y,z coordinates arrays
+ \param n number of points
+
+ \return number of points copied
+*/
+int Vect_copy_pnts_to_xyz(const struct line_pnts *Points, double *x, double *y,
+ double *z, int *n)
{
- register int i;
+ int i;
for (i = 0; i < *n; i++) {
x[i] = Points->x[i];
@@ -368,26 +393,24 @@
}
/*!
- \brief Find point on line in the specified distance.
+ \brief Find point on line in the specified distance.
- From the begining, measured along line.
+ From the begining, measured along line.
- If the distance is greater than line length or negative, error is returned.
+ If the distance is greater than line length or negative, error is returned.
- \param Points line
- \param distance distance value
- \param x,y,z pointers to point coordinates or NULL
- \param angle pointer to angle of line in that point (radians, counter clockwise from x axis) or NULL
- \param slope pointer to slope angle in radians (positive up)
-
- \return number of segment the point is on (first is 1),
- \return 0 error when point is outside the line
-
+ \param Points pointer to line_pnts structure
+ \param distance distance value
+ \param x,y,z pointers to point coordinates or NULL
+ \param angle pointer to angle of line in that point (radians, counter clockwise from x axis) or NULL
+ \param slope pointer to slope angle in radians (positive up)
+
+ \return number of segment the point is on (first is 1),
+ \return 0 error when point is outside the line
*/
-int
-Vect_point_on_line(const struct line_pnts *Points, double distance,
- double *x, double *y, double *z, double *angle,
- double *slope)
+int Vect_point_on_line(const struct line_pnts *Points, double distance,
+ double *x, double *y, double *z, double *angle,
+ double *slope)
{
int j, np, seg = 0;
double dist = 0, length;
@@ -472,25 +495,24 @@
}
/*!
- \brief Create line segment.
-
- Creates segment of InPoints from start to end measured along the
- line and write it to OutPoints.
-
- If the distance is greater than line length or negative, error is
- returned.
-
- \param InPoints input line
- \param start segment number
- \param end segment number
- \param OutPoints output line
-
- \return 1 success
- \return 0 error when start > length or end < 0 or start < 0 or end > length
- */
-int
-Vect_line_segment(const struct line_pnts *InPoints, double start, double end,
- struct line_pnts *OutPoints)
+ \brief Create line segment.
+
+ Creates segment of InPoints from start to end measured along the
+ line and write it to OutPoints.
+
+ If the distance is greater than line length or negative, error is
+ returned.
+
+ \param InPoints input line
+ \param start segment number
+ \param end segment number
+ \param OutPoints output line
+
+ \return 1 success
+ \return 0 error when start > length or end < 0 or start < 0 or end > length
+*/
+int Vect_line_segment(const struct line_pnts *InPoints, double start, double end,
+ struct line_pnts *OutPoints)
{
int i, seg1, seg2;
double length, tmp;
@@ -538,13 +560,13 @@
}
/*!
- \brief Calculate line length, 3D-length in case of 3D vector line
+ \brief Calculate line length, 3D-length in case of 3D vector line
- For Lat-Long use Vect_line_geodesic_length() instead.
-
- \param Points line geometry
-
- \return line length
+ For Lat-Long use Vect_line_geodesic_length() instead.
+
+ \param Points pointer to line_pnts structure geometry
+
+ \return line length
*/
double Vect_line_length(const struct line_pnts *Points)
{
@@ -566,14 +588,14 @@
/*!
- \brief Calculate line length.
-
- If projection is LL, the length is measured along the geodesic.
-
- \param Points line geometry
-
- \return line length
- */
+ \brief Calculate line length.
+
+ If projection is LL, the length is measured along the geodesic.
+
+ \param Points pointer to line_pnts structure geometry
+
+ \return line length
+*/
double Vect_line_geodesic_length(const struct line_pnts *Points)
{
int j, dc;
@@ -603,37 +625,36 @@
}
/*!
- \brief Calculate line distance.
-
- Sets (if not null):
+ \brief Calculate line distance.
+
+ Sets (if not null):
- px, py - point on line,
- dist - distance to line,
- spdist - distance to point on line from segment beginning,
- sldist - distance to point on line form line beginning along line
- \param points line
- \param ux,uy,uz point coordinates
- \param with_z flag if to use z coordinate (3D calculation)
- \param[out] px,py,pz point on line
- \param[out] dist distance to line,
- \param[out] spdist distance of point from segment beginning
- \param[out] lpdist distance of point from line
+ \param points pointer to line_pnts structure
+ \param ux,uy,uz point coordinates
+ \param with_z flag if to use z coordinate (3D calculation)
+ \param[out] px,py,pz point on line
+ \param[out] dist distance to line,
+ \param[out] spdist distance of point from segment beginning
+ \param[out] lpdist distance of point from line
- \return nearest segment (first is 1)
+ \return nearest segment (first is 1)
*/
-int
-Vect_line_distance(const struct line_pnts *points,
- double ux, double uy, double uz,
- int with_z,
- double *px, double *py, double *pz,
- double *dist, double *spdist, double *lpdist)
+int Vect_line_distance(const struct line_pnts *points,
+ double ux, double uy, double uz,
+ int with_z,
+ double *px, double *py, double *pz,
+ double *dist, double *spdist, double *lpdist)
{
- register int i;
- register double distance;
- register double new_dist;
+ int i;
+ double distance;
+ double new_dist;
double tpx, tpy, tpz, tdist, tspdist, tlpdist = 0;
double dx, dy, dz;
- register int n_points;
+ int n_points;
int segment;
n_points = points->n_points;
@@ -726,16 +747,16 @@
/*!
- \brief Calculate distance of 2 points
-
- Simply uses Pythagoras.
-
- \param x1,y1,z1 first point
- \param x2,y2,z2 second point
- \param with_z use z coordinate
-
- \return distance
- */
+ \brief Calculate distance of 2 points
+
+ Simply uses Pythagoras.
+
+ \param x1,y1,z1 first point
+ \param x2,y2,z2 second point
+ \param with_z use z coordinate
+
+ \return distance
+*/
double Vect_points_distance(double x1, double y1, double z1, /* point 1 */
double x2, double y2, double z2, /* point 2 */
int with_z)
@@ -755,26 +776,21 @@
}
/*!
- \brief Get bounding box of line
-
- \param Points line
- \param[out] Box bounding box
-
- \return 0
- */
-int Vect_line_box(const struct line_pnts *Points, struct bound_box * Box)
+ \brief Get bounding box of line
+
+ \param Points pointer to line_pnts structure
+ \param[out] Box bounding box
+*/
+void Vect_line_box(const struct line_pnts *Points, struct bound_box *Box)
{
dig_line_box(Points, Box);
- return 0;
}
/*!
- \brief Reverse the order of vertices
-
- \param Points line to be changed
-
- \return void
- */
+ \brief Reverse the order of vertices
+
+ \param Points pointer to line_pnts structure to be changed
+*/
void Vect_line_reverse(struct line_pnts *Points)
{
int i, j, np;
@@ -797,14 +813,14 @@
}
/*!
- \brief Fetches FIRST category number for given vector line and field
+ \brief Fetches FIRST category number for given vector line and field
+
+ \param Map pointer to Map_info structure
+ \param line line id
+ \param field layer number
- \param Map vector map
- \param line line id
- \param field layer number
-
- \return -1 no category
- \return category number (>=0)
+ \return -1 no category
+ \return category number (>=0)
*/
int Vect_get_line_cat(const struct Map_info *Map, int line, int field)
{
Modified: grass/trunk/lib/vector/Vlib/list.c
===================================================================
--- grass/trunk/lib/vector/Vlib/list.c 2009-08-25 16:10:26 UTC (rev 38863)
+++ grass/trunk/lib/vector/Vlib/list.c 2009-08-25 16:12:27 UTC (rev 38864)
@@ -67,10 +67,8 @@
* the struct itself
*
* \param[in,out] list pointer to ilist structure
- *
- * \return 0
*/
-int Vect_destroy_list(struct ilist *list)
+void Vect_destroy_list(struct ilist *list)
{
if (list) { /* probably a moot test */
if (list->alloc_values) {
@@ -79,8 +77,6 @@
G_free((void *)list);
}
list = NULL;
-
- return 0;
}
/**
More information about the grass-commit
mailing list