gpt4 book ai didi

r - 沿一个方向偏移多段线

转载 作者:行者123 更新时间:2023-12-04 14:01:30 26 4
gpt4 key购买 nike

我正在寻找一种在一个方向(在 R 中)偏移通过 xy 坐标定义的任意曲线的方法。我可以使用 {polyclip} 包在两个方向上偏移曲线。

library(polyclip)
#> polyclip 1.10-0 built from Clipper C++ version 6.4.0

# Make a curve
t <- seq(10, 0, by = -0.05)
curve <- data.frame(
x = t * cos(t), y = t * sin(t)
)
plot(curve, type = 'l')

# Find offset
offset <- polylineoffset(curve, delta = 0.5,
jointype = "round", endtype = "openbutt")[[1]]
offset <- as.data.frame(offset) # xy coordinates

lines(offset, col = "red")

因为曲线上的点比偏移量的 delta 间距更近参数,我可以通过找出一个点和下一个点之间的距离最大的地方来启发式地分割偏移量。
distance <- c(0, sqrt(diff(offset$x)^2 + sqrt(diff(offset$y)^2)))
max_dist <- which.max(distance)

plot(curve, type = 'l')
lines(offset[1:(max_dist - 1), ], col = 3)
lines(offset[max_dist:nrow(offset), ], col = 4)

创建于 2021-11-11 由 reprex package (v2.0.1)
但是,我希望能够分割偏移量,或仅在一个方向上偏移,即使曲线上的点比偏移距离更远。有没有办法在R中做到这一点?我不喜欢 {polyclip} 包,使用另一个包的解决方案也很好。

最佳答案

不需要额外的包 Teunbrand - 这可以通过一个小的触发函数来完成:

offset <- function(x, y, d) {
angle <- atan2(diff(y), diff(x)) + pi/2
angle <- c(angle[1], angle)
data.frame(x = d * cos(angle) + x, y = d * sin(angle) + y)
}
所以,如果我们重新创建你的例子,我们有:
t <- seq(10, 0, by = -0.05)

curve <- data.frame(
x = t * cos(t), y = t * sin(t)
)

plot(curve, type = 'l')
enter image description here
我们可以添加一个偏移量:
curve2 <- offset(curve$x, curve$y, 0.5)

lines(curve2, col = "red")
enter image description here
此函数的工作方式是使用 atan2([delta y], [delta x]) 获取直线上每个点的斜率角度。 ,然后添加 90 度以找到与该点的曲线垂直的直线的角度。最后,它找到距离 d 的点。沿着这条线从原始 x, y 坐标,即 (x + d * cos(angle), y + d * sin(angle))这可能最好以图形方式显示。这里的蓝线是函数 offset计算的偏移量:
segments(curve$x, curve$y, curve2$x, curve2$y, col = "blue")
enter image description here
我们可以通过简单地传递一个负值 d 来向相反的方向偏移。 :
lines(offset(curve$x, curve$y, -0.5), col = "forestgreen")
enter image description here
我们需要注意定义偏移的含义的局限性,特别是当偏移与绘图的任何凹入部分相比较大时。例如,如果我们查看 -2 的偏移量,我们似乎在螺旋中心有一个伪像:
plot(curve, type = 'l')
curve3 <- offset(curve$x, curve$y, -2)
lines(curve3, col = "gray50")
enter image description here
如果我们再次绘制偏移段,我们可以看到为什么会发生这种情况:
segments(curve$x, curve$y, curve3$x, curve3$y, col = "blue")
enter image description here
本质上,如果您有一条紧凹曲线和一个相当大的偏移量,那么偏移线将会交叉。这会产生一些与我们期望看到的“偏移路径”不太匹配的东西,但是如果不仔细定义偏移路径的含义以及我们想要的方式,就很难看到如何解决这个问题它出现在上述情况中。我的猜测是最令人满意的解决方案是缩小 d在否则会超过该点曲线半径的点上,但我不会在这里实现它,因为这只是一种选择,我相信那里有更好的选择。
无论如何,这样做的好处之一是结果中的点数与输入的点数相同。这使得将偏移量放入初始数据帧变得容易。方便构建新的几何体!
创建于 2021-11-12 由 reprex package (v2.0.0)

关于r - 沿一个方向偏移多段线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69935520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com