File size: 5,970 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 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | # Puzzle Piece Separation Examples
# Demonstrates how to generate puzzles with separated pieces for laser cutting
# Load required functions
source("R/rectangular_puzzle.R")
source("R/puzzle_core_clean.R")
source("R/puzzle_separation.R")
cat("=== Puzzle Piece Separation Examples ===\n\n")
cat("This feature maintains pieces in their original grid positions\n")
cat("but adds configurable gaps between them.\n\n")
# Example 1: Basic separation for laser cutting
cat("Example 1: Laser Cutting Layout (2x2)\n")
cat("-" , rep("-", 40), "\n", sep="")
# Generate puzzle
puzzle_2x2 <- generate_puzzle_core(
seed = 1234,
grid = c(2, 2),
size = c(100, 100)
)
# Calculate optimal offset for laser cutting
optimal_offset <- calculate_optimal_offset(
piece_width = puzzle_2x2$piece_width,
piece_height = puzzle_2x2$piece_height,
kerf = 0.2, # Typical laser kerf
min_separation = 3 # Minimum 3mm between pieces
)
cat(sprintf("Piece size: %.0f x %.0f mm\n",
puzzle_2x2$piece_width, puzzle_2x2$piece_height))
cat(sprintf("Optimal offset for laser cutting: %.2f mm\n", optimal_offset))
# Generate separated puzzle
svg_laser <- generate_separated_puzzle_svg(
puzzle_structure = puzzle_2x2,
offset = optimal_offset,
colors = "black", # Black lines for laser cutting
stroke_width = 0.5 # Thin lines for cutting
)
writeLines(svg_laser, "output/example_laser_cutting_2x2.svg")
cat("✓ Saved: output/example_laser_cutting_2x2.svg\n\n")
# Example 2: Progressive separation visualization
cat("Example 2: Progressive Separation (shows different offsets)\n")
cat("-" , rep("-", 40), "\n", sep="")
offsets <- c(0, 5, 10, 20)
colors <- c("#FF6B6B", "#4ECDC4", "#45B7D1", "#FFA07A")
for (offset in offsets) {
svg <- generate_separated_puzzle_svg(
puzzle_structure = puzzle_2x2,
offset = offset,
colors = colors,
stroke_width = 1.5
)
filename <- sprintf("output/example_separation_%dmm.svg", offset)
writeLines(svg, filename)
cat(sprintf(" Offset %2d mm: %s\n", offset, filename))
}
cat("\n")
# Example 3: Larger puzzle for production
cat("Example 3: Production Layout (4x3 puzzle)\n")
cat("-" , rep("-", 40), "\n", sep="")
# Generate larger puzzle
puzzle_4x3 <- generate_puzzle_core(
seed = 9999,
grid = c(3, 4), # 3 rows, 4 columns = 12 pieces
size = c(200, 150),
tabsize = 22,
jitter = 3
)
# Production layout with adequate separation
production_offset <- 8 # 8mm separation for easy handling
svg_production <- generate_separated_puzzle_svg(
puzzle_structure = puzzle_4x3,
offset = production_offset,
colors = "darkblue",
stroke_width = 1.0
)
writeLines(svg_production, "output/example_production_4x3.svg")
# Calculate material usage
original_area <- puzzle_4x3$size[1] * puzzle_4x3$size[2]
separated_width <- puzzle_4x3$size[1] + (4 - 1) * production_offset
separated_height <- puzzle_4x3$size[2] + (3 - 1) * production_offset
separated_area <- separated_width * separated_height
cat(sprintf("Original puzzle size: %.0f x %.0f mm (area: %.0f mm²)\n",
puzzle_4x3$size[1], puzzle_4x3$size[2], original_area))
cat(sprintf("Separated layout size: %.0f x %.0f mm (area: %.0f mm²)\n",
separated_width, separated_height, separated_area))
cat(sprintf("Area increase: %.1f%%\n",
(separated_area - original_area) / original_area * 100))
cat("✓ Saved: output/example_production_4x3.svg\n\n")
# Example 4: Educational/Assembly guide
cat("Example 4: Assembly Guide with Color Coding\n")
cat("-" , rep("-", 40), "\n", sep="")
# Generate a 3x3 puzzle
puzzle_3x3 <- generate_puzzle_core(
seed = 42,
grid = c(3, 3),
size = c(150, 150)
)
# Create assembly guide with generous spacing and colors
guide_colors <- c(
"#FF6B6B", # Red - corners
"#4ECDC4", # Teal - edges
"#45B7D1", # Blue - center
"#FF6B6B", # Red - corners
"#4ECDC4", # Teal - edges
"#FF6B6B", # Red - corners
"#4ECDC4", # Teal - edges
"#4ECDC4", # Teal - edges
"#FF6B6B" # Red - corners
)
svg_guide <- generate_separated_puzzle_svg(
puzzle_structure = puzzle_3x3,
offset = 15, # Generous spacing for clarity
colors = guide_colors,
stroke_width = 2.0 # Thicker lines for visibility
)
writeLines(svg_guide, "output/example_assembly_guide_3x3.svg")
cat("✓ Saved: output/example_assembly_guide_3x3.svg\n")
cat(" Color coding: Red=corners, Teal=edges, Blue=center\n\n")
# Example 5: Using enhanced function with modes
cat("Example 5: Enhanced Function Demonstration\n")
cat("-" , rep("-", 40), "\n", sep="")
modes <- list(
list(desc = "Traditional (touching pieces)",
mode = "individual", offset = 0),
list(desc = "Small separation (5mm)",
mode = "separated", offset = 5),
list(desc = "Medium separation (10mm)",
mode = "separated", offset = 10),
list(desc = "Large separation (15mm)",
mode = "separated", offset = 15)
)
for (i in seq_along(modes)) {
m <- modes[[i]]
svg <- generate_puzzle_svg_enhanced(
puzzle_structure = puzzle_2x2,
mode = m$mode,
offset = m$offset,
colors = c("red", "blue", "green", "orange")
)
filename <- sprintf("output/example_enhanced_mode_%d.svg", i)
writeLines(svg, filename)
cat(sprintf(" %s\n → %s\n", m$desc, filename))
}
# Summary
cat("\n=== Summary ===\n")
cat("Generated examples demonstrate:\n")
cat(" 1. Laser cutting layout with optimal offset calculation\n")
cat(" 2. Progressive separation visualization (0, 5, 10, 20mm)\n")
cat(" 3. Production layout with material usage calculation\n")
cat(" 4. Assembly guide with color coding\n")
cat(" 5. Enhanced function with different modes\n")
cat("\nAll files saved to output/ directory\n")
cat("\nUse cases:\n")
cat(" • Laser cutting: Optimal spacing for kerf and handling\n")
cat(" • Education: Clear piece identification and assembly\n")
cat(" • Production: Efficient material usage with adequate separation\n")
cat(" • Documentation: Visual guides and instructions\n") |