core: coarser smooth-route tolerance + shell support bound (L119, evaluator v224)
Chord error 2.5 -> 10 cm, shell work skipped outside the 0-0.75 m band. Sweep pairs -39%, prepare -60%, near-ready 3-8% faster than L115 but still +13..+22% vs L109. Floor offset 7.88 mm; captures match L115 by eye; fast tier, walk audits, Clang/GCC W1/W8/W12 determinism green. Not for merge yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
This commit is contained in:
1 parent
6e52fb48b2
commit
707bc61553
40 files changed
+2352
-54
No files matched your search
@@ -3035,7 +3035,7 @@ namespace StandaloneStreamBenchmark
|
||||
const auto controls=passageSplineControls(passage);
|
||||
const auto floorProfile=passageSplineFloorProfile(passage);
|
||||
const auto segments=VoxelForgeCore::PassageSpline::BuildSegments(
|
||||
controls,routeEnd,8.0,1.0,floorProfile,0.025);
|
||||
controls,routeEnd,8.0,1.0,floorProfile,0.100);
|
||||
const auto consider=[&](double distance,double radius)
|
||||
{
|
||||
minimumRadius=std::min(minimumRadius,radius);
|
||||
@@ -3070,7 +3070,7 @@ namespace StandaloneStreamBenchmark
|
||||
const auto controls=passageSplineControls(passage);
|
||||
const auto floorProfile=passageSplineFloorProfile(passage);
|
||||
const auto segments=VoxelForgeCore::PassageSpline::BuildSegments(
|
||||
controls,routeEnd,8.0,1.0,floorProfile,0.025);
|
||||
controls,routeEnd,8.0,1.0,floorProfile,0.100);
|
||||
const auto effectiveCenterZ=[&](const auto& point,double plannedFloor)
|
||||
{
|
||||
return plannedFloor+passageTubeDepthAt(point[3],bodyDepth);
|
||||
@@ -3125,7 +3125,7 @@ namespace StandaloneStreamBenchmark
|
||||
const std::size_t routeEnd=std::clamp<std::size_t>(
|
||||
passage.lowerMouthControlIndex,1,passage.controlPoints.size()-1);
|
||||
const auto segments=VoxelForgeCore::PassageSpline::BuildSegments(
|
||||
controls,routeEnd,8.0,1.0,floorProfile,0.025);
|
||||
controls,routeEnd,8.0,1.0,floorProfile,0.100);
|
||||
if(!segments.empty())
|
||||
{
|
||||
blend.mouthX=segments.front().a[0];
|
||||
@@ -3605,7 +3605,45 @@ namespace StandaloneStreamBenchmark
|
||||
}
|
||||
else ++audit.missingFloorSamples;
|
||||
}
|
||||
if(i%4!=0)continue;
|
||||
}
|
||||
}
|
||||
// Keep wall probe density tied to route distance, not to the number
|
||||
// of adaptive spline segments. A coarser chord tolerance may leave
|
||||
// long segments around a mouth; fixed stations still exercise the
|
||||
// same wall geometry without weakening the coverage requirement.
|
||||
for(std::size_t endpoint=0;endpoint<2;++endpoint)
|
||||
{
|
||||
for(double localDistance=0.0;
|
||||
localDistance<=PassageMouthProfileReachMetres+1.0e-9;
|
||||
localDistance+=1.0)
|
||||
{
|
||||
const double routeDistance=endpoint==0?localDistance
|
||||
:lowerMouthDistance-localDistance;
|
||||
if(routeDistance<0.0||routeDistance>lowerMouthDistance)continue;
|
||||
const auto upper=std::lower_bound(path.begin(),path.end(),routeDistance,
|
||||
[](const FProfilePose& pose,double value)
|
||||
{return pose.distance<value;});
|
||||
const auto b=upper==path.end()?path.end()-1:upper;
|
||||
const auto a=b==path.begin()?b:b-1;
|
||||
const double span=b->distance-a->distance;
|
||||
const double t=span>1.0e-12
|
||||
?std::clamp((routeDistance-a->distance)/span,0.0,1.0):0.0;
|
||||
const double dx=b->x-a->x,dy=b->y-a->y;
|
||||
const double tangentLength=std::hypot(dx,dy);
|
||||
if(tangentLength<=1.0e-6)
|
||||
{
|
||||
audit.missingWallSamples+=2;
|
||||
continue;
|
||||
}
|
||||
const double nx=-dy/tangentLength,ny=dx/tangentLength;
|
||||
FProfilePose pose;
|
||||
pose.distance=routeDistance;
|
||||
pose.x=std::lerp(a->x,b->x,t);
|
||||
pose.y=std::lerp(a->y,b->y,t);
|
||||
pose.z=std::lerp(a->z,b->z,t);
|
||||
pose.floorZ=std::lerp(a->floorZ,b->floorZ,t);
|
||||
pose.radius=std::lerp(a->radius,b->radius,t);
|
||||
pose.segmentIndex=t<0.5?a->segmentIndex:b->segmentIndex;
|
||||
for(std::size_t side=0;side<2;++side)
|
||||
{
|
||||
const double sign=side==0?-1.0:1.0;
|
||||
@@ -3613,10 +3651,12 @@ namespace StandaloneStreamBenchmark
|
||||
// above its floor. Probe at mid-wall height so this check
|
||||
// measures those walls instead of the absent roof-height
|
||||
// shell at the centreline.
|
||||
const double radius=findWallRadius(pose,sign*nx,sign*ny,0.50);
|
||||
const double radius=findWallRadius(
|
||||
pose,sign*nx,sign*ny,0.50);
|
||||
if(std::isfinite(radius))
|
||||
{
|
||||
wallProfiles[endpoint][side].push_back({localDistance,radius});
|
||||
wallProfiles[endpoint][side].push_back(
|
||||
{localDistance,radius});
|
||||
++audit.wallSamples;
|
||||
}
|
||||
else ++audit.missingWallSamples;
|
||||
|
||||
Reference in new issue
Block a user