32 #include "constants.h"
44 static unsigned char p;
64 static sureInline(
void) showPoint(
int a);
70 static sureInline(
void) showS();
75 static sureInline(
void) get2D();
80 static sureInline(
void) insert();
84 static sureInline(
void) showPoint(
int a)
91 printf(
"%.1f ", P[a].x[t]);
97 static sureInline(
void) showS()
105 printf(
"V[%d]=%.1f ", t,
V[t]);
117 static sureInline(
void) insert()
128 }
while(P[p].x[i] > P[*s].x[i]);
152 S[i+1][k] = S[i+1][k+1];
160 while (S[i+1][k] == 0 || P[p].x[i] > P[S[i][k]].x[i]) {
162 if (S[i+1][k] == 1 && tX[p] > tX[S[i][k]]) {
163 V[
D-2] += (tX[p] - tX[S[i][k]])
164 * (P[S[i][k]].x[i] - P[S[i][l]].x[i]);
169 if (S[i+1][k] == 1) l = k;
172 S[i+1][k] = S[i+1][k+1];
175 if (S[i+1][k] == 1 && tX[p] > tX[S[i][k]]) {
176 V[
D-2] += (tX[p] - tX[S[i][k]])
177 * (P[p].x[i] - P[S[i][l]].x[i]);
179 if (P[p].x[i] == P[S[i][k]].x[i]) {
185 if (P[p].x[i] <= P[S[i][k]].x[i] && tX[p] < tX[S[i][k]]) {
196 static sureInline(
void) get2D()
204 m = P[S[
D-2][c[
D-1]]].x[
D-1];
205 while(c[
D-1] > c[
D-2])
208 V[
D-2] += (m-P[0].x[
D-1])*(P[S[
D-2][c[
D-1]+1]].x[
D-2] - P[S[
D-2][c[
D-1]]].x[
D-2]);
209 if(P[S[
D-2][c[
D-1]]].x[
D-1] > m)
210 m = P[S[
D-2][c[
D-1]]].x[
D-1];
245 P[1].x[
D-1] = P[0].x[
D-1];
254 intercept(&(P[p]), one, &(PS[idx[t]]));
270 }
while(c[i-1] < c[i] &&
equal(&P[p], &P[S[i-1][c[i]]], i-1) );
279 V[i] +=
V[i+1] * (P[S[i][c[i+1]+1]].x[i] - P[S[i][c[i+1]]].x[i]);
#define D
D is the number of dimensions.
double * V
A volume value for every dimension + 1.
double HSO(point *zero, point *one, int n, int *idx, point *PS)
struct point __attribute__((aligned(16))) point
All points must be aligned for SSE2.
Point is an array of coordinates, in a struct for simple and fast copy.