我無法理解計算atan2并將 ageom_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()
上面的代碼僅適用于右下角的弧:

我已經看到了
這里要意識到的關鍵是:
- 至于
geom_arc而言,0度發生在y軸上(在12點鐘的位置)和正角度是從那里順時針測量。通常在使用三角函式時,我們會將 0 度視為沿 x 軸并逆時針測量。這是背后的假設之一atan2。這意味著您需要按atan2原樣計算atan2([delta x], [delta y])而不是相反(檔案說atan2([delta y], [delta x]),這就是您的代碼的方式)。 - 由于您希望測量兩條線之間的最小角度(即小于 pi 弧度的角度),您需要找出角度之間的哪些差異大于
pi弧度,并在這些情況下添加2 * pi兩個角度中較小的一個. 這確保角度始終低于 pi 弧度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/358907.html
