36 using namespace Opcode;
43 index = (First+last)>>1;
45 if(max>array[sorted[index]]) First = index+1;
53 #define PRUNING_SORTER RadixSort
98 if(!nb0 || !array0 || !nb1 || !array1)
return false;
106 float* MinPosList0 =
new float[nb0];
107 float* MinPosList1 =
new float[nb1];
111 for(i=0;i<nb0;i++) MinPosList0[i] = array0[i]->GetMin(Axis0);
112 for(i=0;i<nb1;i++) MinPosList1[i] = array1[i]->GetMin(Axis0);
117 const udword* Sorted0 = RS0->Sort(MinPosList0, nb0).GetRanks();
118 const udword* Sorted1 = RS1->Sort(MinPosList1, nb1).GetRanks();
123 const udword*
const LastSorted0 = &Sorted0[nb0];
124 const udword*
const LastSorted1 = &Sorted1[nb1];
125 const udword* RunningAddress0 = Sorted0;
126 const udword* RunningAddress1 = Sorted1;
128 while(RunningAddress1<LastSorted1 && Sorted0<LastSorted0)
132 while(RunningAddress1<LastSorted1 && MinPosList1[*RunningAddress1]<MinPosList0[Index0]) RunningAddress1++;
134 const udword* RunningAddress2_1 = RunningAddress1;
136 while(RunningAddress2_1<LastSorted1 && MinPosList1[Index1 = *RunningAddress2_1++]<=array0[Index0]->GetMax(Axis0))
138 if(array0[Index0]->
Intersect(*array1[Index1], Axis1))
140 if(array0[Index0]->
Intersect(*array1[Index1], Axis2))
150 while(RunningAddress0<LastSorted0 && Sorted1<LastSorted1)
154 while(RunningAddress0<LastSorted0 && MinPosList0[*RunningAddress0]<=MinPosList1[Index0]) RunningAddress0++;
156 const udword* RunningAddress2_0 = RunningAddress0;
158 while(RunningAddress2_0<LastSorted0 && MinPosList0[Index1 = *RunningAddress2_0++]<=array1[Index0]->GetMax(Axis0))
160 if(array0[Index1]->
Intersect(*array1[Index0], Axis1))
162 if(array0[Index1]->
Intersect(*array1[Index0], Axis2))
177 #define ORIGINAL_VERSION
193 if(!nb || !array)
return false;
200 #ifdef ORIGINAL_VERSION
203 float* PosList =
new float[nb+1];
206 for(
udword i=0;i<nb;i++) PosList[i] = array[i]->GetMin(Axis0);
211 const udword* Sorted = RS->Sort(PosList, nb).GetRanks();
214 const udword*
const LastSorted = &Sorted[nb];
215 const udword* RunningAddress = Sorted;
217 while(RunningAddress<LastSorted && Sorted<LastSorted)
222 while(PosList[*RunningAddress++]<PosList[Index0]);
224 if(RunningAddress<LastSorted)
226 const udword* RunningAddress2 = RunningAddress;
229 while(PosList[Index1 = *RunningAddress2++]<=array[Index0]->GetMax(Axis0))
233 if(array[Index0]->
Intersect(*array[Index1], Axis1))
235 if(array[Index0]->
Intersect(*array[Index1], Axis2))
251 float* MinList =
new float[nb+1];
254 for(
udword i=0;i<nb;i++) MinList[i] = array[i]->GetMin(Axis0);
259 udword* Sorted = RS->Sort(MinList, nb+1).GetRanks();
264 const udword* RunningAddress = Sorted;
269 while(RunningAddress<&Sorted[nb])
273 Index0 = *RunningAddress++;
280 const udword* RunningAddress2 = RunningAddress;
285 float CurrentMax = array[Index0]->
GetMax(Axis0);
287 while(MinList[Index1 = *RunningAddress2] <= CurrentMax)
292 if(array[Index0]->
Intersect(*array[Index1], Axis1))
294 if(array[Index0]->
Intersect(*array[Index1], Axis2))
333 if(!nb0 || !array0 || !nb1 || !array1)
return false;
358 if(!nb || !array)
return false;