MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ radius_threshold_graph()

MAYAFLUX_API EdgeList MayaFlux::Kinesis::radius_threshold_graph ( const Eigen::MatrixXd &  points,
double  radius 
)

Compute radius threshold graph.

Parameters
pointsDx N matrix where each column is a point
radiusMaximum connection distance
Returns
Edge list (point index pairs)

Connects all point pairs within radius distance. Undirected graph: if (i,j) exists, edge appears once.

Complexity: O(n²) brute force

Definition at line 307 of file ProximityGraphs.cpp.

310{
311 const auto n = static_cast<size_t>(points.cols());
312 if (n < 2) {
313 return {};
314 }
315
316 const double radius_sq = radius * radius;
317 const auto dim = static_cast<size_t>(points.rows());
318 const double* base = points.data();
319
320 std::vector<size_t> offsets(n + 1, 0);
321
322 P::for_each(P::par_unseq,
323 std::views::iota(size_t { 0 }, n).begin(),
324 std::views::iota(size_t { 0 }, n).end(),
325 [&](size_t i) {
326 const double* pi = base + i * dim;
327 size_t count = 0;
328 for (size_t j = i + 1; j < n; ++j) {
329 if (dist_sq(pi, base + j * dim, dim) <= radius_sq) {
330 ++count;
331 }
332 }
333 offsets[i + 1] = count;
334 });
335
336 for (size_t i = 0; i < n; ++i) {
337 offsets[i + 1] += offsets[i];
338 }
339
340 EdgeList edges(offsets[n]);
341
342 P::for_each(P::par_unseq,
343 std::views::iota(size_t { 0 }, n).begin(),
344 std::views::iota(size_t { 0 }, n).end(),
345 [&](size_t i) {
346 const double* pi = base + i * dim;
347 size_t at = offsets[i];
348 for (size_t j = i + 1; j < n; ++j) {
349 if (dist_sq(pi, base + j * dim, dim) <= radius_sq) {
350 edges[at++] = { i, j };
351 }
352 }
353 });
354
355 MF_DEBUG(Journal::Component::Kinesis, Journal::Context::Runtime,
356 "radius_threshold_graph: {} points, radius={:.3f}, generated {} edges",
357 n, radius, edges.size());
358
359 return edges;
360}
#define MF_DEBUG(comp, ctx,...)
std::vector< glm::vec2 > * points
float radius
size_t count
std::vector< std::pair< size_t, size_t > > EdgeList
auto at(const B &anchor, F &&factory, Args &&... args) -> decltype(std::forward< F >(factory)(Kinesis::bounds_of(anchor), std::forward< Args >(args)...))
Call a bounds-taking factory with an anchor's region.
Definition Geometry.hpp:152

References count, MayaFlux::Journal::Kinesis, MF_DEBUG, points, radius, and MayaFlux::Journal::Runtime.

Referenced by generate_proximity_graph().

+ Here is the caller graph for this function: