88 template<
typename INPUT_ITERATOR,
typename DISTANCE_FUNC,
typename OUTPUT_ITERATOR,
typename WEIGHT_FUNC>
89 int DBSCAN(
const INPUT_ITERATOR first,
const INPUT_ITERATOR last, DISTANCE_FUNC distance_func,
90 OUTPUT_ITERATOR result,
const double epsilon,
const double n_min, WEIGHT_FUNC weight_func) {
92 const size_t input_size = std::distance(first, last);
94 std::vector<int> id_cache(input_size, -1);
97 int current_cluster_id = 0;
99 for (INPUT_ITERATOR it = first; it != last; ++it, ++idx) {
102 if (id_cache[idx] >= 0)
continue;
105 std::vector<INPUT_ITERATOR> neighborhood; neighborhood.reserve(input_size);
106 _DBSCAN_PRIVATE::region_query(first, last, it, distance_func, std::back_inserter(neighborhood), epsilon);
108 if (_DBSCAN_PRIVATE::neighborhoodWeight(neighborhood.begin(), neighborhood.end(), weight_func) < n_min) {
113 _DBSCAN_PRIVATE::expand_cluster(first, last, it, distance_func, epsilon, n_min, id_cache, ++current_cluster_id, weight_func);
117 std::copy(id_cache.begin(), id_cache.end(), result);
119 return current_cluster_id;
125 template<
typename INPUT_ITERATOR,
typename DISTANCE_FUNC,
typename OUTPUT_ITERATOR>
126 int DBSCAN(
const INPUT_ITERATOR first,
const INPUT_ITERATOR last, DISTANCE_FUNC distance_func,
127 OUTPUT_ITERATOR result,
const double epsilon,
const double n_min) {
128 return DBSCAN(first, last, distance_func, result, epsilon, n_min,
typename _DBSCAN_PRIVATE::constant_1<typename INPUT_ITERATOR::value_type>());
Namespace providing different geometric functions concerning angles.