| 1108 | } |
| 1109 | |
| 1110 | void KD_TREE::Update(KD_TREE_NODE * root){ |
| 1111 | KD_TREE_NODE * left_son_ptr = root->left_son_ptr; |
| 1112 | KD_TREE_NODE * right_son_ptr = root->right_son_ptr; |
| 1113 | float tmp_range_x[2] = {INFINITY, -INFINITY}; |
| 1114 | float tmp_range_y[2] = {INFINITY, -INFINITY}; |
| 1115 | float tmp_range_z[2] = {INFINITY, -INFINITY}; |
| 1116 | // Update Tree Size |
| 1117 | if (left_son_ptr != nullptr && right_son_ptr != nullptr){ |
| 1118 | root->TreeSize = left_son_ptr->TreeSize + right_son_ptr->TreeSize + 1; |
| 1119 | root->invalid_point_num = left_son_ptr->invalid_point_num + right_son_ptr->invalid_point_num + (root->point_deleted? 1:0); |
| 1120 | root->down_del_num = left_son_ptr->down_del_num + right_son_ptr->down_del_num + (root->point_downsample_deleted? 1:0); |
| 1121 | root->tree_downsample_deleted = left_son_ptr->tree_downsample_deleted & right_son_ptr->tree_downsample_deleted & root->point_downsample_deleted; |
| 1122 | root->tree_deleted = left_son_ptr->tree_deleted && right_son_ptr->tree_deleted && root->point_deleted; |
| 1123 | if (root->tree_deleted || (!left_son_ptr->tree_deleted && !right_son_ptr->tree_deleted && !root->point_deleted)){ |
| 1124 | tmp_range_x[0] = min(min(left_son_ptr->node_range_x[0],right_son_ptr->node_range_x[0]),root->point.x); |
| 1125 | tmp_range_x[1] = max(max(left_son_ptr->node_range_x[1],right_son_ptr->node_range_x[1]),root->point.x); |
| 1126 | tmp_range_y[0] = min(min(left_son_ptr->node_range_y[0],right_son_ptr->node_range_y[0]),root->point.y); |
| 1127 | tmp_range_y[1] = max(max(left_son_ptr->node_range_y[1],right_son_ptr->node_range_y[1]),root->point.y); |
| 1128 | tmp_range_z[0] = min(min(left_son_ptr->node_range_z[0],right_son_ptr->node_range_z[0]),root->point.z); |
| 1129 | tmp_range_z[1] = max(max(left_son_ptr->node_range_z[1],right_son_ptr->node_range_z[1]),root->point.z); |
| 1130 | } else { |
| 1131 | if (!left_son_ptr->tree_deleted){ |
| 1132 | tmp_range_x[0] = min(tmp_range_x[0], left_son_ptr->node_range_x[0]); |
| 1133 | tmp_range_x[1] = max(tmp_range_x[1], left_son_ptr->node_range_x[1]); |
| 1134 | tmp_range_y[0] = min(tmp_range_y[0], left_son_ptr->node_range_y[0]); |
| 1135 | tmp_range_y[1] = max(tmp_range_y[1], left_son_ptr->node_range_y[1]); |
| 1136 | tmp_range_z[0] = min(tmp_range_z[0], left_son_ptr->node_range_z[0]); |
| 1137 | tmp_range_z[1] = max(tmp_range_z[1], left_son_ptr->node_range_z[1]); |
| 1138 | } |
| 1139 | if (!right_son_ptr->tree_deleted){ |
| 1140 | tmp_range_x[0] = min(tmp_range_x[0], right_son_ptr->node_range_x[0]); |
| 1141 | tmp_range_x[1] = max(tmp_range_x[1], right_son_ptr->node_range_x[1]); |
| 1142 | tmp_range_y[0] = min(tmp_range_y[0], right_son_ptr->node_range_y[0]); |
| 1143 | tmp_range_y[1] = max(tmp_range_y[1], right_son_ptr->node_range_y[1]); |
| 1144 | tmp_range_z[0] = min(tmp_range_z[0], right_son_ptr->node_range_z[0]); |
| 1145 | tmp_range_z[1] = max(tmp_range_z[1], right_son_ptr->node_range_z[1]); |
| 1146 | } |
| 1147 | if (!root->point_deleted){ |
| 1148 | tmp_range_x[0] = min(tmp_range_x[0], root->point.x); |
| 1149 | tmp_range_x[1] = max(tmp_range_x[1], root->point.x); |
| 1150 | tmp_range_y[0] = min(tmp_range_y[0], root->point.y); |
| 1151 | tmp_range_y[1] = max(tmp_range_y[1], root->point.y); |
| 1152 | tmp_range_z[0] = min(tmp_range_z[0], root->point.z); |
| 1153 | tmp_range_z[1] = max(tmp_range_z[1], root->point.z); |
| 1154 | } |
| 1155 | } |
| 1156 | } else if (left_son_ptr != nullptr){ |
| 1157 | root->TreeSize = left_son_ptr->TreeSize + 1; |
| 1158 | root->invalid_point_num = left_son_ptr->invalid_point_num + (root->point_deleted?1:0); |
| 1159 | root->down_del_num = left_son_ptr->down_del_num + (root->point_downsample_deleted?1:0); |
| 1160 | root->tree_downsample_deleted = left_son_ptr->tree_downsample_deleted & root->point_downsample_deleted; |
| 1161 | root->tree_deleted = left_son_ptr->tree_deleted && root->point_deleted; |
| 1162 | if (root->tree_deleted || (!left_son_ptr->tree_deleted && !root->point_deleted)){ |
| 1163 | tmp_range_x[0] = min(left_son_ptr->node_range_x[0],root->point.x); |
| 1164 | tmp_range_x[1] = max(left_son_ptr->node_range_x[1],root->point.x); |
| 1165 | tmp_range_y[0] = min(left_son_ptr->node_range_y[0],root->point.y); |
| 1166 | tmp_range_y[1] = max(left_son_ptr->node_range_y[1],root->point.y); |
| 1167 | tmp_range_z[0] = min(left_son_ptr->node_range_z[0],root->point.z); |