FCP parts: mesh vs point cloud

fcp v5.2 (cuda), defaults: 1024 atoms, 128 layers, parts="tracked-fit", fit_tol="auto"; sliced upright: up = the world axis each object stands on (+z for all). Point clouds: 200,000 points sampled uniformly on the source mesh (seed 0, no noise). Errors: symmetric nearest-point distance between 50k samples of the source and of the decoded mesh, over the source's bounding-box diagonal. Generated 2026-10-27 21:56 by scripts/parts_report.py.

Studies: SYNTHESIS GWN speed thin walls final gallery full gallery analysis: A vs B middle slices: A vs B parts clean 10000 noisy slices bowl gso 10k slices loaf pan 10k bowl gso 10k refined loaf pan 10k refined bowl of 10k bowl of 10k refined loaf pan 107-115 refinement splits dino

1. Parts per encoding

"point test" (prototype, scripts/pointfit.py, package untouched): a piece of a track stays whole when, at every layer, one height fit's ring is within 2 spacings (p95) of the slicer's ring in explaining the layer's points, and the fitted ring lies on the points within the same margin (both directions). Where to cut and the minimum piece length are the package's.

Red: a point-cloud encoding with more than 1.5× the parts of the same object's mesh encoding. "short": parts spanning ≤ 3 layers. spacing and fit_tol are in canonical units, from the descriptor's provenance.

objectinputupwatertightpartsholesshortmedian span bytesspacingfit_tolencode smean/diagp95/diag
battery_steppedmesh+zyes400145630.710.003290.00627
battery_steppedpoints 200k+zyes5001662120.47220.690.003310.00627
battery_steppedpoints 200k, point test+zyes4001562090.47223.390.003350.00629
dressmesh+zyes17001362480.180.002190.00417
dresspoints 200k+zyes2303962660.30690.011080.640.002350.00464
dresspoints 200k, point test+zyes18031062510.30690.011082.620.002340.00467
elephantmesh+zyes27311662780.180.004100.00839
elephantpoints 200k+zyes2828662810.90390.690.004140.00842
elephantpoints 200k, point test+zyes2628562750.90393.460.004070.00827
bowl_ofmesh+zyes5201962120.060.002630.00512
bowl_ofpoints 200k+zyes6211362150.45040.800.002630.00512
bowl_ofpoints 200k, point test+zyes6211362150.45045.620.002630.00512
bowl_gsomesh+zyes6201062150.060.002620.00508
bowl_gsopoints 200k+zyes5202162120.63450.870.002630.00505
bowl_gsopoints 200k, point test+zyes5202162120.63456.190.002630.00505
mugmesh+zyes8202262210.060.002920.00565
mugpoints 200k+zyes8212262210.55880.760.002920.00564
mugpoints 200k, point test+zyes8212262210.55885.050.002920.00564
dinomesh+zyes2505962720.070.002230.00416
dinopoints 200k+zyes4005863170.48020.790.002630.00523
dinopoints 200k, point test+zyes2805862810.48023.500.002560.00514
shoemesh+zyes2254962630.090.002990.00557
shoepoints 200k+zyes2855762810.73190.860.003120.00584
shoepoints 200k, point test+zyes2875662810.73195.170.003110.00583
loaf_panmesh+zyes720662180.080.002950.00551
loaf_panpoints 200k+zyes830562210.8930.830.002980.00555
loaf_panpoints 200k, point test+zyes720562180.8935.840.002990.00556
horsemesh+zyes1804862510.070.002170.00398
horsepoints 200k+zyes2404962690.46210.740.002280.00419
horsepoints 200k, point test+zyes2004862570.46213.580.002270.00420

2. Renders

Canonical frame, orthographic, height axis z up (layer 0 at the bottom). Left: rings of every part seen along +y (x right; one colour per part, holes dashed; tall parts thinned to ~40 rings). Then the decoded mesh along +y (x-z) and along -x (y-z), each face coloured by the part whose rings are nearest (matplotlib: expect some depth-sorting artefacts). Right: each part's span of layers (holes hatched).

battery_stepped

mesh: 4 parts, 0 holes, 0 parts of ≤ 3 layers

points 200k: 5 parts, 0 holes, 0 parts of ≤ 3 layers

points 200k, point test: 4 parts, 0 holes, 0 parts of ≤ 3 layers

dress

mesh: 17 parts, 0 holes, 0 parts of ≤ 3 layers

points 200k: 23 parts, 0 holes, 3 parts of ≤ 3 layers

points 200k, point test: 18 parts, 0 holes, 3 parts of ≤ 3 layers

elephant

mesh: 27 parts, 3 holes, 11 parts of ≤ 3 layers

points 200k: 28 parts, 2 holes, 8 parts of ≤ 3 layers

points 200k, point test: 26 parts, 2 holes, 8 parts of ≤ 3 layers

bowl_of

mesh: 5 parts, 2 holes, 0 parts of ≤ 3 layers

points 200k: 6 parts, 2 holes, 1 parts of ≤ 3 layers

points 200k, point test: 6 parts, 2 holes, 1 parts of ≤ 3 layers

bowl_gso

mesh: 6 parts, 2 holes, 0 parts of ≤ 3 layers

points 200k: 5 parts, 2 holes, 0 parts of ≤ 3 layers

points 200k, point test: 5 parts, 2 holes, 0 parts of ≤ 3 layers

mug

mesh: 8 parts, 2 holes, 0 parts of ≤ 3 layers

points 200k: 8 parts, 2 holes, 1 parts of ≤ 3 layers

points 200k, point test: 8 parts, 2 holes, 1 parts of ≤ 3 layers

dino

mesh: 25 parts, 0 holes, 5 parts of ≤ 3 layers

points 200k: 40 parts, 0 holes, 5 parts of ≤ 3 layers

points 200k, point test: 28 parts, 0 holes, 5 parts of ≤ 3 layers

shoe

mesh: 22 parts, 5 holes, 4 parts of ≤ 3 layers

points 200k: 28 parts, 5 holes, 5 parts of ≤ 3 layers

points 200k, point test: 28 parts, 7 holes, 5 parts of ≤ 3 layers

loaf_pan

mesh: 7 parts, 2 holes, 0 parts of ≤ 3 layers

points 200k: 8 parts, 3 holes, 0 parts of ≤ 3 layers

points 200k, point test: 7 parts, 2 holes, 0 parts of ≤ 3 layers

horse

mesh: 18 parts, 0 holes, 4 parts of ≤ 3 layers

points 200k: 24 parts, 0 holes, 4 parts of ≤ 3 layers

points 200k, point test: 20 parts, 0 holes, 4 parts of ≤ 3 layers