[GRASS-SVN] r40247 - grass/branches/develbranch_6/vector/v.delaunay2
svn_grass at osgeo.org
svn_grass at osgeo.org
Tue Jan 5 08:20:17 EST 2010
Author: mmetz
Date: 2010-01-05 08:20:17 -0500 (Tue, 05 Jan 2010)
New Revision: 40247
Modified:
grass/branches/develbranch_6/vector/v.delaunay2/Makefile
grass/branches/develbranch_6/vector/v.delaunay2/data_types.h
grass/branches/develbranch_6/vector/v.delaunay2/defs.h
grass/branches/develbranch_6/vector/v.delaunay2/edge.c
grass/branches/develbranch_6/vector/v.delaunay2/edge.h
grass/branches/develbranch_6/vector/v.delaunay2/geom_primitives.h
grass/branches/develbranch_6/vector/v.delaunay2/geometry.c
grass/branches/develbranch_6/vector/v.delaunay2/geometry.h
grass/branches/develbranch_6/vector/v.delaunay2/in_out.c
grass/branches/develbranch_6/vector/v.delaunay2/in_out.h
grass/branches/develbranch_6/vector/v.delaunay2/main.c
grass/branches/develbranch_6/vector/v.delaunay2/memory.c
Log:
fix for ticket #660, devbr6
Modified: grass/branches/develbranch_6/vector/v.delaunay2/Makefile
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/Makefile 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/Makefile 2010-01-05 13:20:17 UTC (rev 40247)
@@ -2,8 +2,8 @@
PGM=v.delaunay
-LIBES = $(VECTLIB) $(VECTLIB_REAL) $(DBMILIB) $(GISLIB)
-DEPENDENCIES = $(VECTDEP) $(DBMIDEP) $(GISDEP)
+LIBES = $(VECTLIB) $(GISLIB)
+DEPENDENCIES = $(VECTDEP) $(GISDEP)
EXTRA_INC = $(VECT_INC)
EXTRA_CFLAGS = $(VECT_CFLAGS)
Modified: grass/branches/develbranch_6/vector/v.delaunay2/data_types.h
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/data_types.h 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/data_types.h 2010-01-05 13:20:17 UTC (rev 40247)
@@ -1,19 +1,6 @@
#ifndef DATA_TYPES_H
#define DATA_TYPES_H
-#include <stdlib.h>
-
-#ifndef MY_NULL
-#define MY_NULL 0
-#endif
-#define TRUE 1
-#define FALSE 0
-
-typedef enum
-{ left, right } side;
-
-typedef unsigned char boolean;
-
struct vertex
{
double x, y, z;
@@ -30,5 +17,4 @@
struct edge *dprev;
};
-extern struct vertex *sites;
#endif
Modified: grass/branches/develbranch_6/vector/v.delaunay2/defs.h
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/defs.h 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/defs.h 2010-01-05 13:20:17 UTC (rev 40247)
@@ -1,11 +1,6 @@
-#include <grass/gis.h>
-#include <grass/Vect.h>
-#include <grass/glocale.h>
#ifdef MAIN
-struct Cell_head Window;
-BOUND_BOX Box;
+struct vertex *sites;
#else
-extern struct Cell_head Window;
-extern BOUND_BOX Box;
+extern struct vertex *sites;
#endif
Modified: grass/branches/develbranch_6/vector/v.delaunay2/edge.c
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/edge.c 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/edge.c 2010-01-05 13:20:17 UTC (rev 40247)
@@ -1,12 +1,13 @@
-#include "data_types.h"
-#include "memory.h"
-#include "edge.h"
+#include <stdlib.h>
+#include "data_types.h"
+#include "memory.h"
+#include "edge.h"
/*
* Construct an edge from vertices v1, v2 and add it to rings of edges e1, e2
*/
struct edge *join(struct edge *e1, struct vertex *v1,
- struct edge *e2, struct vertex *v2, side s)
+ struct edge *e2, struct vertex *v2, int side)
{
struct edge *new_edge;
@@ -16,7 +17,7 @@
new_edge = create_edge(v1, v2);
- if (s == left) {
+ if (side == LEFT) {
if (ORG(e1) == v1)
splice(OPREV(e1), new_edge, v1);
else
@@ -118,9 +119,9 @@
new_edge;
ORG(new_edge) = v1;
DEST(new_edge) = v2;
- if (v1->entry_pt == MY_NULL)
+ if (v1->entry_pt == NULL)
v1->entry_pt = new_edge;
- if (v2->entry_pt == MY_NULL)
+ if (v2->entry_pt == NULL)
v2->entry_pt = new_edge;
return new_edge;
}
Modified: grass/branches/develbranch_6/vector/v.delaunay2/edge.h
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/edge.h 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/edge.h 2010-01-05 13:20:17 UTC (rev 40247)
@@ -8,14 +8,17 @@
#define DNEXT(e) ((e)->dnext)
#define DPREV(e) ((e)->dprev)
-#define OTHER_VERTEX(e,p) (ORG(e) == p ? DEST(e) : ORG(e))
-#define NEXT(e,p) (ORG(e) == p ? ONEXT(e) : DNEXT(e))
-#define PREV(e,p) (ORG(e) == p ? OPREV(e) : DPREV(e))
+#define OTHER_VERTEX(e,p) (ORG(e) == (p) ? DEST(e) : ORG(e))
+#define NEXT(e,p) (ORG(e) == (p) ? ONEXT(e) : DNEXT(e))
+#define PREV(e,p) (ORG(e) == (p) ? OPREV(e) : DPREV(e))
-#define SAME_EDGE(e1,e2) (e1 == e2)
+#define SAME_EDGE(e1,e2) ((e1) == (e2))
+#define LEFT 0
+#define RIGHT 1
+
struct edge *join(struct edge *e1, struct vertex *v1,
- struct edge *e2, struct vertex *v2, side s);
+ struct edge *e2, struct vertex *v2, int side);
void delete_edge(struct edge *e);
void splice(struct edge *a, struct edge *b, struct vertex *v);
struct edge *create_edge(struct vertex *v1, struct vertex *v2);
Modified: grass/branches/develbranch_6/vector/v.delaunay2/geom_primitives.h
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/geom_primitives.h 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/geom_primitives.h 2010-01-05 13:20:17 UTC (rev 40247)
@@ -1,18 +1,25 @@
#ifndef GEOM_PRIMITIVES_H
#define GEOM_PRIMITIVES_H
-#define CREATE_VECTOR(p1, p2, dx, dy) (dx = p2->x - p1->x, dy = p2->y - p1->y)
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
-#define DOT_PRODUCT_2V(a1, a2, b1, b2) (a1 * b1 + a2 * b2)
+#define CREATE_VECTOR(p1, p2, dx, dy) ((dx) = (p2)->x - (p1)->x, (dy) = (p2)->y - (p1)->y)
-#define CROSS_PRODUCT_2V(a1, a2, b1, b2) (a1 * b2 - a2 * b1)
+#define DOT_PRODUCT_2V(a1, a2, b1, b2) ((a1) * (b1) + (a2) * (b2))
+
+#define CROSS_PRODUCT_2V(a1, a2, b1, b2) ((a1) * (b2) - (a2) * (b1))
/*
cross-product around p2
((p2->x - p1->x) * (p3->y - p2->y) - (p2->y - p1->y) * (p3->x - p2->x))
around p1
*/
-#define CROSS_PRODUCT_3P(p1, p2, p3) ((p2->x - p1->x) * (p3->y - p1->y) - (p2->y - p1->y) * (p3->x - p1->x))
+#define CROSS_PRODUCT_3P(p1, p2, p3) (((p2)->x - (p1)->x) * ((p3)->y - (p1)->y) - ((p2)->y - (p1)->y) * ((p3)->x - (p1)->x))
/* predicate testing if p3 is to the left of the line through p1 and p2 */
#define LEFT_OF(p1, p2, p3) (CROSS_PRODUCT_3P(p1, p2, p3) > 0)
Modified: grass/branches/develbranch_6/vector/v.delaunay2/geometry.c
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/geometry.c 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/geometry.c 2010-01-05 13:20:17 UTC (rev 40247)
@@ -1,4 +1,5 @@
#include <stddef.h>
+#include "defs.h"
#include "data_types.h"
#include "memory.h"
#include "geometry.h"
@@ -16,7 +17,7 @@
struct edge *l_ccw_r, struct vertex *u,
struct edge **l_tangent);
-void divide(struct vertex *sites_sorted[], unsigned int l, unsigned int r,
+void divide(unsigned int l, unsigned int r,
struct edge **l_ccw, struct edge **r_cw)
{
@@ -30,26 +31,25 @@
if (n == 2) {
/* Base case #1 - 2 sites in region. Construct an edge from
two sites in the region */
- *l_ccw = *r_cw = create_edge(sites_sorted[l], sites_sorted[r]);
+ *l_ccw = *r_cw = create_edge(&(sites[l]), &(sites[r]));
}
else if (n == 3) {
/* Base case #2 - 3 sites. Construct a triangle or two edges */
- a = create_edge(sites_sorted[l], sites_sorted[l + 1]);
- b = create_edge(sites_sorted[l + 1], sites_sorted[r]);
- splice(a, b, sites_sorted[l + 1]);
+ a = create_edge(&(sites[l]), &(sites[l + 1]));
+ b = create_edge(&(sites[l + 1]), &(sites[r]));
+ splice(a, b, &(sites[l + 1]));
c_p =
- CROSS_PRODUCT_3P(sites_sorted[l], sites_sorted[l + 1],
- sites_sorted[r]);
+ CROSS_PRODUCT_3P(&(sites[l]), &(sites[l + 1]), &(sites[r]));
if (c_p > 0.0) {
/* Create a triangle */
- c = join(a, sites_sorted[l], b, sites_sorted[r], right);
+ c = join(a, &(sites[l]), b, &(sites[r]), RIGHT);
*l_ccw = a;
*r_cw = b;
}
else if (c_p < 0.0) {
/* Create a triangle */
- c = join(a, sites_sorted[l], b, sites_sorted[r], left);
+ c = join(a, &(sites[l]), b, &(sites[r]), LEFT);
*l_ccw = c;
*r_cw = c;
}
@@ -67,18 +67,18 @@
split = (l + r) / 2;
/* Divide into two halves */
- divide(sites_sorted, l, split, &l_ccw_l, &r_cw_l);
- divide(sites_sorted, split + 1, r, &l_ccw_r, &r_cw_r);
+ divide(l, split, &l_ccw_l, &r_cw_l);
+ divide(split + 1, r, &l_ccw_r, &r_cw_r);
/* Merge the two triangulations */
- merge(r_cw_l, sites_sorted[split], l_ccw_r, sites_sorted[split + 1],
+ merge(r_cw_l, &(sites[split]), l_ccw_r, &(sites[split + 1]),
&l_tangent);
/* The lower tangent added by merge may have invalidated
l_ccw_l or r_cw_r. Update them if necessary. */
- if (ORG(l_tangent) == sites_sorted[l])
+ if (ORG(l_tangent) == &(sites[l]))
l_ccw_l = l_tangent;
- if (DEST(l_tangent) == sites_sorted[r])
+ if (DEST(l_tangent) == &(sites[r]))
r_cw_r = l_tangent;
/* Update leftmost ccw edge and rightmost cw edge */
@@ -99,7 +99,7 @@
{
struct edge *l, *r;
struct vertex *o_l, *o_r, *d_l, *d_r;
- boolean ready;
+ unsigned char ready;
l = r_cw_l;
r = l_ccw_r;
@@ -109,7 +109,7 @@
d_r = OTHER_VERTEX(r, u);
ready = FALSE;
- while (!ready)
+ while (ready == FALSE)
/* left_of */
if (LEFT_OF(o_l, d_l, o_r)) {
l = PREV(l, d_l);
@@ -140,24 +140,24 @@
{
struct edge *base, *l_cand, *r_cand;
struct vertex *org_base, *dest_base;
- long double u_l_c_o_b, v_l_c_o_b, u_l_c_d_b, v_l_c_d_b;
- long double u_r_c_o_b, v_r_c_o_b, u_r_c_d_b, v_r_c_d_b;
+ double u_l_c_o_b, v_l_c_o_b, u_l_c_d_b, v_l_c_d_b;
+ double u_r_c_o_b, v_r_c_o_b, u_r_c_d_b, v_r_c_d_b;
/* cross product */
- long double c_p_l_cand, c_p_r_cand;
+ double c_p_l_cand, c_p_r_cand;
/* dot product */
- long double d_p_l_cand, d_p_r_cand;
- boolean above_l_cand, above_r_cand, above_next, above_prev;
+ double d_p_l_cand, d_p_r_cand;
+ unsigned char above_l_cand, above_r_cand, above_next, above_prev;
struct vertex *dest_l_cand, *dest_r_cand;
- long double cot_l_cand, cot_r_cand;
+ double cot_l_cand, cot_r_cand;
struct edge *l_lower, *r_lower;
struct vertex *org_r_lower, *org_l_lower;
/* Create first cross edge by joining lower common tangent */
find_lowest_cross_edge(r_cw_l, s, l_ccw_r, u, &l_lower, &org_l_lower,
&r_lower, &org_r_lower);
- base = join(l_lower, org_l_lower, r_lower, org_r_lower, right);
+ base = join(l_lower, org_l_lower, r_lower, org_r_lower, RIGHT);
org_base = org_l_lower;
dest_base = org_r_lower;
@@ -275,12 +275,12 @@
if (!above_l_cand ||
(above_l_cand && above_r_cand && cot_r_cand < cot_l_cand)) {
/* Connect to the right */
- base = join(base, org_base, r_cand, dest_r_cand, right);
+ base = join(base, org_base, r_cand, dest_r_cand, RIGHT);
dest_base = dest_r_cand;
}
else {
/* Connect to the left */
- base = join(l_cand, dest_l_cand, base, dest_base, right);
+ base = join(l_cand, dest_l_cand, base, dest_base, RIGHT);
org_base = dest_l_cand;
}
}
Modified: grass/branches/develbranch_6/vector/v.delaunay2/geometry.h
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/geometry.h 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/geometry.h 2010-01-05 13:20:17 UTC (rev 40247)
@@ -1,6 +1,6 @@
#ifndef GEOMETRY_H
#define GEOMETRY_H
-void divide(struct vertex *sites_sorted[], unsigned int l, unsigned int r,
+void divide(unsigned int l, unsigned int r,
struct edge **l_ccw, struct edge **r_cw);
#endif
Modified: grass/branches/develbranch_6/vector/v.delaunay2/in_out.c
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/in_out.c 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/in_out.c 2010-01-05 13:20:17 UTC (rev 40247)
@@ -1,16 +1,35 @@
#include <stdio.h>
#include <stdlib.h>
-#include <math.h>
#include <unistd.h>
#include <grass/gis.h>
#include <grass/Vect.h>
#include <grass/glocale.h>
+#include "defs.h"
#include "data_types.h"
#include "memory.h"
#include "edge.h"
-#include "geom_primitives.h"
-void output_edges(struct vertex *sites_sorted[], unsigned int n, int mode3d,
+/* compare first according to x-coordinate, if equal then y-coordinate */
+int cmp(const void *a, const void *b)
+{
+ struct vertex *p1 = (struct vertex *)a;
+ struct vertex *p2 = (struct vertex *)b;
+
+ if (p1->x < p2->x)
+ return 1;
+ else if (p1->x > p2->x)
+ return -1;
+ else {
+ if (p1->y < p2->y)
+ return 1;
+ else if (p1->y > p2->y)
+ return -1;
+ }
+
+ return 0;
+}
+
+void output_edges(unsigned int n, int mode3d,
int Type, struct Map_info map_out)
{
struct edge *e_start, *e;
@@ -19,36 +38,31 @@
static struct line_pnts *Points = NULL;
static struct line_cats *Cats = NULL;
+ double x1, y1, z1, x2, y2, z2;
if (!Points) {
Points = Vect_new_line_struct();
Cats = Vect_new_cats_struct();
}
- double x1, y1, z1, x2, y2, z2;
for (i = 0; i < n; i++) {
- u = sites_sorted[i];
+ u = &(sites[i]);
e_start = e = u->entry_pt;
do {
v = OTHER_VERTEX(e, u);
- if (u < v) {
- x1 = sites[u - sites].x;
- y1 = sites[u - sites].y;
- x2 = sites[v - sites].x;
- y2 = sites[v - sites].y;
+ if (cmp(u, v) == 1) {
+ x1 = u->x;
+ y1 = u->y;
+ x2 = v->x;
+ y2 = v->y;
+ z1 = u->z;
+ z2 = v->z;
+
Vect_reset_line(Points);
- if (mode3d) {
- z1 = sites[u - sites].z;
- z2 = sites[v - sites].z;
- Vect_append_point(Points, x1, y1, z1);
- Vect_append_point(Points, x2, y2, z2);
- }
- else {
- Vect_append_point(Points, x1, y1, 0.0);
- Vect_append_point(Points, x2, y2, 0.0);
- }
+ Vect_append_point(Points, x1, y1, z1);
+ Vect_append_point(Points, x2, y2, z2);
Vect_write_line(&map_out, Type, Points, Cats);
}
e = NEXT(e, u);
@@ -58,7 +72,7 @@
/* Print the ring of triangles about each vertex. */
-void output_triangles(struct vertex *sites_sorted[], unsigned int n,
+void output_triangles(unsigned int n,
int mode3d, int Type, struct Map_info map_out)
{
struct edge *e_start, *e, *next;
@@ -72,63 +86,45 @@
double x1, y1, z1, x2, y2, z2, x3, y3, z3;
for (i = 0; i < n; i++) {
- u = sites_sorted[i];
+ u = &(sites[i]);
e_start = e = u->entry_pt;
do {
v = OTHER_VERTEX(e, u);
- if (u < v) {
+ if (cmp(u, v) == 1) {
next = NEXT(e, u);
w = OTHER_VERTEX(next, u);
- if (u < w)
+ if (cmp(u, w) == 1)
if (SAME_EDGE(NEXT(next, w), PREV(e, v))) {
/* Triangle. */
- if (v > w) {
+ if (cmp(w, v) == 1) {
temp = v;
v = w;
w = temp;
}
- x1 = sites[u - sites].x;
- y1 = sites[u - sites].y;
- x2 = sites[v - sites].x;
- y2 = sites[v - sites].y;
- x3 = sites[w - sites].x;
- y3 = sites[w - sites].y;
+ x1 = u->x;
+ y1 = u->y;
+ x2 = v->x;
+ y2 = v->y;
+ x3 = w->x;
+ y3 = w->y;
+ z1 = u->z;
+ z2 = v->z;
+ z3 = w->z;
- if (mode3d) {
- z1 = sites[u - sites].z;
- z2 = sites[v - sites].z;
- z3 = sites[w - sites].z;
- Vect_reset_line(Points);
- Vect_append_point(Points, x1, y1, z1);
- Vect_append_point(Points, x2, y2, z2);
- Vect_write_line(&map_out, Type, Points, Cats);
+ Vect_reset_line(Points);
+ Vect_append_point(Points, x1, y1, z1);
+ Vect_append_point(Points, x2, y2, z2);
+ Vect_write_line(&map_out, Type, Points, Cats);
- Vect_reset_line(Points);
- Vect_append_point(Points, x2, y2, z2);
- Vect_append_point(Points, x3, y3, z3);
- Vect_write_line(&map_out, Type, Points, Cats);
+ Vect_reset_line(Points);
+ Vect_append_point(Points, x2, y2, z2);
+ Vect_append_point(Points, x3, y3, z3);
+ Vect_write_line(&map_out, Type, Points, Cats);
- Vect_reset_line(Points);
- Vect_append_point(Points, x3, y3, z3);
- Vect_append_point(Points, x1, y1, z1);
- Vect_write_line(&map_out, Type, Points, Cats);
- }
- else {
- Vect_reset_line(Points);
- Vect_append_point(Points, x1, y1, 0.0);
- Vect_append_point(Points, x2, y2, 0.0);
- Vect_write_line(&map_out, Type, Points, Cats);
-
- Vect_reset_line(Points);
- Vect_append_point(Points, x2, y2, 0.0);
- Vect_append_point(Points, x3, y3, 0.0);
- Vect_write_line(&map_out, Type, Points, Cats);
-
- Vect_reset_line(Points);
- Vect_append_point(Points, x3, y3, 0.0);
- Vect_append_point(Points, x1, y1, 0.0);
- Vect_write_line(&map_out, Type, Points, Cats);
- }
+ Vect_reset_line(Points);
+ Vect_append_point(Points, x3, y3, z3);
+ Vect_append_point(Points, x1, y1, z1);
+ Vect_write_line(&map_out, Type, Points, Cats);
}
}
/* Next edge around u. */
@@ -137,26 +133,22 @@
}
}
-void remove_duplicates(struct vertex *list[], unsigned int *size)
+void remove_duplicates(unsigned int *size)
{
- int n = *size - 1;
- int left = 0;
- int right = 1;
- int shift = 0;
- int empty = 0;
+ unsigned int n = *size;
+ unsigned int prev = 0;
+ unsigned int next;
- if (n > 0)
- for (; right < n; left++, right++)
- if (list[left]->x == list[right]->x &&
- list[left]->y == list[right]->y) {
- if (shift == 0) {
- shift = 1;
- empty = right;
- }
- (*size)--;
- }
- else if (shift == 1)
- list[empty++] = list[right];
+ if (n > 0) {
+ for (next = 1; next < n; next++) {
+ if (sites[prev].x != sites[next].x ||
+ sites[prev].y != sites[next].y) {
+ sites[++prev].x = sites[next].x;
+ sites[prev].y = sites[next].y;
+ }
+ }
+ *size = prev + 1;
+ }
}
/* returns number of sites read */
@@ -188,10 +180,13 @@
G_debug(3, "Points->z[0]: %f", Points->z[0]);
sites[nsites].z = Points->z[0];
}
+ else {
+ sites[nsites].z = 0.0;
+ }
/* Initialise entry edge vertices. */
- sites[nsites].entry_pt = MY_NULL;
+ sites[nsites].entry_pt = NULL;
- nsites += 1;
+ nsites++;
/* number 100 was arbitrarily chosen */
/* if (nsites == allocated && line != nlines){
Modified: grass/branches/develbranch_6/vector/v.delaunay2/in_out.h
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/in_out.h 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/in_out.h 2010-01-05 13:20:17 UTC (rev 40247)
@@ -3,9 +3,11 @@
int read_sites(int mode3d, int complete_map, struct Map_info map_in,
BOUND_BOX Box);
-void output_edges(struct vertex *sites_sorted[], unsigned int n, int mode3d,
+void output_edges(unsigned int n, int mode3d,
int Type, struct Map_info map_out);
-void output_triangles(struct vertex *sites_sorted[], unsigned int n,
+void output_triangles(unsigned int n,
int mode3d, int Type, struct Map_info map_out);
-void remove_duplicates(struct vertex *list[], unsigned int *size);
+void remove_duplicates(unsigned int *size);
+int cmp(const void *a, const void *b);
+
#endif
Modified: grass/branches/develbranch_6/vector/v.delaunay2/main.c
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/main.c 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/main.c 2010-01-05 13:20:17 UTC (rev 40247)
@@ -14,32 +14,30 @@
* for details.
*
**************************************************************/
-
+#define MAIN
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <grass/gis.h>
#include <grass/Vect.h>
#include <grass/glocale.h>
+#include "defs.h"
#include "data_types.h"
#include "memory.h"
#include "geometry.h"
#include "edge.h"
#include "in_out.h"
-int compare(const struct vertex **p1, const struct vertex **p2);
-
int main(int argc, char *argv[])
{
-
/* GRASS related variables */
char *mapset;
- struct Map_info map_in, map_out;
- struct Cell_head Window;
- BOUND_BOX Box;
+ struct Map_info In, Out;
struct GModule *module;
struct Flag *reg_flag, *line_flag;
struct Option *in_opt, *out_opt;
+ struct Cell_head Window;
+ BOUND_BOX Box;
struct line_pnts *Points;
struct line_cats *Cats;
@@ -51,10 +49,8 @@
/* ---------------------- */
- unsigned int i;
unsigned int n;
- struct edge *l_cw, *r_ccw;
- struct vertex **sites_sorted;
+ struct edge *l_cw = NULL, *r_ccw = NULL;
/* GRASS related manipulations */
G_gisinit(argv[0]);
@@ -93,55 +89,49 @@
G_fatal_error(_("Vector map <%s> not found"), in_opt->answer);
Vect_set_open_level(2);
- Vect_open_old(&map_in, in_opt->answer, mapset);
+ Vect_open_old(&In, in_opt->answer, mapset);
/* check if we have a 3D input points map */
- mode3d = Vect_is_3d(&map_in);
+ mode3d = Vect_is_3d(&In);
- if (mode3d) {
- if (0 > Vect_open_new(&map_out, out_opt->answer, 1))
- G_fatal_error(_("Unable to create vector map <%s>"),
- out_opt->answer);
- }
- else if (0 > Vect_open_new(&map_out, out_opt->answer, 0))
+ if (0 > Vect_open_new(&Out, out_opt->answer, mode3d))
G_fatal_error(_("Unable to create vector map <%s>"), out_opt->answer);
- Vect_hist_copy(&map_in, &map_out);
- Vect_hist_command(&map_out);
+ Vect_hist_copy(&In, &Out);
+ Vect_hist_command(&Out);
/* initialize working region */
G_get_window(&Window);
- G_percent(0, 100, 1);
Vect_region_box(&Window, &Box);
- n = read_sites(mode3d, complete_map, map_in, Box);
+ n = read_sites(mode3d, complete_map, In, Box);
- /* Sort. */
- sites_sorted =
- (struct vertex **)G_malloc((unsigned)n * sizeof(struct vertex *));
- if (sites_sorted == MY_NULL)
- G_fatal_error(_("Not enough memory."));
- for (i = 0; i < n; i++)
- sites_sorted[i] = sites + i;
- qsort(sites_sorted, n, sizeof(struct vertex *), (void *)compare);
+ Vect_set_release_support(&In);
+ Vect_close(&In);
- remove_duplicates(sites_sorted, &n);
+ if (n < 3)
+ G_fatal_error(_("no points to triangulate"));
+ /* sort sites */
+ qsort(sites, n, sizeof(struct vertex), cmp);
+
+ remove_duplicates(&n);
+
/* Triangulate. */
- divide(sites_sorted, 0, n - 1, &l_cw, &r_ccw);
+ G_verbose_message("Delaunay triangulation...");
+ divide(0, n - 1, &l_cw, &r_ccw);
- output_edges(sites_sorted, n, mode3d, Type, map_out);
+ G_verbose_message("writing edges...");
+ output_edges(n, mode3d, Type, Out);
- free((char *)sites_sorted);
free_memory();
- Vect_close(&map_in);
-
if (Type == GV_BOUNDARY) {
- Vect_build_partial(&map_out, GV_BUILD_AREAS);
- nareas = Vect_get_num_areas(&map_out);
+ Vect_build_partial(&Out, GV_BUILD_AREAS);
+ nareas = Vect_get_num_areas(&Out);
G_debug(3, "nareas = %d", nareas);
/* Assign centroid to each area */
+ G_verbose_message("assign centroids...");
for (area = 1; area <= nareas; area++) {
double x, y, z, angle, slope;
int ret;
@@ -149,12 +139,12 @@
G_percent(area, nareas, 2);
Vect_reset_line(Points);
Vect_reset_cats(Cats);
- ret = Vect_get_point_in_area(&map_out, area, &x, &y);
+ ret = Vect_get_point_in_area(&Out, area, &x, &y);
if (ret < 0) {
G_warning(_("Unable to calculate area centroid"));
continue;
}
- ret = Vect_tin_get_z(&map_out, x, y, &z, &angle, &slope);
+ ret = Vect_tin_get_z(&Out, x, y, &z, &angle, &slope);
G_debug(3, "area centroid z: %f", z);
if (ret < 0) {
G_warning(_("Unable to calculate area centroid z coordinate"));
@@ -162,19 +152,11 @@
}
Vect_append_point(Points, x, y, z);
Vect_cat_set(Cats, 1, area);
- Vect_write_line(&map_out, GV_CENTROID, Points, Cats);
+ Vect_write_line(&Out, GV_CENTROID, Points, Cats);
}
}
- Vect_build(&map_out);
- Vect_close(&map_out);
+ Vect_build(&Out);
+ Vect_close(&Out);
exit(EXIT_SUCCESS);
}
-
-/* compare first according to x-coordinate, if equal then y-coordinate */
-int compare(const struct vertex **p1, const struct vertex **p2)
-{
- if ((*p1)->x == (*p2)->x)
- return ((*p1)->y < (*p2)->y);
- return ((*p1)->x < (*p2)->x);
-}
Modified: grass/branches/develbranch_6/vector/v.delaunay2/memory.c
===================================================================
--- grass/branches/develbranch_6/vector/v.delaunay2/memory.c 2010-01-05 13:17:41 UTC (rev 40246)
+++ grass/branches/develbranch_6/vector/v.delaunay2/memory.c 2010-01-05 13:20:17 UTC (rev 40247)
@@ -1,10 +1,9 @@
#include <stdlib.h>
#include <grass/gis.h>
-#include <grass/Vect.h>
#include <grass/glocale.h>
+#include "defs.h"
#include "data_types.h"
-struct vertex *sites;
static struct edge *edges;
static struct edge **free_list_e;
@@ -17,17 +16,17 @@
/* Sites storage. */
sites = (struct vertex *)G_calloc(n, sizeof(struct vertex));
- if (sites == MY_NULL)
+ if (sites == NULL)
G_fatal_error(_("Not enough memory."));
/* Edges. Euler's formula - at most 3n edges on a set of n sites */
n_free_e = 3 * n;
edges = e = (struct edge *)G_calloc(n_free_e, sizeof(struct edge));
- if (edges == MY_NULL)
+ if (edges == NULL)
G_fatal_error(_("Not enough memory."));
free_list_e = (struct edge **)G_calloc(n_free_e, sizeof(struct edge *));
- if (free_list_e == MY_NULL)
+ if (free_list_e == NULL)
G_fatal_error(_("Not enough memory."));
for (i = 0; i < n_free_e; i++, e++)
free_list_e[i] = e;
@@ -37,7 +36,7 @@
{
/* Sites storage. */
sites = (struct vertex *)G_calloc(n, sizeof(struct vertex));
- if (sites == MY_NULL)
+ if (sites == NULL)
G_fatal_error(_("Not enough memory."));
}
@@ -45,7 +44,7 @@
{
/* Sites storage. */
sites = (struct vertex *)G_realloc(sites, n * sizeof(struct vertex));
- if (sites == MY_NULL)
+ if (sites == NULL)
G_fatal_error(_("Not enough memory."));
}
@@ -57,11 +56,11 @@
/* Edges. Euler's formula - at most 3n edges on a set of n sites */
n_free_e = 3 * n;
edges = e = (struct edge *)G_calloc(n_free_e, sizeof(struct edge));
- if (edges == MY_NULL)
+ if (edges == NULL)
G_fatal_error(_("Not enough memory."));
free_list_e = (struct edge **)G_calloc(n_free_e, sizeof(struct edge *));
- if (free_list_e == MY_NULL)
+ if (free_list_e == NULL)
G_fatal_error(_("Not enough memory."));
for (i = 0; i < n_free_e; i++, e++)
free_list_e[i] = e;
More information about the grass-commit
mailing list