ReUseX  0.0.5
3D Point Cloud Processing for Building Reuse
Loading...
Searching...
No Matches
reusex::geometry::PlaneGraphOptions Struct Reference

Parameters for plane-landmark pose-graph optimization. More...

#include <PlaneGraphOptimizer.hpp>

Collaboration diagram for reusex::geometry::PlaneGraphOptions:

Public Attributes

int max_planes_per_frame = 6
 keep at most this many planes per frame
int min_plane_inliers = 120
 reject planes with fewer inliers
float ransac_distance = 0.02f
 inlier point-to-plane distance (m)
float ransac_normal_angle = 20.f
 inlier normal agreement threshold (deg)
int ransac_iterations = 200
 RANSAC hypotheses per plane.
float assoc_normal_angle = 10.f
 max normal angle to merge (deg)
float assoc_distance = 0.10f
 max plane-offset difference to merge (m)
int min_landmark_observations
 landmark must be seen by >= this many frames
float assoc_overlap_margin = 0.30f
 Overlap gate: two observations may only merge into the same landmark if their in-plane footprints overlap.
float min_landmark_spread_ratio = 0.05f
 Reject landmarks whose observation inlier-centroids are near-collinear: if the second singular value of the centroid scatter is below this fraction of the first, the observations pin only a line, leaving a rotational DoF about that line unconstrained.
int assoc_rounds = 2
 Number of (associate at current poses -> optimize -> refit) rounds.
float assoc_round_tol = 0.02f
 stop rounds when max pose shift < this (m)
float odometry_sigma_rot = 0.005f
 odometry rotation std (rad)
float odometry_sigma_trans = 0.01f
 odometry translation std (m)
float underconstrained_odom_scale = 0.25f
 Observability guard: a frame whose landmark observations span fewer than two independent normal directions is under-constrained by planes along the missing directions.
OdometryNoiseModel odometry_noise_model = OdometryNoiseModel::fixed
 Which per-edge noise model weights the odometry factors (#225).
float odometry_weight_min = 0.5f
 min per-edge sigma scale (motion)
float odometry_weight_max = 3.0f
 max per-edge sigma scale (motion)
bool odometry_robust = false
 Let GNC down-weight individual odometry edges instead of registering every one as a known inlier.
float odometry_gnc_inlier_cost = 8.41f
 GNC-TLS inlier threshold for odometry factors when odometry_robust is set.
float plane_sigma_normal = 0.24f
 plane-normal measurement std (rad)
float plane_sigma_distance = 0.19f
 plane-distance measurement std (m)
PlaneNoiseModel plane_noise_model = PlaneNoiseModel::inlier_count
 Which per-observation noise model weights the plane factors.
float plane_weight_min = 0.5f
 Clamp on the per-observation sigma scale, applied to whichever model is selected.
float plane_weight_max = 3.0f
 max sigma scale (weakest planes)
float plane_sigma_scale = 1.0f
 Global multiplier on BOTH plane sigmas, i.e.
bool use_plane_factors = true
 Build the graph WITHOUT any plane factors — the plane_sigma_scale -> infinity limit, taken exactly.
float prior_sigma_rot = 0.001f
 first-pose gauge prior rotation std (rad)
float prior_sigma_trans
 first-pose gauge prior translation std (m)
bool use_gnc = true
 wrap LM in Graduated Non-Convexity
float gnc_inlier_cost = 5.67f
 GNC TLS inlier threshold on the factor error (0.5 * whitened squared residual).
int max_iterations = 100
 LM (inner) iteration cap.
unsigned seed = 42
 RANSAC seed (STANDARDS.md §6).
SurfelExtractionParams surfel {.sampling_factor = 6}
 Surfel extraction settings.
LoopClosureOptions loop_closure
 P2 wide-baseline loop closure (off by default).
PanoramaLoopOptions panorama_loops
 Panorama-derived wide-baseline loop edges (issue #236; off by default, --use-panoramas).
bool loop_edges_trusted = false
 How loop-edge factors are treated by the solver: false (default, SAFE): loop edges are ordinary GNC candidates under the shared gnc_inlier_cost threshold — a wrong edge is down-weighted.
float loop_trust_inlier_cost = 200.0f
 GNC-TLS inlier threshold applied ONLY to loop-edge factors when loop_edges_trusted is set (same units as gnc_inlier_cost: 0.5 * whitened squared residual).
std::string loop_edges_file
 Optional path to a JSON file of externally-computed loop edges (schema "reusex.loop_edges.v1"; see load_loop_edges).
double loop_edges_min_seed_disagreement = 0.0
 Seed-disagreement gate for the external (loop_edges_file) edges, mirroring LoopClosureOptions::min_seed_disagreement for the internal path: keep an external edge only if its relative translation disagrees with the seed poses by at least this (m).
double loop_edges_min_seed_disagreement_fraction = 0.0278
 Scale-relative seed-disagreement gate for external edges, as a fraction of the seed trajectory's extent (#339).

Detailed Description

Parameters for plane-landmark pose-graph optimization.

All defaults live here (STANDARDS.md §4); CLI flags mirror them.

Definition at line 172 of file PlaneGraphOptimizer.hpp.

Member Data Documentation

◆ assoc_distance

float reusex::geometry::PlaneGraphOptions::assoc_distance = 0.10f

max plane-offset difference to merge (m)

Definition at line 185 of file PlaneGraphOptimizer.hpp.

◆ assoc_normal_angle

float reusex::geometry::PlaneGraphOptions::assoc_normal_angle = 10.f

max normal angle to merge (deg)

Definition at line 184 of file PlaneGraphOptimizer.hpp.

◆ assoc_overlap_margin

float reusex::geometry::PlaneGraphOptions::assoc_overlap_margin = 0.30f

Overlap gate: two observations may only merge into the same landmark if their in-plane footprints overlap.

The in-plane gap between their inlier centroids must be below (sum of the two footprint radii + this margin). This is what stops two distinct offset/disjoint parallel walls that happen to agree in normal+offset (aliasing) from collapsing into one landmark. <= 0 disables the overlap check (pure normal+offset gating, legacy).

Definition at line 194 of file PlaneGraphOptimizer.hpp.

◆ assoc_round_tol

float reusex::geometry::PlaneGraphOptions::assoc_round_tol = 0.02f

stop rounds when max pose shift < this (m)

Definition at line 210 of file PlaneGraphOptimizer.hpp.

◆ assoc_rounds

int reusex::geometry::PlaneGraphOptions::assoc_rounds = 2

Number of (associate at current poses -> optimize -> refit) rounds.

One round reproduces the original one-shot behaviour; 2-3 rounds let landmarks re-form on the improved poses (EM-style), which recovers drift the greedy one-shot association aliases away. Rounds stop early once the pose update of a round falls below assoc_round_tol. Two rounds is the tuned default (best office flatness at cm-level shift without regressing MuSHRoom GT).

Definition at line 209 of file PlaneGraphOptimizer.hpp.

◆ gnc_inlier_cost

float reusex::geometry::PlaneGraphOptions::gnc_inlier_cost = 5.67f

GNC TLS inlier threshold on the factor error (0.5 * whitened squared residual).

gtsam's default of 1.0 rejects exactly the informative (drifted) plane observations this stage exists to exploit; the default here is the chi-square 99% quantile for a 3-DoF measurement / 2 (11.345 / 2), so only genuinely wrong associations are down-weighted.

Definition at line 339 of file PlaneGraphOptimizer.hpp.

◆ loop_closure

LoopClosureOptions reusex::geometry::PlaneGraphOptions::loop_closure

P2 wide-baseline loop closure (off by default).

When enabled, optimize_sensor_poses detects loop edges from the RGB-D frames and feeds them into the same GNC graph as robust BetweenFactor<Pose3> constraints.

Definition at line 354 of file PlaneGraphOptimizer.hpp.

◆ loop_edges_file

std::string reusex::geometry::PlaneGraphOptions::loop_edges_file

Optional path to a JSON file of externally-computed loop edges (schema "reusex.loop_edges.v1"; see load_loop_edges).

Empty = none. These are the license-clean bridge for learned matchers (XFeat / EfficientLoFTR / MapAnything, or an offline MASt3R ceiling oracle): the external edges are UNIONED with any internally-detected ORB edges (–loop-closure) and fed into the SAME GNC graph, so a wrong external edge is handled by the same robustness as an ORB one. Concretely, optimize_sensor_poses() applies to the file's edges: the loop_edges_min_seed_disagreement gate, a (i,j) dedup against the internal edges (one pair, one factor), PCM over the UNION when loop_closure.pcm is set (--loop-no-pcm turns it off for BOTH sources), and finally GNC in the solver. Works independently of loop_closure.enable. loop_edges_trusted applies to these too — which is precisely why the PCM step is not optional in practice: a trusted edge gets the generous loop_trust_inlier_cost threshold, so consistency filtering is the main defence left against a matcher false positive.

Definition at line 406 of file PlaneGraphOptimizer.hpp.

◆ loop_edges_min_seed_disagreement

double reusex::geometry::PlaneGraphOptions::loop_edges_min_seed_disagreement = 0.0

Seed-disagreement gate for the external (loop_edges_file) edges, mirroring LoopClosureOptions::min_seed_disagreement for the internal path: keep an external edge only if its relative translation disagrees with the seed poses by at least this (m).

Redundant edges that already agree with the seed carry no drift-correction information and only inject matcher+depth noise into already-correct poses (measured: honka laser-GT F 0.7958 -> 0.62 when 1336 redundant edges were applied ungated). Dropping them makes the bridge a no-op on a well-posed scan while keeping every large-drift edge. This field is the ABSOLUTE FLOOR of that gate; the gate applied is max(loop_edges_min_seed_disagreement_fraction * trajectory_extent, loop_edges_min_seed_disagreement) — see geometry::seed_disagreement_gate. Both 0 disables the gate (apply every external edge).

The floor defaults to 0 because, unlike the internal ORB path, this gate's historical 0.50 m value was never a noise floor: it was a DRIFT threshold measured on one 18 m scan (office 16.66 m of drift, NewOffice >20 m), and issue #339 is exactly the bill for that. It is kept as an option so an absolute gate can still be pinned when a capture's scale is known.

Definition at line 426 of file PlaneGraphOptimizer.hpp.

◆ loop_edges_min_seed_disagreement_fraction

double reusex::geometry::PlaneGraphOptions::loop_edges_min_seed_disagreement_fraction = 0.0278

Scale-relative seed-disagreement gate for external edges, as a fraction of the seed trajectory's extent (#339).

Default 0.0278 reproduces the historical 0.50 m on the office scan (0.0278 * 18.01 m = 0.501 m, which keeps all 163 of its drift edges) while scaling down to 0.05 m on a 1.8 m ARKitScenes room scan — the setting measured in §9.4 to avoid the F@50mm 0.29 collapse the absolute 0.50 m gate produced there by admitting only the most-disagreeing (wrong) edges. Set 0 to use the floor alone.

Definition at line 434 of file PlaneGraphOptimizer.hpp.

◆ loop_edges_trusted

bool reusex::geometry::PlaneGraphOptions::loop_edges_trusted = false

How loop-edge factors are treated by the solver: false (default, SAFE): loop edges are ordinary GNC candidates under the shared gnc_inlier_cost threshold — a wrong edge is down-weighted.

But GNC also zeros a genuine LARGE-drift edge (its residual at the drifted seed looks like an outlier), so this rarely applies big corrections. Good when loops are near the seed estimate. true (AGGRESSIVE): loop edges keep their own, far more generous GNC inlier threshold (loop_trust_inlier_cost) instead of the shared gnc_inlier_cost, so a genuine large-drift correction stays an inlier and actually flows — while an edge whose residual exceeds even that generous threshold is still truncated by GNC-TLS, bounding a grossly-wrong edge's influence. Under use_gnc == false (plain LM) there is no GNC machinery, so trusted loop edges instead get a Huber kernel for the same bounded-influence effect. Still needs a discriminative matcher / PCM to be safe, and looser odometry (odometry_sigma_trans) so the drift can redistribute.

Definition at line 380 of file PlaneGraphOptimizer.hpp.

◆ loop_trust_inlier_cost

float reusex::geometry::PlaneGraphOptions::loop_trust_inlier_cost = 200.0f

GNC-TLS inlier threshold applied ONLY to loop-edge factors when loop_edges_trusted is set (same units as gnc_inlier_cost: 0.5 * whitened squared residual).

Deliberately generous — at the default LoopClosureOptions sigmas (0.10 m / 0.05 rad) this admits roughly 2 m of translational drift correction as an inlier — but FINITE, which is the point: a 10x-worse edge lands far above it and is truncated to zero weight. Note that GTSAM's GncOptimizer strips noiseModel::Robust wrappers from every factor it is given, so a per-factor threshold is the only way to bound a loop edge under GNC.

Definition at line 390 of file PlaneGraphOptimizer.hpp.

◆ max_iterations

int reusex::geometry::PlaneGraphOptions::max_iterations = 100

LM (inner) iteration cap.

Definition at line 340 of file PlaneGraphOptimizer.hpp.

◆ max_planes_per_frame

int reusex::geometry::PlaneGraphOptions::max_planes_per_frame = 6

keep at most this many planes per frame

Definition at line 177 of file PlaneGraphOptimizer.hpp.

◆ min_landmark_observations

int reusex::geometry::PlaneGraphOptions::min_landmark_observations
Initial value:
=
4

landmark must be seen by >= this many frames

Definition at line 186 of file PlaneGraphOptimizer.hpp.

◆ min_landmark_spread_ratio

float reusex::geometry::PlaneGraphOptions::min_landmark_spread_ratio = 0.05f

Reject landmarks whose observation inlier-centroids are near-collinear: if the second singular value of the centroid scatter is below this fraction of the first, the observations pin only a line, leaving a rotational DoF about that line unconstrained.

Such landmarks are dropped from the graph. <= 0 disables the degeneracy check.

Definition at line 200 of file PlaneGraphOptimizer.hpp.

◆ min_plane_inliers

int reusex::geometry::PlaneGraphOptions::min_plane_inliers = 120

reject planes with fewer inliers

Definition at line 178 of file PlaneGraphOptimizer.hpp.

◆ odometry_gnc_inlier_cost

float reusex::geometry::PlaneGraphOptions::odometry_gnc_inlier_cost = 8.41f

GNC-TLS inlier threshold for odometry factors when odometry_robust is set.

Odometry is a 6-DoF measurement, so the analogue of the plane term's chi-square 99% / 2 is chi2(6, 0.99) / 2 = 16.81 / 2.

Definition at line 252 of file PlaneGraphOptimizer.hpp.

◆ odometry_noise_model

OdometryNoiseModel reusex::geometry::PlaneGraphOptions::odometry_noise_model = OdometryNoiseModel::fixed

Which per-edge noise model weights the odometry factors (#225).

The default is fixed, and the measurement is why — the odometry sweep on the three ARKitScenes GT scans falsified the standing hypothesis that rux optimize regresses drifting captures because it over-trusts the drifted seed. Loosening odometry uniformly makes absolute GT accuracy monotonically WORSE on every scan (41069048 F@50mm 0.8512 at the default, 0.4565 at 10x looser, 0.2346 at 100x), while tightening it 10x moves the result back TOWARD the no-pose-stage baseline (0.8802 vs 0.8917). The odometry chain is the accurate part of this graph; the plane term is what costs absolute accuracy on these captures.

Definition at line 236 of file PlaneGraphOptimizer.hpp.

◆ odometry_robust

bool reusex::geometry::PlaneGraphOptions::odometry_robust = false

Let GNC down-weight individual odometry edges instead of registering every one as a known inlier.

Default false, again because it was measured rather than assumed: the premise ("a grossly-wrong seed edge should be demotable") is sound in principle, but on captures whose drift accumulates smoothly there is no single wrong edge to demote — the error is spread evenly over thousands of individually-good relative measurements. Turning it on therefore just removes constraints, which the sigma sweep already showed to be harmful.

Definition at line 248 of file PlaneGraphOptimizer.hpp.

◆ odometry_sigma_rot

float reusex::geometry::PlaneGraphOptions::odometry_sigma_rot = 0.005f

odometry rotation std (rad)

Definition at line 217 of file PlaneGraphOptimizer.hpp.

◆ odometry_sigma_trans

float reusex::geometry::PlaneGraphOptions::odometry_sigma_trans = 0.01f

odometry translation std (m)

Definition at line 218 of file PlaneGraphOptimizer.hpp.

◆ odometry_weight_max

float reusex::geometry::PlaneGraphOptions::odometry_weight_max = 3.0f

max per-edge sigma scale (motion)

Definition at line 238 of file PlaneGraphOptimizer.hpp.

◆ odometry_weight_min

float reusex::geometry::PlaneGraphOptions::odometry_weight_min = 0.5f

min per-edge sigma scale (motion)

Definition at line 237 of file PlaneGraphOptimizer.hpp.

◆ panorama_loops

PanoramaLoopOptions reusex::geometry::PlaneGraphOptions::panorama_loops

Panorama-derived wide-baseline loop edges (issue #236; off by default, --use-panoramas).

A 360 panorama is resected INDEPENDENTLY against each frame it matches, in that frame's own optical coordinates, so the relative pose it implies between two frames is a genuine measurement rather than a restatement of the drifted seed trajectory. The resulting edges are the same LoopEdge type, gated by the same loop_closure knobs (min_frame_gap, min/max seed disagreement), PCM-filtered as part of the UNION with the other sources, and solved in the same GNC graph.

Definition at line 363 of file PlaneGraphOptimizer.hpp.

◆ plane_noise_model

PlaneNoiseModel reusex::geometry::PlaneGraphOptions::plane_noise_model = PlaneNoiseModel::inlier_count

Which per-observation noise model weights the plane factors.

The default is deliberately inlier_count, not the newer, physically better-motivated fit_geometry — because the measurement says so, and the measurement says something more interesting than "one model wins":

  • On scans whose seed poses genuinely DRIFT (ARKitScenes 41069048 / 41069050 / 41069051, absolute 3dod_mesh GT), fit_geometry beats inlier_count on every metric of every scan — GT F +0.8% / +1.9% / +5.2%, median accuracy error -5.6% / -12.7% / -7.8%.
  • On a scan that does NOT drift (MuSHRoom honka, Faro laser GT), it is worse, and worse than running no pose stage at all (F 0.7572 baseline, 0.7595 inlier_count, 0.7523 fit_geometry).

That is the same lesson the loop-closure front-end learned (#225, PR #237): machinery that redistributes authority toward strong geometric evidence pays off exactly when the seed trajectory is wrong, and costs when it is already right. So fit_geometry ships as an opt-in lever for drifting captures rather than a new default, and the default remains bit-identical to what shipped in #228 — zero regression on the guard scan.

Definition at line 276 of file PlaneGraphOptimizer.hpp.

◆ plane_sigma_distance

float reusex::geometry::PlaneGraphOptions::plane_sigma_distance = 0.19f

plane-distance measurement std (m)

Definition at line 254 of file PlaneGraphOptimizer.hpp.

◆ plane_sigma_normal

float reusex::geometry::PlaneGraphOptions::plane_sigma_normal = 0.24f

plane-normal measurement std (rad)

Definition at line 253 of file PlaneGraphOptimizer.hpp.

◆ plane_sigma_scale

float reusex::geometry::PlaneGraphOptions::plane_sigma_scale = 1.0f

Global multiplier on BOTH plane sigmas, i.e.

the plane term's authority relative to the odometry chain and the gauge prior. The plane term's contribution to the objective scales as 1 / plane_sigma_scale^2, so values > 1 weaken it and values < 1 strengthen it. 1.0 is the shipped calibration and is bit-identical to not passing the knob.

It exists as one dimension rather than as "remember to scale both `plane_sigma_normal` and `plane_sigma_distance` by the same factor", because the question it answers — is there a plane-term weight that is optimal against absolute GT? — is one-dimensional (#225 §9). Note it is NOT exactly equivalent to inversely scaling the odometry sigmas: the GNC TLS threshold gnc_inlier_cost is applied to the whitened plane residual, so changing the plane sigmas also changes which observations GNC classifies as outliers, whereas changing odometry sigmas does not.

Definition at line 318 of file PlaneGraphOptimizer.hpp.

◆ plane_weight_max

float reusex::geometry::PlaneGraphOptions::plane_weight_max = 3.0f

max sigma scale (weakest planes)

Definition at line 303 of file PlaneGraphOptimizer.hpp.

◆ plane_weight_min

float reusex::geometry::PlaneGraphOptions::plane_weight_min = 0.5f

Clamp on the per-observation sigma scale, applied to whichever model is selected.

Both models are normalised by their median over the run, so a scale of 1.0 is a median-quality observation, plane_weight_min is the most authority any single observation may earn and plane_weight_max the least. The clamp is what stops one exceptionally clean (or exceptionally bad) detection from dominating the solve.

The right range depends on the model, because the two have very different dynamic range, and the defaults below belong to the DEFAULT model (inlier_count). Its scale varies only as sqrt(N), spans roughly one order of magnitude, and [0.5, 3.0] barely binds.

fit_geometry additionally divides by the in-plane extent, which enters linearly and varies far more across detections, so the same range is far too narrow for it: measured, 62% of office-scan observations saturated [0.5, 3.0], degrading the model into a near-binary weighting that scored WORSE than the legacy one (office flatness 13.03 mm vs 11.72 mm). Office flatness improves monotonically as the range widens to about [0.10, 15] (11.66 mm), turns back over past that, and the clamp stops binding entirely near [0.05, 30].

So --plane-noise fit should be paired with --plane-weight-min 0.10 --plane-weight-max 15. Forgetting to is not silent: the optimizer warns at run time, with the numbers, when the clamp rather than the fit quality is setting most weights (STANDARDS §5). min sigma scale (strongest planes)

Definition at line 302 of file PlaneGraphOptimizer.hpp.

◆ prior_sigma_rot

float reusex::geometry::PlaneGraphOptions::prior_sigma_rot = 0.001f

first-pose gauge prior rotation std (rad)

Definition at line 328 of file PlaneGraphOptimizer.hpp.

◆ prior_sigma_trans

float reusex::geometry::PlaneGraphOptions::prior_sigma_trans
Initial value:
=
0.001f

first-pose gauge prior translation std (m)

Definition at line 329 of file PlaneGraphOptimizer.hpp.

◆ ransac_distance

float reusex::geometry::PlaneGraphOptions::ransac_distance = 0.02f

inlier point-to-plane distance (m)

Definition at line 179 of file PlaneGraphOptimizer.hpp.

◆ ransac_iterations

int reusex::geometry::PlaneGraphOptions::ransac_iterations = 200

RANSAC hypotheses per plane.

Definition at line 181 of file PlaneGraphOptimizer.hpp.

◆ ransac_normal_angle

float reusex::geometry::PlaneGraphOptions::ransac_normal_angle = 20.f

inlier normal agreement threshold (deg)

Definition at line 180 of file PlaneGraphOptimizer.hpp.

◆ seed

unsigned reusex::geometry::PlaneGraphOptions::seed = 42

RANSAC seed (STANDARDS.md §6).

Definition at line 341 of file PlaneGraphOptimizer.hpp.

◆ surfel

SurfelExtractionParams reusex::geometry::PlaneGraphOptions::surfel {.sampling_factor = 6}

Surfel extraction settings.

sampling_factor is overridden to 6 (denser than the shared SurfelExtractionParams default of 8, which rux register relies on): the "mid-density" surfels this stage was tuned on. Overriding it here — rather than in SurfelExtractionParams or in apps/rux — keeps a single source of truth for the plane-graph default (STANDARDS.md §4) without changing what the registration stage extracts.

Definition at line 349 of file PlaneGraphOptimizer.hpp.

◆ underconstrained_odom_scale

float reusex::geometry::PlaneGraphOptions::underconstrained_odom_scale = 0.25f

Observability guard: a frame whose landmark observations span fewer than two independent normal directions is under-constrained by planes along the missing directions.

Its two odometry factors (to prev/next frame) get their sigmas multiplied by this factor (< 1 tightens them) so the trusted odometry holds the trajectory where planes cannot. 1.0 disables the guard.

Definition at line 224 of file PlaneGraphOptimizer.hpp.

◆ use_gnc

bool reusex::geometry::PlaneGraphOptions::use_gnc = true

wrap LM in Graduated Non-Convexity

Definition at line 333 of file PlaneGraphOptimizer.hpp.

◆ use_plane_factors

bool reusex::geometry::PlaneGraphOptions::use_plane_factors = true

Build the graph WITHOUT any plane factors — the plane_sigma_scale -> infinity limit, taken exactly.

Plane detection, association and landmark hygiene still run (so the reported statistics stay comparable), but no OrientedPlane3Factor and no landmark variable enters the graph, leaving odometry + the frame-0 gauge prior. The solve is then a no-op on the seed trajectory, which is exactly what makes it useful: it is the measurable "plane term off" endpoint of a weight sweep, and a check that the harness reproduces the no-pose-stage baseline through the full pipeline.

Definition at line 327 of file PlaneGraphOptimizer.hpp.


The documentation for this struct was generated from the following file: