| 21 | { |
| 22 | |
| 23 | DistanceVolumeCreationParams getDistanceFieldParams( const Box3f& bbox, const ParametersMetric& params ) |
| 24 | { |
| 25 | const auto box = bbox.expanded( Vector3f::diagonal( params.offset + params.dist.maxWeight ) ); |
| 26 | const auto [origin, dimensions] = calcOriginAndDimensions( box, params.voxelSize ); |
| 27 | const auto minDist = params.offset - params.numLayers * params.voxelSize; |
| 28 | const auto maxDist = params.offset + params.numLayers * params.voxelSize; |
| 29 | |
| 30 | // bidirDist = abs( dist + w ) - w |
| 31 | const auto maxBidirDist = std::max( std::abs( maxDist + params.dist.maxWeight ), |
| 32 | std::abs( minDist + params.dist.minWeight ) ) - params.dist.minWeight; |
| 33 | |
| 34 | const auto minBidirDist = ( std::signbit( maxDist + params.dist.maxWeight ) == std::signbit( minDist + params.dist.minWeight ) ) ? |
| 35 | ( std::min( std::abs( maxDist + params.dist.minWeight ), |
| 36 | std::abs( minDist + params.dist.maxWeight ) ) - params.dist.maxWeight ) |
| 37 | : -params.dist.maxWeight; |
| 38 | |
| 39 | return DistanceVolumeCreationParams |
| 40 | { |
| 41 | .vol = |
| 42 | { |
| 43 | .origin = origin, |
| 44 | .voxelSize = Vector3f::diagonal( params.voxelSize ), |
| 45 | .dimensions = dimensions, |
| 46 | }, |
| 47 | .dist = |
| 48 | { |
| 49 | params.dist, |
| 50 | minBidirDist, |
| 51 | maxBidirDist |
| 52 | } |
| 53 | }; |
| 54 | } |
| 55 | |
| 56 | MarchingCubesParams getMarchingCubesParams( const Box3f& bbox, const ParametersMetric& params ) |
| 57 | { |