[cig-commits] r3940 - in long/3D/Gale/trunk/src/StGermain: .
Discretisation/Geometry/src
walter at geodynamics.org
walter at geodynamics.org
Thu Jul 6 02:06:09 PDT 2006
Author: walter
Date: 2006-07-06 02:06:09 -0700 (Thu, 06 Jul 2006)
New Revision: 3940
Modified:
long/3D/Gale/trunk/src/StGermain/
long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c
long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h
Log:
r2468 at earth: boo | 2006-07-06 02:02:40 -0700
r2457 at earth (orig r3660): RaquibulHassan | 2006-06-29 02:26:03 -0700
Adding an offset to the node numbering scheme which will be used in the parallel
version of the delaunay algorithm.
Property changes on: long/3D/Gale/trunk/src/StGermain
___________________________________________________________________
Name: svk:merge
- 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2467
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3659
+ 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2468
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3660
Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c 2006-07-06 09:06:05 UTC (rev 3939)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c 2006-07-06 09:06:09 UTC (rev 3940)
@@ -88,6 +88,7 @@
NULL,
NULL,
0,
+ 0,
NULL );
return d;
@@ -98,6 +99,7 @@
Dictionary* dictionary,
CoordF *sites,
int numSites,
+ int idOffset,
DelaunayAttributes *attr )
{
Delaunay *d = _Delaunay_New(
@@ -117,6 +119,7 @@
dictionary,
sites,
numSites,
+ idOffset,
attr );
return d;
@@ -129,6 +132,7 @@
Dictionary* dictionary,
CoordF *sites,
int numSites,
+ int idOffset,
DelaunayAttributes *attr )
{
int i = 0;
@@ -159,6 +163,7 @@
}
self->numInputSites = numSites;
+ self->idOffset = idOffset;
self->sites = Memory_Alloc_Array_Unnamed( Site, sizeof( Site ) * self->numSites );
memset( self->boundingTriangle, 0, sizeof( self->boundingTriangle ) );
@@ -170,7 +175,7 @@
else{
self->sites[i].coord = &(self->boundingTriangle[i%3]);
}
- self->sites[i].id = i;
+ self->sites[i].id = i + self->idOffset;
}
_Stg_Class_Init( (Stg_Class*)self );
@@ -197,6 +202,7 @@
Dictionary *dictionary,
CoordF *sites,
int numSites,
+ int idOffset,
DelaunayAttributes *attr )
{
Delaunay *self = NULL;
@@ -217,6 +223,7 @@
}
self->numInputSites = numSites;
+ self->idOffset = idOffset;
self->sites = Memory_Alloc_Array_Unnamed( Site, sizeof( Site ) * self->numSites );
memset( self->boundingTriangle, 0, sizeof( self->boundingTriangle ) );
@@ -228,7 +235,7 @@
else{
self->sites[i].coord = &(self->boundingTriangle[i%3]);
}
- self->sites[i].id = i;
+ self->sites[i].id = i + idOffset;
}
@@ -240,9 +247,33 @@
}
#define PI 3.1415926535897932384626
+void findMinMax( Site *sites, int count, float *minX, float *minY, float *maxX, float *maxY )
+{
+ int i = 0;
+
+ *maxX = -INFINITY;
+ *maxY = -INFINITY;
+
+ *minX = INFINITY;
+ *minY = INFINITY;
+ for( i=0; i<count; i++ ){
+ if( *maxX < (*(sites[i].coord))[0] ){
+ *maxX = (*(sites[i].coord))[0];
+ }
+ if( *maxY < (*(sites[i].coord))[1] ){
+ *maxY = (*(sites[i].coord))[1];
+ }
+ if( *minX > (*(sites[i].coord))[0] ){
+ *minX = (*(sites[i].coord))[0];
+ }
+ if( *minY > (*(sites[i].coord))[1] ){
+ *minY = (*(sites[i].coord))[1];
+ }
+ }
+}
+
void _Delaunay_Init( Delaunay* self )
{
- int i = 0;
float maxX, minX, maxY, minY;
float centreX, centreY;
float radius;
@@ -250,26 +281,8 @@
assert( self );
centreX = 0; centreY = 0;
- maxX = -1e33;
- minX = 1e33;
- maxY = -1e33;
- minY = 1e33;
- for( i=0; i<self->numSites; i++ ){
- if ( maxX < (*(self->sites[i].coord))[0] ){
- maxX = (*(self->sites[i].coord))[0];
- }
- if ( maxY < (*(self->sites[i].coord))[1] ){
- maxY = (*(self->sites[i].coord))[1];
- }
-
- if ( minX > (*(self->sites[i].coord))[0] ){
- minX = (*(self->sites[i].coord))[0];
- }
- if ( minY > (*(self->sites[i].coord))[1] ){
- minY = (*(self->sites[i].coord))[1];
- }
- }
+ findMinMax( self->sites, self->numSites, &minX, &minY, &maxX, &maxY );
radius = (sqrt((maxX - minX) * (maxX - minX) + (maxY - minY) * (maxY - minY)));
@@ -575,8 +588,8 @@
memset( delaunay->hull, 0, sizeof( int ) * delaunay->numSites );
do{
- delaunay->hull[((Site*)ORG(le))->id] = 1;
- delaunay->hull[((Site*)DEST(le))->id] = 1;
+ delaunay->hull[((Site*)ORG(le))->id - delaunay->idOffset] = 1;
+ delaunay->hull[((Site*)DEST(le))->id - delaunay->idOffset] = 1;
le = RPREV(le);
}while(le != start);
}
@@ -627,9 +640,9 @@
((((Site*)DEST(eLnext)) == ((Site*)DEST(eOnext)))) ){
if( delaunay->attributes->BuildBoundingTriangle ){
- if( (!( delaunay->hull[(((Site*)ORG(e))->id)] )) &&
- (!( delaunay->hull[(((Site*)DEST(e))->id)] )) &&
- (!( delaunay->hull[(((Site*)DEST(eOnext))->id)] )) )
+ if( (!( delaunay->hull[(((Site*)ORG(e))->id) - delaunay->idOffset] )) &&
+ (!( delaunay->hull[(((Site*)DEST(e))->id) - delaunay->idOffset] )) &&
+ (!( delaunay->hull[(((Site*)DEST(eOnext))->id) - delaunay->idOffset] )) )
{
triIndices[triCount][0] = (((Site*)ORG(e))->id);
triIndices[triCount][1] = (((Site*)DEST(e))->id);
@@ -760,11 +773,12 @@
src = (Site*)ORG((QuadEdgeRef)((void*)(&(edges[i]))));
dst = (Site*)DEST((QuadEdgeRef)((void*)(&(edges[i]))));
- if( (src->id < delaunay->numInputSites) && (dst->id < delaunay->numInputSites) ){
+ if( (src->id < (delaunay->numInputSites+delaunay->idOffset))
+ && (dst->id < (delaunay->numInputSites+delaunay->idOffset)) ){
/* Finding the number of neighbours that each point has */
- numNeighbours[src->id]++;
- numNeighbours[dst->id]++;
+ numNeighbours[src->id - delaunay->idOffset]++;
+ numNeighbours[dst->id - delaunay->idOffset]++;
/* NumNeighboursSum is required for allocating just enough memory for storing the
* actual neighbours and the sides of the voronoi celss */
@@ -817,12 +831,13 @@
src = (Site*)ORG((QuadEdgeRef)((void*)(&(edges[i]))));
dst = (Site*)DEST((QuadEdgeRef)((void*)(&(edges[i]))));
- count = tempNumNeighbours[src->id];
- count1 = tempNumNeighbours[dst->id];
+ count = tempNumNeighbours[src->id - delaunay->idOffset];
+ count1 = tempNumNeighbours[dst->id - delaunay->idOffset];
if( edges[i].count == 1 ){
- if( (src->id < delaunay->numInputSites) && (dst->id < delaunay->numInputSites) ){
+ if( (src->id < (delaunay->numInputSites+delaunay->idOffset))
+ && (dst->id < (delaunay->numInputSites+delaunay->idOffset)) ){
vsrc = (VoronoiVertex*)VORG((QuadEdgeRef)((void*)(&(edges[i]))));
vdst = (VoronoiVertex*)VDEST((QuadEdgeRef)((void*)(&(edges[i]))));
@@ -837,8 +852,8 @@
dist = sqrt( diffx*diffx + diffy*diffy );
- sides[src->id][--count] = dist;
- sides[dst->id][--count1] = dist;
+ sides[src->id - delaunay->idOffset][--count] = dist;
+ sides[dst->id - delaunay->idOffset][--count1] = dist;
}
if( attr->CalculateVoronoiSurfaceArea ){
@@ -846,28 +861,28 @@
/* calculating the voronoi surface area for each point, with the hull
* nodes having an infinite unbounded area */
- if( !(hull[src->id]) ){
+ if( !(hull[src->id - delaunay->idOffset]) ){
CCW( src->coord, &(vsrc->point), &(vdst->point), &voronoiAreaResult );
- voronoiArea[src->id] += FABS( voronoiAreaResult ) * 0.5;
+ voronoiArea[src->id - delaunay->idOffset] += FABS( voronoiAreaResult ) * 0.5;
}
else{
- voronoiArea[src->id] = INFINITY;
+ voronoiArea[src->id - delaunay->idOffset] = INFINITY;
}
- if( !(hull[dst->id]) ){
+ if( !(hull[dst->id - delaunay->idOffset]) ){
CCW( dst->coord, &(vsrc->point), &(vdst->point), &voronoiAreaResult );
- voronoiArea[dst->id] += FABS( voronoiAreaResult ) * 0.5;
+ voronoiArea[dst->id - delaunay->idOffset] += FABS( voronoiAreaResult ) * 0.5;
}
else{
- voronoiArea[dst->id] = INFINITY;
+ voronoiArea[dst->id - delaunay->idOffset] = INFINITY;
}
}
}
/* Storing the actual neighbours of each node */
if( attr->FindNeighbours ){
- neighbours[src->id][--tempNumNeighbours[src->id]] = dst->id;
- neighbours[dst->id][--tempNumNeighbours[dst->id]] = src->id;
+ neighbours[src->id - delaunay->idOffset][--tempNumNeighbours[src->id - delaunay->idOffset]] = dst->id;
+ neighbours[dst->id - delaunay->idOffset][--tempNumNeighbours[dst->id - delaunay->idOffset]] = src->id;
}
}
edges[i].count++;
Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h 2006-07-06 09:06:05 UTC (rev 3939)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h 2006-07-06 09:06:09 UTC (rev 3940)
@@ -68,6 +68,7 @@
int numSites; \
int numInputSites; \
Site *sites; \
+ int idOffset; \
CoordF boundingTriangle[3]; \
int numEdges; \
int numVoronoiSites; \
@@ -99,6 +100,7 @@
Dictionary* dictionary,
CoordF *sites,
int numSites,
+ int idOffset,
DelaunayAttributes *attr );
/** Initialise a Delaunay */
@@ -108,6 +110,7 @@
Dictionary* dictionary,
CoordF *sites,
int numSites,
+ int idOffset,
DelaunayAttributes *attr );
/** Creation implementation */
@@ -128,6 +131,7 @@
Dictionary *dictionary,
CoordF *sites,
int numSites,
+ int idOffset,
DelaunayAttributes *attr );
void _Delaunay_Init( Delaunay* self );
More information about the cig-commits
mailing list