File size: 5,167 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
devtools::load_all()

cat("Border/Outline Issue Investigation\n")
cat("===================================\n")
cat("Concentric puzzle with:\n")
cat("  - Fusion groups: (1,2), (5,6,7)\n")
cat("  - Tab size: 7\n")
cat("  - Jitter: 2\n")
cat("  - Separation: 50mm\n")
cat("  - Internal edge style: dashed\n\n")

# Determine ring count based on piece numbers mentioned (16, 17, 18, 19)
# 3 rings: 1 + 6 + 12 = 19 pieces
cat("=== PUZZLE STRUCTURE ===\n")
rings <- 3
n_pieces <- 3 * rings * (rings - 1) + 1
cat(sprintf("Rings: %d\n", rings))
cat(sprintf("Total pieces: %d\n\n", n_pieces))

cat("Ring layout:\n")
cat("  Ring 0: Piece 1 (center hexagon)\n")
cat("  Ring 1: Pieces 2-7 (6 trapezoids around center)\n")
cat("  Ring 2: Pieces 8-19 (12 trapezoids outer ring)\n\n")

# Generate the puzzle
result <- generate_puzzle(
  type = "concentric",
  seed = 42,
  grid = c(rings),
  size = c(300),
  tabsize = 7,
  jitter = 2,
  offset = 50,
  fusion_groups = list(c(1, 2), c(5, 6, 7)),
  fusion_style = "dashed",
  fusion_opacity = 0.3,
  fill_color = "none",
  save_files = TRUE,
  output_dir = "output",
  filename_prefix = "debug_border"
)

cat("=== PIECE ADJACENCY ANALYSIS ===\n\n")

# List expected adjacencies for pieces mentioned in the issue
cat("Expected adjacencies (non-fused edges should have borders):\n")
cat("  Piece 3 borders: center(1), piece 2, piece 4, ring2 pieces\n")
cat("  Piece 4 borders: center(1), piece 3, piece 5, ring2 pieces\n")
cat("  Piece 5 borders: center(1), piece 4, piece 6 (FUSED), ring2 pieces\n")
cat("  Piece 6 borders: center(1), piece 5 (FUSED), piece 7 (FUSED), ring2 pieces\n")
cat("  Piece 7 borders: center(1), piece 6 (FUSED), piece 2, ring2 pieces\n\n")

cat("=== EDGE ANALYSIS PER PIECE ===\n\n")

for (i in seq_along(result$pieces)) {
  piece <- result$pieces[[i]]

  ring <- if (!is.null(piece$ring_pos)) piece$ring_pos$ring else NA
  pos <- if (!is.null(piece$ring_pos)) piece$ring_pos$position else NA

  cat(sprintf("--- PIECE %d (ring %d, pos %d) ---\n", i, ring, pos))

  # Get edge paths
  edge_paths <- get_piece_edge_paths(piece)
  edge_names <- get_piece_edge_names(piece)

  for (edge_name in edge_names) {
    path <- edge_paths[[edge_name]]
    is_fused <- isTRUE(piece$fused_edges[[edge_name]])
    has_path <- !is.null(path) && nzchar(path)

    # Parse path to count segments
    if (has_path) {
      segs <- parse_svg_path(path)
      seg_types <- paste(sapply(segs, function(s) s$type), collapse=" ")
      n_segs <- length(segs)
    } else {
      seg_types <- "EMPTY"
      n_segs <- 0
    }

    status <- if (!has_path) "MISSING" else if (is_fused) "fused" else "solid"

    cat(sprintf("  %s: %s (segs=%d: %s)\n",
                edge_name, status, n_segs, seg_types))
  }
  cat("\n")
}

cat("=== SVG PATH ANALYSIS ===\n\n")

# Read the generated SVG
svg_lines <- readLines("output/debug_border_conc3_seed42_separated.svg")

# Count paths by type
fill_paths <- svg_lines[grepl("fill=\"none\" stroke=\"none\"", svg_lines)]
stroke_paths <- svg_lines[grepl("stroke=\"#", svg_lines) & !grepl("stroke=\"none\"", svg_lines)]
dashed_paths <- svg_lines[grepl("stroke-dasharray", svg_lines)]

cat(sprintf("Fill-only paths: %d\n", length(fill_paths)))
cat(sprintf("Stroke paths (non-fused edges): %d\n", length(stroke_paths) - length(dashed_paths)))
cat(sprintf("Dashed paths (fused edges): %d\n", length(dashed_paths)))

# Expected counts
# 19 pieces, each with 4 edges (except center with 6)
# Center: 6 edges, 1 fused (to piece 2)
# Ring 1 (pieces 2-7): 4 edges each
#   Piece 2: INNER fused (to 1), others solid
#   Pieces 3,4: all solid (4 each)
#   Piece 5: RIGHT fused (to 6), others solid
#   Piece 6: LEFT fused (to 5), RIGHT fused (to 7), others solid
#   Piece 7: LEFT fused (to 6), others solid
# Ring 2 (pieces 8-19): 4 edges each, all solid

cat("\nExpected edge counts:\n")
cat("  Center (piece 1): 5 solid + 1 fused = 6\n")
cat("  Piece 2: 3 solid + 1 fused = 4\n")
cat("  Pieces 3,4: 4 solid each = 8\n")
cat("  Piece 5: 3 solid + 1 fused = 4\n")
cat("  Piece 6: 2 solid + 2 fused = 4\n")
cat("  Piece 7: 3 solid + 1 fused = 4\n")
cat("  Ring 2 (pieces 8-19): 4 solid each = 48\n")
cat("  Total solid: 5+3+8+3+2+3+48 = 72\n")
cat("  Total fused: 1+1+1+2+1 = 6 (but drawn only 3 due to dedup)\n")

cat("\n=== COMPARING FILL vs STROKE PATHS ===\n\n")

# Check if any piece fill paths don't have corresponding stroke paths
for (i in 1:min(7, length(result$pieces))) {
  piece <- result$pieces[[i]]
  fill_path <- piece$path

  # Get edge paths
  edge_paths <- get_piece_edge_paths(piece)

  # Combine all edge paths
  all_edges <- paste(unlist(edge_paths[edge_paths != ""]), collapse = " ")

  # Compare total path length
  fill_len <- nchar(fill_path)
  edge_len <- nchar(all_edges)

  cat(sprintf("Piece %d: fill_path=%d chars, edge_paths=%d chars\n",
              i, fill_len, edge_len))
}

cat("\nSVG saved to: output/debug_border_conc3_seed42_separated.svg\n")
cat("\nPlease visually inspect this file to identify the missing borders.\n")