File size: 4,916 Bytes
e232e39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# Clean jigsawR Usage Examples
# Demonstrates the clean, reproducible puzzle generation API

# Load required functions
source("R/rectangular_puzzle.R")  # Core functions
source("R/puzzle_core_clean.R")   # Clean implementation
source("R/jigsawR_clean.R")       # Main API

cat("=== jigsawR Clean Implementation Examples ===\n\n")
cat("This implementation ensures:\n")
cat("  - Reproducible output (same seed = same puzzle)\n")
cat("  - No hard-coded adjustments\n")
cat("  - Adjacent pieces share exact same edge paths\n")
cat("  - Clean separation of concerns\n\n")

# Example 1: Simple 2x2 puzzle
cat("Example 1: Simple 2x2 Puzzle\n")
cat("-" , rep("-", 40), "\n", sep="")

puzzle1 <- generate_puzzle(
  type = "rectangular",
  grid = c(2, 2),
  size = c(200, 200),
  seed = 1234,
  output = "both",
  filename_prefix = "example1_simple"
)

cat("Generated with seed:", puzzle1$seed, "\n\n")

# Example 2: Individual pieces with colors
cat("Example 2: Colored Individual Pieces\n")
cat("-" , rep("-", 40), "\n", sep="")

puzzle2 <- generate_puzzle(
  grid = c(3, 3),
  size = c(300, 300),
  seed = 5678,
  output = "individual",
  colors = c("#FF6B6B", "#4ECDC4", "#45B7D1", "#FFA07A", "#98D8C8", 
            "#F7DC6F", "#BB8FCE", "#85C1E2", "#F8B739"),
  filename_prefix = "example2_colored"
)

cat("\n")

# Example 3: Puzzle with gradient background
cat("Example 3: Puzzle with Gradient Background\n")
cat("-" , rep("-", 40), "\n", sep="")

puzzle3 <- generate_puzzle(
  grid = c(2, 2),
  size = c(250, 250),
  seed = 999,
  output = "both",
  background = "gradient",
  filename_prefix = "example3_gradient"
)

cat("\n")

# Example 4: Batch generation with variations
cat("Example 4: Batch Generation\n")
cat("-" , rep("-", 40), "\n", sep="")

variations <- list(
  list(name = "easy_4piece", seed = 100, grid = c(2, 2), tabsize = 25),
  list(name = "medium_9piece", seed = 200, grid = c(3, 3), tabsize = 20),
  list(name = "harder_16piece", seed = 300, grid = c(4, 4), tabsize = 18),
  list(name = "small_tabs", seed = 400, grid = c(2, 2), tabsize = 15, jitter = 2),
  list(name = "large_tabs", seed = 500, grid = c(2, 2), tabsize = 30, jitter = 6)
)

batch_results <- generate_puzzle_batch(variations, base_dir = "output/batch_example")

cat("\n")

# Example 5: Validation and reproducibility test
cat("Example 5: Validation and Reproducibility\n")
cat("-" , rep("-", 40), "\n", sep="")

# Generate puzzle structure for validation
puzzle_struct <- generate_puzzle_core(seed = 777, grid = c(2, 2))

# Validate that all edges are properly defined
validate_puzzle_fit(puzzle_struct)

# Test reproducibility
cat("\nReproducibility test:\n")
test1 <- generate_puzzle(seed = 12345, grid = c(2, 2), save_files = FALSE)
test2 <- generate_puzzle(seed = 12345, grid = c(2, 2), save_files = FALSE)

if (identical(test1$svg_complete, test2$svg_complete)) {
  cat("✓ Same seed produces identical output\n")
} else {
  cat("✗ Reproducibility check failed!\n")
}

# Example 6: Custom configuration
cat("\nExample 6: Custom Configuration\n")
cat("-" , rep("-", 40), "\n", sep="")

custom_puzzle <- generate_puzzle(
  type = "rectangular",
  grid = c(5, 4),      # 5 rows, 4 columns = 20 pieces
  size = c(400, 500),  # 400mm x 500mm
  seed = 2024,
  tabsize = 22,        # Medium-sized tabs
  jitter = 3,          # Low jitter for cleaner look
  output = "complete", # Just the complete puzzle
  background = "#E8F5E9",  # Light green background
  filename_prefix = "example6_custom"
)

cat("\n")

# Example 7: Programmatic piece access
cat("Example 7: Programmatic Piece Access\n")
cat("-" , rep("-", 40), "\n", sep="")

# Generate puzzle structure
puzzle <- generate_puzzle_core(seed = 888, grid = c(2, 2), size = c(200, 200))

# Access individual piece paths programmatically
cat("Generating piece paths programmatically:\n")
for (yi in 0:1) {
  for (xi in 0:1) {
    piece_path <- generate_single_piece(xi, yi, puzzle)
    
    # Count path commands
    n_moves <- length(gregexpr("M", piece_path)[[1]])
    n_curves <- length(gregexpr("C", piece_path)[[1]]) 
    n_lines <- length(gregexpr("L", piece_path)[[1]])
    
    cat(sprintf("  Piece [%d,%d]: %d moves, %d curves, %d lines\n", 
                xi, yi, n_moves, n_curves, n_lines))
  }
}

# Summary
cat("\n=== Summary ===\n")
cat("Generated examples demonstrate:\n")
cat("  1. Simple 2x2 puzzle (both modes)\n")
cat("  2. Colored 3x3 individual pieces\n")
cat("  3. Puzzle with gradient background\n")
cat("  4. Batch generation with variations\n")
cat("  5. Validation and reproducibility\n")
cat("  6. Custom configuration (5x4 puzzle)\n")
cat("  7. Programmatic piece access\n")
cat("\nAll files saved to output/ directory\n")
cat("\nKey principles maintained:\n")
cat("  ✓ Deterministic generation (seed-based)\n")
cat("  ✓ No hard-coded adjustments\n")
cat("  ✓ Clean, modular architecture\n")
cat("  ✓ Adjacent pieces share exact edge paths\n")