File size: 1,549 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 | # Calculate arc centers to demonstrate the translation problem
calculate_arc_center <- function(x1, y1, x2, y2, r) {
mx <- (x1 + x2) / 2
my <- (y1 + y2) / 2
d <- sqrt((x2 - x1)^2 + (y2 - y1)^2)
if (d > 2*r) {
return(list(x = NA, y = NA))
}
h <- sqrt(r^2 - (d/2)^2)
dx_perp <- -(y2 - y1) / d
dy_perp <- (x2 - x1) / d
cx <- mx + h * dx_perp
cy <- my + h * dy_perp
list(x = cx, y = cy)
}
cat("Arc Translation Problem Analysis\n")
cat("=================================\n\n")
cat("Original arc (centered at origin):\n")
cat(" Path: M 0 100 A 100 100 0 0 1 86.6 50\n")
original_center <- calculate_arc_center(0, 100, 86.6, 50, 100)
cat(sprintf(" Calculated center: (%.2f, %.2f)\n\n", original_center$x, original_center$y))
cat("Translated arc (simple endpoint translation by dx=50, dy=50):\n")
cat(" Path: M 50 150 A 100 100 0 0 1 136.6 100\n")
translated_center <- calculate_arc_center(50, 150, 136.6, 100, 100)
cat(sprintf(" Calculated center: (%.2f, %.2f)\n\n", translated_center$x, translated_center$y))
cat("Expected translated center: (50, 50)\n")
cat(sprintf("Actual translated center: (%.2f, %.2f)\n", translated_center$x, translated_center$y))
cat(sprintf("ERROR: (%.2f, %.2f)\n\n",
translated_center$x - 50, translated_center$y - 50))
cat("CONCLUSION:\n")
cat("SVG arcs defined by radius + endpoints do NOT translate correctly\n")
cat("when you only translate the endpoints and keep the radius constant.\n")
cat("The arc center implicitly moves by a DIFFERENT amount than (dx, dy).\n")
|