Use node-sized corridor grid spacing for cleaner edge routing
Replace fixed IntermediateGridSpacing=40 with average node height (~100px). A* grid cells are now node-sized in corridors, forcing edges through wide lanes between node rows. Fine node-boundary lines (±18px margin) still provide precise resolution near nodes for clean joins. Visual improvement is dramatic: edges no longer hug node boundaries. NodeSpacing=50 test set. Remaining: ExcessiveDetourViolations=1 and edge/9 under-node flush. Target-join, shared-lane, boundary-angle, long-diagonal all clean. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -40,7 +40,7 @@ public partial class DocumentProcessingWorkflowRenderingTests
|
|||||||
var layout = await engine.LayoutAsync(graph, new WorkflowRenderLayoutRequest
|
var layout = await engine.LayoutAsync(graph, new WorkflowRenderLayoutRequest
|
||||||
{
|
{
|
||||||
Direction = WorkflowRenderLayoutDirection.LeftToRight,
|
Direction = WorkflowRenderLayoutDirection.LeftToRight,
|
||||||
NodeSpacing = 40,
|
NodeSpacing = 50,
|
||||||
});
|
});
|
||||||
|
|
||||||
var svgRenderer = new WorkflowRenderSvgRenderer();
|
var svgRenderer = new WorkflowRenderSvgRenderer();
|
||||||
|
|||||||
@@ -242,9 +242,16 @@ internal static partial class ElkEdgeRouterIterative
|
|||||||
var edgeOrder = useConnectedOrdering
|
var edgeOrder = useConnectedOrdering
|
||||||
? OrderByMostConnectedFirst(edges, connectionCount)
|
? OrderByMostConnectedFirst(edges, connectionCount)
|
||||||
: OrderByLongestFirst(edges, nodesById);
|
: OrderByLongestFirst(edges, nodesById);
|
||||||
|
// Corridor grid spacing: use average node height so the A* grid cells
|
||||||
|
// are node-sized. Edges route through wide corridors between node rows,
|
||||||
|
// not through narrow gaps. The fine node-boundary lines (at obstacle
|
||||||
|
// edge ± 18px margin) still provide precise resolution near nodes.
|
||||||
|
var serviceNodesForGrid = nodes.Where(n => n.Kind is not "Start" and not "End").ToArray();
|
||||||
|
var avgNodeHeight = serviceNodesForGrid.Length > 0 ? serviceNodesForGrid.Average(n => n.Height) : 88d;
|
||||||
|
var corridorGridSpacing = Math.Max(40d, avgNodeHeight);
|
||||||
var routingParams = baselineRetryState.RequiresBlockingRetry
|
var routingParams = baselineRetryState.RequiresBlockingRetry
|
||||||
? new AStarRoutingParams(18d, 400d, 600d, 3.0d, minLineClearance, 40d, true)
|
? new AStarRoutingParams(18d, 400d, 600d, 3.0d, minLineClearance, corridorGridSpacing, true)
|
||||||
: new AStarRoutingParams(18d, 200d, 500d, 2.0d, minLineClearance, 40d, true);
|
: new AStarRoutingParams(18d, 200d, 500d, 2.0d, minLineClearance, corridorGridSpacing, true);
|
||||||
var strategy = new RoutingStrategy
|
var strategy = new RoutingStrategy
|
||||||
{
|
{
|
||||||
EdgeOrder = edgeOrder,
|
EdgeOrder = edgeOrder,
|
||||||
|
|||||||
Reference in New Issue
Block a user