Node dimensions and connection rules determine the texture of the artwork. Compare the same kind of graph with different walls, spacing and angles.
Ring wall thickness is outer radius minus inner radius. Connection gap separates a line from its endpoint nodes; buffer reserves clearance from unrelated geometry. Length settings describe the visible connection.
Fine Rings

Radius 3, inner radius 2.5: a 0.5-unit wall.
650 nodes of 650 requested. Stop: target_reached. 240/240 occupied tiles; 100.0% of tile area has a node. This is a coarse coverage measure, not solid ink coverage.
JSON scene · YAML scene · SVG
Settings and command
graph-ics render --config docs/scenes/fine-rings.yaml --output examples/output/fine-rings.png
{
"version": 1,
"palette": "porcelain",
"width": 600,
"height": 360,
"nodes": 650,
"seed": 7,
"growth": {
"total_attempts": 35000,
"refill_passes": 2,
"coverage": {
"tile_size": 30,
"reseed_attempts": 1200
}
},
"style": {
"node_outer_radius": 3,
"node_inner_radius": 2.5
}
}Heavy Rings

Radius 5, inner radius 2: a 3-unit wall. Larger nodes consume more space.
609 nodes of 650 requested. Stop: attempt_budget_exhausted. 240/240 occupied tiles; 100.0% of tile area has a node. This is a coarse coverage measure, not solid ink coverage.
JSON scene · YAML scene · SVG
Settings and command
graph-ics render --config docs/scenes/heavy-rings.yaml --output examples/output/heavy-rings.png
{
"version": 1,
"palette": "porcelain",
"width": 600,
"height": 360,
"nodes": 650,
"seed": 7,
"growth": {
"total_attempts": 35000,
"refill_passes": 2,
"coverage": {
"tile_size": 30,
"reseed_attempts": 1200
}
},
"style": {
"node_outer_radius": 5,
"node_inner_radius": 2
}
}Solid Nodes

Zero inner radius makes a filled node.
650 nodes of 650 requested. Stop: target_reached. 240/240 occupied tiles; 100.0% of tile area has a node. This is a coarse coverage measure, not solid ink coverage.
JSON scene · YAML scene · SVG
Settings and command
graph-ics render --config docs/scenes/solid-nodes.yaml --output examples/output/solid-nodes.png
{
"version": 1,
"palette": "porcelain",
"width": 600,
"height": 360,
"nodes": 650,
"seed": 7,
"growth": {
"total_attempts": 35000,
"refill_passes": 2,
"coverage": {
"tile_size": 30,
"reseed_attempts": 1200
}
},
"style": {
"node_outer_radius": 3,
"node_inner_radius": 0
}
}Fine Lines

Connection width 0.5. Zoom in to inspect fine strokes.
650 nodes of 650 requested. Stop: target_reached. 240/240 occupied tiles; 100.0% of tile area has a node. This is a coarse coverage measure, not solid ink coverage.
JSON scene · YAML scene · SVG
Settings and command
graph-ics render --config docs/scenes/fine-lines.yaml --output examples/output/fine-lines.png
{
"version": 1,
"palette": "porcelain",
"width": 600,
"height": 360,
"nodes": 650,
"seed": 7,
"growth": {
"total_attempts": 35000,
"refill_passes": 2,
"coverage": {
"tile_size": 30,
"reseed_attempts": 1200
}
},
"style": {
"edge_thickness": 0.5
}
}Heavy Lines

Connection width 3. The whole stroke must fit.
650 nodes of 650 requested. Stop: target_reached. 240/240 occupied tiles; 100.0% of tile area has a node. This is a coarse coverage measure, not solid ink coverage.
JSON scene · YAML scene · SVG
Settings and command
graph-ics render --config docs/scenes/heavy-lines.yaml --output examples/output/heavy-lines.png
{
"version": 1,
"palette": "porcelain",
"width": 600,
"height": 360,
"nodes": 650,
"seed": 7,
"growth": {
"total_attempts": 35000,
"refill_passes": 2,
"coverage": {
"tile_size": 30,
"reseed_attempts": 1200
}
},
"style": {
"edge_thickness": 3
}
}Short Links

Visible connection length 4 to 8; shorter steps create a finer texture.
650 nodes of 650 requested. Stop: target_reached. 230/240 occupied tiles; 95.8% of tile area has a node. This is a coarse coverage measure, not solid ink coverage.
JSON scene · YAML scene · SVG
Settings and command
graph-ics render --config docs/scenes/short-links.yaml --output examples/output/short-links.png
{
"version": 1,
"palette": "porcelain",
"width": 600,
"height": 360,
"nodes": 650,
"seed": 7,
"growth": {
"total_attempts": 35000,
"refill_passes": 2,
"coverage": {
"tile_size": 30,
"reseed_attempts": 1200
}
},
"style": {
"edge_length_min": 4,
"edge_length_max": 8
}
}Long Links

Visible connection length 25 to 40; long steps leave larger openings.
432 nodes of 650 requested. Stop: attempt_budget_exhausted. 222/240 occupied tiles; 92.5% of tile area has a node. This is a coarse coverage measure, not solid ink coverage.
JSON scene · YAML scene · SVG
Settings and command
graph-ics render --config docs/scenes/long-links.yaml --output examples/output/long-links.png
{
"version": 1,
"palette": "porcelain",
"width": 600,
"height": 360,
"nodes": 650,
"seed": 7,
"growth": {
"total_attempts": 35000,
"refill_passes": 2,
"coverage": {
"tile_size": 30,
"reseed_attempts": 1200
}
},
"style": {
"edge_length_min": 25,
"edge_length_max": 40
}
}Wide Gaps

Four world units separate each ring from its connection.
650 nodes of 650 requested. Stop: target_reached. 240/240 occupied tiles; 100.0% of tile area has a node. This is a coarse coverage measure, not solid ink coverage.
JSON scene · YAML scene · SVG
Settings and command
graph-ics render --config docs/scenes/wide-gaps.yaml --output examples/output/wide-gaps.png
{
"version": 1,
"palette": "porcelain",
"width": 600,
"height": 360,
"nodes": 650,
"seed": 7,
"growth": {
"total_attempts": 35000,
"refill_passes": 2,
"coverage": {
"tile_size": 30,
"reseed_attempts": 1200
}
},
"style": {
"edge_node_distance": 4
}
}Wide Buffers

A five-unit buffer keeps unrelated nodes and edges further apart.
393 nodes of 650 requested. Stop: attempt_budget_exhausted. 237/240 occupied tiles; 98.8% of tile area has a node. This is a coarse coverage measure, not solid ink coverage.
JSON scene · YAML scene · SVG
Settings and command
graph-ics render --config docs/scenes/wide-buffers.yaml --output examples/output/wide-buffers.png
{
"version": 1,
"palette": "porcelain",
"width": 600,
"height": 360,
"nodes": 650,
"seed": 7,
"growth": {
"total_attempts": 35000,
"refill_passes": 2,
"coverage": {
"tile_size": 30,
"reseed_attempts": 1200
}
},
"style": {
"node_buffer": 5
}
}