File size: 4,162 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
# Debug: Compare complete mode boundary handling vs separated mode

cat("=" , rep("=", 70), "\n", sep = "")
cat("Complete Mode vs Separated Mode: Border Handling\n")
cat("=" , rep("=", 70), "\n\n", sep = "")

source("R/hexagonal_topology.R")
source("R/hexagonal_puzzle.R")

rings <- 3
diameter <- 240
piece_radius <- diameter / (rings * 4)

cat("=== COMPLETE MODE ANALYSIS ===\n\n")

# In complete mode, when do_warp=TRUE and do_trunc=TRUE:
# 1. The border is drawn as a SEPARATE circle using:
#    "a radius radius 0 1 0 (2*radius) 0" where radius = diameter/2 = 120

# But the internal edges use hex_process_r which applies:
# - hex_scale: scales coordinates by (1.0 / (2*n - 4.0/3)) * radius
# - hex_rotate: rotates by angle
# - hex_warp: if do_warp, applies the warp transformation
# - hex_translate: adds (radius + offset, radius + offset) to center the puzzle

# Let's trace through hex_scale for our parameters
n <- rings
radius <- diameter / 2
scale_factor <- (1.0 / (2 * n - 4.0 / 3)) * radius

cat(sprintf("Complete mode hex_scale factor:\n"))
cat(sprintf("  n = %d\n", n))
cat(sprintf("  radius = diameter/2 = %.2f\n", radius))
cat(sprintf("  scale = (1/(2*n - 4/3)) * radius = (1/%.4f) * %.2f = %.4f\n",
            2*n - 4/3, radius, scale_factor))

# So in complete mode, the "base" coordinates are in a different scale
# The hexagonal grid iteration uses:
# yi from -(2n-1) to (2n-1), step 2 (so -5 to 5 for n=3)
# For each yi, xi varies based on row

cat("\n")
cat("Complete mode coordinate ranges (before scale/warp/translate):\n")
yl <- 2 * n - 1
cat(sprintf("  yl = 2*n - 1 = %d\n", yl))
cat(sprintf("  yi range: [%d, %d]\n", -(yl - 1), yl - 1))

# After hex_scale, these become actual coordinates
cat(sprintf("\nAfter hex_scale (y):\n"))
cat(sprintf("  max |yi| = %d, scaled = %.2f\n", yl - 1, (yl - 1) * scale_factor))
cat(sprintf("  This is the y-extent of pieces (before sqrt(0.75) factor in scale)\n"))

# The sqrt(0.75) factor is applied to y in hex_scale
actual_y_extent <- (yl - 1) * scale_factor * sqrt(0.75)
cat(sprintf("  Actual y extent = %.2f\n", actual_y_extent))

cat("\n\n=== SEPARATED MODE ANALYSIS ===\n\n")

# In separated mode, we use:
# piece_radius = diameter / (rings * 4)
# Vertices are placed at distance piece_radius from piece centers
# Piece centers are calculated using axial_to_cartesian

cat(sprintf("Separated mode piece_radius: %.2f\n", piece_radius))

# The furthest piece center
# For 3 rings, the outer pieces have ring=2 (0-indexed)
# Their centers are at various positions

cat("\nOuter piece center distances:\n")
num_pieces <- 3 * rings * (rings - 1) + 1

for (piece_id in 1:num_pieces) {
  ring_info <- map_piece_id_to_ring(piece_id, rings)
  if (ring_info$ring == rings - 1) {
    axial <- map_piece_id_to_axial(piece_id, rings)
    cart <- axial_to_cartesian(axial$q, axial$r, piece_radius)
    center_dist <- sqrt(cart$x^2 + cart$y^2)
    cat(sprintf("  Piece %d: center at (%.2f, %.2f), dist=%.2f\n",
                piece_id, cart$x, cart$y, center_dist))
  }
}

# The furthest vertices are at piece center distance + piece_radius
# in the outward direction

cat("\n\n=== KEY DIFFERENCE ===\n\n")

cat("Complete mode:\n")
cat("  - Uses its own coordinate system based on hex_scale\n")
cat("  - Border is drawn as a SEPARATE overlay circle with radius = diameter/2\n")
cat("  - Pieces don't have individual border arcs\n")
cat("  - The puzzle is a single connected path + border overlay\n\n")

cat("Separated mode:\n")
cat("  - Uses piece_radius = diameter/(rings*4)\n")
cat("  - Each piece has its own complete path including border arcs\n")
cat("  - Border arc radius needs to match the geometry\n\n")

cat("The PROBLEM: In separated mode, we're trying to use arc radius = 88mm\n")
cat("(computed from average warped distances), but the actual warped boundary\n")
cat("vertices are NOT all at 88mm - they range from ~60mm to ~88mm!\n\n")

cat("When we project vertices to the circle AND use that radius for arcs,\n")
cat("the pieces that had vertices closer to the origin get STRETCHED.\n")