| 1039 | if(should_remove) |
| 1040 | { |
| 1041 | set<vertex*> vertices_to_be_reduced; |
| 1042 | |
| 1043 | int k = 1; |
| 1044 | |
| 1045 | for(vector<list<polyhedron*>>::iterator vert_ref = for_merging.begin();vert_ref<for_merging.end();vert_ref++) |
| 1046 | { |
| 1047 | for(list<polyhedron*>::reverse_iterator merge_ref = vert_ref->rbegin();merge_ref!=vert_ref->rend();merge_ref++) |
| 1048 | { |
| 1049 | if((*merge_ref)->get_multiplicity()>1) |
| 1050 | { |
| 1051 | if(k==1) |
| 1052 | { |
| 1053 | vertices_to_be_reduced.insert((vertex*)(*merge_ref)); |
| 1054 | } |
| 1055 | else |
| 1056 | { |
| 1057 | (*merge_ref)->lower_multiplicity(); |
| 1058 | } |
| 1059 | } |
| 1060 | else |
| 1061 | { |
| 1062 | toprow* current_positive = (toprow*)(*merge_ref)->positiveparent; |
| 1063 | toprow* current_negative = (toprow*)(*merge_ref)->negativeparent; |
| 1064 | |
| 1065 | current_positive->condition -= toremove; |
| 1066 | current_positive->condition_order--; |
| 1067 | |
| 1068 | current_positive->children.insert(current_positive->children.end(),current_negative->children.begin(),current_negative->children.end()); |
| 1069 | current_positive->children.remove(*merge_ref); |
| 1070 | |
| 1071 | for(list<polyhedron*>::iterator child_ref = current_negative->children.begin();child_ref!=current_negative->children.end();child_ref++) |
| 1072 | { |
| 1073 | (*child_ref)->parents.remove(current_negative); |
| 1074 | (*child_ref)->parents.push_back(current_positive); |
| 1075 | } |
| 1076 | |
| 1077 | current_positive->negativechildren.insert(current_positive->negativechildren.end(),current_negative->negativechildren.begin(),current_negative->negativechildren.end()); |
| 1078 | |
| 1079 | current_positive->positivechildren.insert(current_positive->positivechildren.end(),current_negative->positivechildren.begin(),current_negative->positivechildren.end()); |
| 1080 | |
| 1081 | current_positive->neutralchildren.insert(current_positive->neutralchildren.end(),current_negative->positivechildren.begin(),current_negative->positivechildren.end()); |
| 1082 | |
| 1083 | switch((*merge_ref)->get_state(SPLIT)) |
| 1084 | { |
| 1085 | case -1: |
| 1086 | current_positive->negativechildren.remove(*merge_ref); |
| 1087 | break; |
| 1088 | case 0: |
| 1089 | current_positive->neutralchildren.remove(*merge_ref); |
| 1090 | break; |
| 1091 | case 1: |
| 1092 | current_positive->positivechildren.remove(*merge_ref); |
| 1093 | break; |
| 1094 | } |
| 1095 | |
| 1096 | current_positive->parents.insert(current_positive->parents.begin(),current_negative->parents.begin(),current_negative->parents.end()); |
| 1097 | unique(current_positive->parents.begin(),current_positive->parents.end()); |
| 1098 | |
| 1099 | for(list<polyhedron*>::iterator parent_ref = current_negative->parents.begin();parent_ref!=current_negative->parents.end();parent_ref++) |
| 1100 | { |
| 1101 | (*parent_ref)->children.remove(current_negative); |
| 1102 | (*parent_ref)->children.push_back(current_positive); |
| 1103 | } |
| 1104 | |
| 1105 | current_positive->totallyneutralchildren.insert(current_negative->totallyneutralchildren.begin(),current_negative->totallyneutralchildren.end()); |
| 1106 | current_positive->totallyneutralchildren.erase(*merge_ref); |
| 1107 | |
| 1108 | current_positive->totallyneutralgrandchildren.insert(current_negative->totallyneutralgrandchildren.begin(),current_negative->totallyneutralgrandchildren.end()); |
| 1109 | |
| 1110 | current_positive->vertices.insert(current_negative->vertices.begin(),current_negative->vertices.end()); |
| 1111 | current_positive->negativeneutralvertices.insert(current_negative->negativeneutralvertices.begin(),current_negative->negativeneutralvertices.end()); |
| 1112 | current_positive->positiveneutralvertices.insert(current_negative->positiveneutralvertices.begin(),current_negative->positiveneutralvertices.end()); |
| 1113 | |
| 1114 | for(set<vertex*>::iterator vert_ref = (*merge_ref)->vertices.begin();vert_ref!=(*merge_ref)->vertices.end();vert_ref++) |
| 1115 | { |
| 1116 | if((*vert_ref)->get_multiplicity()==1) |
| 1117 | { |
| 1118 | current_positive->vertices.erase(*vert_ref); |
| 1119 | current_positive->negativeneutralvertices.erase(*vert_ref); |
| 1120 | current_positive->positiveneutralvertices.erase(*vert_ref); |
| 1121 | } |
| 1122 | } |
| 1123 | |
| 1124 | if(current_negative->get_state(SPLIT)==0&&!current_negative->totally_neutral) |
| 1125 | { |
| 1126 | for_splitting[k].remove(current_negative); |
| 1127 | |
| 1128 | if(current_positive->get_state(SPLIT)!=0||current_positive->totally_neutral) |
| 1129 | { |
| 1130 | for_splitting[k].push_back(current_positive); |
| 1131 | } |
| 1132 | } |
| 1133 | |
| 1134 | if(current_positive->totally_neutral) |
| 1135 | { |
| 1136 | if(!current_negative->totally_neutral) |
| 1137 | { |
| 1138 | for(set<polyhedron*>::iterator grand_ref = current_positive->grandparents.begin();grand_ref!=current_positive->grandparents.end();grand_ref++) |
| 1139 | { |
| 1140 | (*grand_ref)->totallyneutralgrandchildren.erase(current_positive); |
| 1141 | } |
| 1142 | |
| 1143 | current_positive->grandparents.clear(); |
| 1144 | } |
| 1145 | else |
| 1146 | { |
| 1147 | for(set<polyhedron*>::iterator grand_ref = current_negative->grandparents.begin();grand_ref!=current_negative->grandparents.end();grand_ref++) |
| 1148 | { |
| 1149 | (*grand_ref)->totallyneutralgrandchildren.erase(current_negative); |
| 1150 | (*grand_ref)->totallyneutralgrandchildren.insert(current_positive); |
| 1151 | } |
| 1152 | |
| 1153 | current_positive->grandparents.insert(current_negative->grandparents.begin(),current_negative->grandparents.end()); |
| 1154 | } |
| 1155 | } |
| 1156 | else |
| 1157 | { |
| 1158 | if(current_negative->totally_neutral) |
| 1159 | { |
| 1160 | for(set<polyhedron*>::iterator grand_ref = current_negative->grandparents.begin();grand_ref!=current_negative->grandparents.end();grand_ref++) |
| 1161 | { |
| 1162 | (*grand_ref)->totallyneutralgrandchildren.erase(current_negative); |
| 1163 | } |
| 1164 | } |
| 1165 | } |
| 1166 | |
| 1167 | current_positive->totally_neutral = (current_positive->totally_neutral && current_negative->totally_neutral); |
| 1168 | |
| 1169 | current_positive->triangulate(k==for_splitting.size()-1); |
| 1170 | |
| 1171 | statistic.delete_polyhedron(k,current_negative); |
| 1172 | |
| 1173 | delete current_negative; |
| 1174 | |
| 1175 | for(list<polyhedron*>::iterator child_ref = (*merge_ref)->children.begin();child_ref!=(*merge_ref)->children.end();child_ref++) |
| 1176 | { |
| 1177 | (*child_ref)->parents.remove(*merge_ref); |
| 1178 | } |
| 1179 | |
| 1180 | for(list<polyhedron*>::iterator parent_ref = (*merge_ref)->parents.begin();parent_ref!=(*merge_ref)->parents.end();parent_ref++) |
| 1181 | { |
| 1182 | (*parent_ref)->positivechildren.remove(*merge_ref); |
| 1183 | (*parent_ref)->negativechildren.remove(*merge_ref); |
| 1184 | (*parent_ref)->neutralchildren.remove(*merge_ref); |
| 1185 | (*parent_ref)->children.remove(*merge_ref); |
| 1186 | } |
| 1187 | |
| 1188 | for(set<polyhedron*>::iterator grand_ch_ref = (*merge_ref)->totallyneutralgrandchildren.begin();grand_ch_ref!=(*merge_ref)->totallyneutralgrandchildren.end();grand_ch_ref++) |
| 1189 | { |
| 1190 | (*grand_ch_ref)->grandparents.erase(*merge_ref); |
| 1191 | } |
| 1192 | |
| 1193 | for(set<polyhedron*>::iterator grand_p_ref = (*merge_ref)->grandparents.begin();grand_p_ref!=(*merge_ref)->grandparents.end();grand_p_ref++) |
| 1194 | { |
| 1195 | (*grand_p_ref)->totallyneutralgrandchildren.erase(*merge_ref); |
| 1196 | } |
| 1197 | |
| 1198 | statistic.delete_polyhedron(k-1,*merge_ref); |
| 1199 | |
| 1200 | if(k==1) |
| 1201 | { |
| 1202 | vertices_to_be_reduced.insert((vertex*)(*merge_ref)); |
| 1203 | } |
| 1204 | else |
| 1205 | { |
| 1206 | delete *merge_ref; |
| 1207 | } |
| 1208 | } |
| 1209 | } |
| 1210 | |
| 1211 | k++; |
| 1212 | |
| 1213 | } |
| 1214 | |
| 1215 | for(set<vertex*>::iterator vert_ref = vertices_to_be_reduced.begin();vert_ref!=vertices_to_be_reduced.end();vert_ref++) |
| 1216 | { |
| 1217 | if((*vert_ref)->get_multiplicity()>1) |
| 1218 | { |
| 1219 | (*vert_ref)->lower_multiplicity(); |
| 1220 | } |
| 1221 | else |
| 1222 | { |
| 1223 | delete *vert_ref; |
| 1224 | } |
| 1225 | } |
| 1226 | } |
| 1227 | |