mmcfilters
Public API documentation
Loading...
Searching...
No Matches
NodeDistanceField.hpp
1#pragma once
2
3#include "DistanceTransformTypes.hpp"
4
5#include <cstdint>
6#include <span>
7#include <stdexcept>
8#include <utility>
9#include <vector>
10
11namespace mmcfilters {
12
15 public:
25 NodeDistanceField(NodeId node, int rows, int columns, DistanceTransformAccuracy accuracy, std::vector<PixelId> supportPixels,
26 std::vector<std::int64_t> squaredDistances)
29 if (node < 0 || rows <= 0 || columns <= 0 || (accuracy != DistanceTransformAccuracy::Exact && accuracy != DistanceTransformAccuracy::Approximate) ||
30 supportPixels_.empty() || supportPixels_.size() != squaredDistances_.size()) {
31 throw std::invalid_argument("NodeDistanceField requires a live node and matching non-empty sample arrays.");
32 }
33 const std::size_t domainSize = static_cast<std::size_t>(rows_) * static_cast<std::size_t>(columns_);
34 for (std::size_t index = 0; index < supportPixels_.size(); ++index) {
35 if (supportPixels_[index] < 0 || static_cast<std::size_t>(supportPixels_[index]) >= domainSize || squaredDistances_[index] < 0) {
36 throw std::invalid_argument("NodeDistanceField samples must belong to the domain and have non-negative squared distances.");
37 }
38 }
39 }
40
44 [[nodiscard]] int rows() const noexcept { return rows_; }
46 [[nodiscard]] int columns() const noexcept { return columns_; }
48 [[nodiscard]] DistanceTransformAccuracy accuracy() const noexcept { return accuracy_; }
50 [[nodiscard]] std::size_t size() const noexcept { return supportPixels_.size(); }
52 [[nodiscard]] std::span<const PixelId> supportPixels() const noexcept { return supportPixels_; }
54 [[nodiscard]] std::span<const std::int64_t> squaredDistances() const noexcept { return squaredDistances_; }
55
61 [[nodiscard]] std::vector<std::int64_t> denseSquaredDistances(std::int64_t outsideValue = -1) const {
62 const std::size_t domainSize = static_cast<std::size_t>(rows_) * static_cast<std::size_t>(columns_);
63 std::vector<std::int64_t> dense(domainSize, outsideValue);
64 for (std::size_t index = 0; index < supportPixels_.size(); ++index) {
65 dense[static_cast<std::size_t>(supportPixels_[index])] = squaredDistances_[index];
66 }
67 return dense;
68 }
69
71 private:
73 int rows_ = 0;
74 int columns_ = 0;
75 DistanceTransformAccuracy accuracy_ = DistanceTransformAccuracy::Exact;
76 std::vector<PixelId> supportPixels_;
77 std::vector<std::int64_t> squaredDistances_;
79};
80
81} // namespace mmcfilters
constexpr NodeId InvalidNode
Sentinel value used to denote an invalid node identifier.
Definition Common.hpp:34
Self-contained compact per-pixel distance field for one live node.
NodeId node() const noexcept
Returns the represented live internal node id.
std::vector< std::int64_t > denseSquaredDistances(std::int64_t outsideValue=-1) const
Returns a full-domain row-major field with outsideValue off support.
DistanceTransformAccuracy accuracy() const noexcept
Returns the numerical backend used to produce the field.
std::size_t size() const noexcept
Returns the number of compact support samples.
int columns() const noexcept
Returns the original domain width.
int rows() const noexcept
Returns the original domain height.
NodeDistanceField(NodeId node, int rows, int columns, DistanceTransformAccuracy accuracy, std::vector< PixelId > supportPixels, std::vector< std::int64_t > squaredDistances)
Constructs a self-contained compact node field.
std::span< const PixelId > supportPixels() const noexcept
Returns the row-major support pixel ids.
std::span< const std::int64_t > squaredDistances() const noexcept
Returns squared distances aligned with supportPixels().
Owning result for one computed scalar attribute layout and buffer.