我无法理解计算atan2
并将 a 放置geom_arc
在预期的一侧。
这是一些带有四对点 ABC 的虚拟数据。我想画四个弧线,每个弧线都在角度较小的一侧并打印角度。计算角度 dregrees 是可行的,但我需要 1)一些开关来纠正atan2
和/或 2)另一个开关将弧放在预期的一侧。只是交换start
,end
没有任何效果。
tmp <- tibble(xA = c(11, 14, 11, 14), yA = c(8, 8, 7, 7),
xB = c(10, 15, 10, 15), yB = c(10, 10, 5, 5),
xC = c(8, 17, 8, 17), yC = c(11, 11, 4, 4))
tmp <- tmp %>%
# dAB = distance between A and B (same as distance BC)
mutate(dAB = sqrt((xA - xB)^2 + (yA - yB)^2)) %>%
mutate(dBC = sqrt((xB - xC)^2 + (yB - yC)^2)) %>%
# calculate atan AB for arc start
mutate(arcAB = atan2(yA - yB, xA - xB)) %>%
# calculate atan BC for arc end
mutate(arcBC = atan2(yC - yB, xC - xB)) %>%
# calculate angle degree
mutate(arc_deg = round((arcBC * (180 / pi)) - (arcAB * (180 / pi)), 1)) %>%
mutate(arc_deg = case_when(
arc_deg > 180 ~ arc_deg - 360,
arc_deg < -180 ~ arc_deg + 360,
TRUE ~ arc_deg)) %>%
# calculate position for angle dreeg text
mutate(xAC = (xA + xC) / 2) %>%
mutate(yAC = (yA + yC) / 2)
tmp
ggplot(tmp) +
geom_segment(aes(x = xB, xend = xA, y = yB, yend = yA), size = 1, col = "blue") +
geom_segment(aes(x = xB, xend = xC, y = yB, yend = yC), size = 1, col = "green") +
geom_text(aes(x = xB + 0.2, y = yB), label = "B") +
geom_text(aes(x = xA + 0.2, y = yA), label = "A") +
geom_text(aes(x = xC - 0.2, y = yC), label = "C") +
geom_arc(aes(x0 = xB, y0 = yB, r = dAB, start = arcAB, end = arcBC)) + # plus or minus 2*pi
geom_text(aes(x = xAC, y = yAC, label = paste0(arc_deg, "°"))) +
coord_fixed() + theme_bw()
我已经看到了这一点,左上角的弧线+ 2*pi
会产生预期的效果,但我认为这需要四种不同的方式来涵盖所有情况。
我知道这可能更像是一个数学问题,并考虑在其他地方提出,但最终这是一个应用程序,ggforce::geom_arc
其他人可能有类似的问题。(对我来说,这将是完美的,如果我只需要给出 A、B 和 C 的坐标以及顺时针的起点和终点。)