31 #include "quickhvolume.h"
43 static unsigned char p;
63 static sureInline(
void) showPoint(
int a);
69 static sureInline(
void) showS();
74 static sureInline(
void) get2D();
79 static sureInline(
void) insert();
83 static sureInline(
void) showPoint(
int a)
90 printf(
"%.1f ", P[a].x[t]);
96 static sureInline(
void) showS()
104 printf(
"V[%d]=%.1f ", t,
V[t]);
116 static sureInline(
void) insert()
127 }
while(P[p].x[
i] > P[*s].x[
i]);
151 S[i+1][k] = S[i+1][k+1];
159 while (S[i+1][k] == 0 || P[p].x[i] > P[S[i][k]].x[i]) {
161 if (S[i+1][k] == 1 && tX[p] > tX[S[i][k]]) {
162 V[
D-2] += (tX[p] - tX[S[
i][k]])
163 * (P[S[i][k]].x[i] - P[S[i][l]].x[i]);
168 if (S[i+1][k] == 1) l = k;
171 S[i+1][k] = S[i+1][k+1];
174 if (S[i+1][k] == 1 && tX[p] > tX[S[i][k]]) {
175 V[
D-2] += (tX[p] - tX[S[
i][k]])
176 * (P[p].x[i] - P[S[i][l]].x[i]);
178 if (P[p].x[i] == P[S[i][k]].x[i]) {
184 if (P[p].x[i] <= P[S[i][k]].x[i] && tX[p] < tX[S[i][k]]) {
195 static sureInline(
void) get2D()
203 m = P[S[
D-2][c[
D-1]]].x[
D-1];
204 while(c[
D-1] > c[
D-2])
207 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]);
208 if(P[S[
D-2][c[
D-1]]].x[
D-1] > m)
209 m = P[S[
D-2][c[
D-1]]].x[
D-1];
244 P[1].x[
D-1] = P[0].x[
D-1];
253 intercept(&(P[p]), one, &(PS[idx[t]]));
269 }
while(c[i-1] < c[i] &&
equal(&P[p], &P[S[i-1][c[i]]], i-1) );
278 V[
i] +=
V[i+1] * (P[S[
i][c[i+1]+1]].x[
i] - P[S[
i][c[i+1]]].x[
i]);
293 T = HSO(zero, one, n, idx, PS);
299 exHV[idx[0]] += T - HSO(zero, one, n-1, &(idx[1]), PS);
double exHSO(point *zero, point *one, int n, int *idx, point *PS, double *exHV)
double * V
A volume value for every dimension + 1.
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.