double CFS::cost (ElementSubset * X) { timeval begin, end; gettimeofday (& begin, NULL); double cost; number_of_calls_of_cost_function++; if (set->get_set_cardinality () == 0) cost = 0; else if (X->get_subset_cardinality () == 0) cost = INFTY; else cost = - evaluateSubset (X); gettimeofday (& end, NULL); elapsed_time_of_cost_function_calls += diff_us (end, begin); // Threshold is a maximum number of calls of the cost function // if ((has_max_number_of_calls_set) && (number_of_calls_of_cost_function >= max_number_of_calls_of_cost_function)) reached_threshold = true; return cost; }
void SegmenterSimple::compute() { std::vector<VoxelSubset> subsets; VoxelSubset whole_mesh(voxels_); for (int i = 0; i < voxels_->nVoxels(); ++i) { whole_mesh.addVoxel(i); } whole_mesh.calculateConvexHull(); subsets.push_back(whole_mesh); // Segmentation algorithm: // Keep a list with all current parts, starting with whole modedl // In every pass, try to split each part along a plane // Brute-Force search: evaluate all split planes, take best for (unsigned int pass = 0; pass < passes_; ++pass) { std::cout << "Pass " << pass << std::endl; bool changed = false; // evaluation_blend_ = (pass+1) / (passes_+1); std::vector<VoxelSubset> new_subsets; for (unsigned int subset_index = 0; subset_index < subsets.size(); ++subset_index) { if (subsets[subset_index].isFinal()) { new_subsets.push_back(subsets[subset_index]); continue; } std::vector<VoxelSubset> best_partition; best_partition.push_back(subsets[subset_index]); Real best_value = evaluateSubset(subsets[subset_index]) - min_gain_; //<-Bonus for no split to avoide overly-precise splitting if (subsets[subset_index].isFinal()) { new_subsets.push_back(subsets[subset_index]); continue; } std::vector<Split> possible_splits = generateSplits(subsets[subset_index]); for (unsigned int split_index = 0; split_index < possible_splits.size(); ++split_index) { Split& split = possible_splits[split_index]; std::vector<VoxelSubset> new_partition = subsets[subset_index].partition(split); Real new_value = evaluatePartition(subsets[subset_index], new_partition); if (new_value < best_value) { best_partition = new_partition; best_value = new_value; } } // std::cout<<"Best split value: "<<best_value<<std::endl; if (best_partition.size() == 1) { best_partition[0].setFinal(); } else { changed = true; } new_subsets.insert(new_subsets.end(), best_partition.begin(), best_partition.end()); } if (!changed) break; subsets = new_subsets; } subsets_ = subsets; for (unsigned int i = 0; i < subsets_.size(); ++i) { segmentation_.push_back(subsets_[i].getConvexHull()); } }