graph_icsGitHub
Guide chapters

Nodes and connections

Node dimensions and connection rules determine the texture of the artwork. Compare the same kind of graph with different walls, spacing and angles.

Radius, wall and spacing

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.

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.

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.

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.

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.

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.

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.

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.

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.

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
  }
}

Node shapes

These vary only the visible node outline. Shape choice is preserved by replay.
Enlarged shape and connection style key

Shape Circle

shape-circle

Same layout and outer radius. Polygon corners fit inside the reserved circle; endpoint gaps can therefore look larger.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example sprawl --palette porcelain --nodes 480 --seed 7 --node-shape circle --edge-style solid --scale 1 --margin 16 --output examples/output/shape-circle.png
SVG

Shape Square

shape-square

Same layout and outer radius. Polygon corners fit inside the reserved circle; endpoint gaps can therefore look larger.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example sprawl --palette porcelain --nodes 480 --seed 7 --node-shape square --edge-style solid --scale 1 --margin 16 --output examples/output/shape-square.png
SVG

Shape Diamond

shape-diamond

Same layout and outer radius. Polygon corners fit inside the reserved circle; endpoint gaps can therefore look larger.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example sprawl --palette porcelain --nodes 480 --seed 7 --node-shape diamond --edge-style solid --scale 1 --margin 16 --output examples/output/shape-diamond.png
SVG

Shape Triangle

shape-triangle

Same layout and outer radius. Polygon corners fit inside the reserved circle; endpoint gaps can therefore look larger.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example sprawl --palette porcelain --nodes 480 --seed 7 --node-shape triangle --edge-style solid --scale 1 --margin 16 --output examples/output/shape-triangle.png
SVG

Shape Hexagon

shape-hexagon

Same layout and outer radius. Polygon corners fit inside the reserved circle; endpoint gaps can therefore look larger.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example sprawl --palette porcelain --nodes 480 --seed 7 --node-shape hexagon --edge-style solid --scale 1 --margin 16 --output examples/output/shape-hexagon.png
SVG

Connection patterns

Line patterns are rendering styles on straight connections. Curves, arrows and moving paths are not implemented.

Line Solid

line-solid

Same layout and full-width collision corridor. Dashed gaps remain reserved; double lines split the width into thirds.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example lines --palette porcelain --nodes 480 --seed 7 --node-shape circle --edge-style solid --scale 1 --margin 16 --output examples/output/line-solid.png
SVG

Line Dashed

line-dashed

Same layout and full-width collision corridor. Dashed gaps remain reserved; double lines split the width into thirds.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example lines --palette porcelain --nodes 480 --seed 7 --node-shape circle --edge-style dashed --scale 1 --margin 16 --output examples/output/line-dashed.png
SVG

Line Dotted

line-dotted

Same layout and full-width collision corridor. Dashed gaps remain reserved; double lines split the width into thirds.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example lines --palette porcelain --nodes 480 --seed 7 --node-shape circle --edge-style dotted --scale 1 --margin 16 --output examples/output/line-dotted.png
SVG

Line Double

line-double

Same layout and full-width collision corridor. Dashed gaps remain reserved; double lines split the width into thirds.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example lines --palette porcelain --nodes 480 --seed 7 --node-shape circle --edge-style double --scale 1 --margin 16 --output examples/output/line-double.png
SVG

Angle restrictions

Hard rules forbid small junctions; soft penalties merely make them less likely. Stricter settings change the subsequent random growth and can reduce coverage.

Angles Free

angles-free

Hard minimum 0 degrees; preference 0; penalty 0. Identical seed and target, different rejection decisions.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example sprawl --palette porcelain --nodes 480 --seed 7 --node-shape circle --edge-style solid --scale 1 --margin 16 --minimum-angle 0 --preferred-angle 0 --angle-penalty 0 --output examples/output/angles-free.png
SVG

Angles Hard 45

angles-hard-45

Hard minimum 45 degrees; preference 0; penalty 0. Identical seed and target, different rejection decisions.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example sprawl --palette porcelain --nodes 480 --seed 7 --node-shape circle --edge-style solid --scale 1 --margin 16 --minimum-angle 45 --preferred-angle 0 --angle-penalty 0 --output examples/output/angles-hard-45.png
SVG

Angles Soft 80

angles-soft-80

Hard minimum 0 degrees; preference 80; penalty 0.9. Identical seed and target, different rejection decisions.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example sprawl --palette porcelain --nodes 480 --seed 7 --node-shape circle --edge-style solid --scale 1 --margin 16 --minimum-angle 0 --preferred-angle 80 --angle-penalty 0.9 --output examples/output/angles-soft-80.png
SVG

Angles Strict 60 90

angles-strict-60-90

Hard minimum 60 degrees; preference 90; penalty 0.9. Identical seed and target, different rejection decisions.

632 × 432; 480 nodes

Reproduce / SVG
graph-ics render --example sprawl --palette porcelain --nodes 480 --seed 7 --node-shape circle --edge-style solid --scale 1 --margin 16 --minimum-angle 60 --preferred-angle 90 --angle-penalty 0.9 --output examples/output/angles-strict-60-90.png
SVG

All geometry parameters and units