我有一个2维的单位网格,以及一组以任何有理数开始和结束的线段。我需要一种有效的方法来计算线路经过的网格单元。例如,行:
从(2.1,3.9)到(3.8,4.8)通过左下点(2,3),(2,4)和(3,4)的网格单元格。
是否有一种快速有效的方法从线路的端点计算这些象限?
我将在R工作,但Python或伪代码的答案也可以。谢谢!
答案 0 :(得分:8)
使用空间数据的人总是处理这类问题,因此可能值得捎带他们的努力。这是一个使用R的栅格包(以及它所依赖的 sp 包中的函数)的解决方案:
library(raster)
## Create a SpatialLines object
a <- c(2.1, 3.9)
b <- c(3.8, 4.8)
## Method #1 -- Uses functions from the sp package.
SL <- SpatialLines(list(Lines(list(Line(rbind(a,b))), "ab")))
## Method #2 -- Uses readWKT() from the rgeos package. Easier to read.
# library(rgeos)
# string <- paste0("LINESTRING(", paste(a, b, collapse=", "), ")")
# SL <- readWKT(string)
## Create a raster object
m <- 10
n <- 10
mat <- matrix(seq_len(m*n), nrow = m, ncol = n)
r <- raster(mat, xmn = 0, xmx = n, ymn = 0, ymx = m)
## Find which cells are intersected & get coordinates of their lower-left corners
ii <- extract(r, SL, cellnumbers=TRUE)[[1]][, "cell"]
floor(xyFromCell(r, ii))
# x y
# [1,] 2 4
# [2,] 3 4
# [3,] 2 3
## Confirm that this is correct with a plot
image(r)
plot(as(rasterize(SL, r), "SpatialPolygons"),
border = "darkgrey", lwd = 2, add = TRUE)
lines(SL)
答案 1 :(得分:0)
我会建议Bresenham's line algorithm(或相关的Wu's algorithm)的一些变体。这些代码广泛用于计算机图形绘制线条,应该适应您的特定需求(如非整数端点)。