forked from ofirm93/SoftwareProject
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSPKDArray.c
More file actions
98 lines (91 loc) · 2.37 KB
/
SPKDArray.c
File metadata and controls
98 lines (91 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//
// Created by Ofir on 15/03/2017.
//
#include <stdlib.h>
#include <stdbool.h>
#include "SPKDArray.h"
struct sp_kd_array_t{
SPPoint*** array;
int dimension;
int size;
};
void spDestroyKDArray(const struct sp_kd_array_t *arr, int i) {
for (int j = 0; j < i; j++) {
free(arr->array[j]);
}
free(arr);
}
SPKDArray spkdArrayConstructor(int dimension, int size){
if(dimension < 1 || size < 1){
return NULL;
}
SPKDArray arr = malloc(sizeof(struct sp_kd_array_t));
if(!arr){
return NULL;
}
arr->dimension = dimension;
arr->size = size;
arr->array = malloc(dimension * sizeof(SPPoint**));
if(!(arr->array)){
free(arr);
return NULL;
}
for(int i = 0; i < dimension; i++){
arr->array[i] = malloc(size * sizeof(SPPoint*));
if(!(arr->array[i])){
spDestroyKDArray(arr, i);
return NULL;
}
}
return arr;
}
SPKDArray spInitSPKDArray(SPPoint** arr, int size){
if(!arr || size < 1){
return NULL;
}
int dimension = spPointGetDimension(arr[0]);
SPKDArray array = spkdArrayConstructor(dimension, size);
if (!array){
return NULL;
}
for (int i = 0; i < dimension; ++i) {
for (int j = 0; j < size; ++j) {
array->array[i][j] = arr[j];
}
int comparator(const void* point1, const void* point2){
double coor1 = spPointGetAxisCoor((SPPoint*)point1, i);
double coor2 = spPointGetAxisCoor((SPPoint*)point2, i);
if(coor1 - coor2 == 0){
return 0;
}
else if( coor1 - coor2 > 0){
return 1;
}
return -1;
}
qsort(array->array[i], (size_t) size, sizeof(SPPoint*), comparator);
}
return array;
}
/**
* TODO improve this method
* @param kdArr
* @param coor
* @param kdLeft
* @param kdRight
* @return
*/
bool spSplitSPKDArray(SPKDArray kdArr, int coor, SPKDArray* kdLeft, SPKDArray* kdRight){
if(!kdArr || coor < 0 || !kdLeft || !kdRight){
return false;
}
int size = kdArr->size;
int rightSize = size / 2;
int leftSize = size - rightSize;
*kdLeft = spInitSPKDArray(kdArr->array[coor], leftSize);
if(!(*kdLeft)){
return false;
}
*kdRight = spInitSPKDArray((kdArr->array[coor]) + leftSize, rightSize);
return true;
}