【问题标题】:Efficient way to calculate grid quadrants a line passes through计算线通过的网格象限的有效方法
【发布时间】:2012-11-28 13:01:34
【问题描述】:

我有一个二维单位网格,以及一堆以任意有理数开始和结束的线段。我需要一种有效的方法来计算线穿过哪些网格单元。例如,这行:

从 (2.1, 3.9) 到 (3.8, 4.8) 穿过具有左下点 (2, 3)、(2, 4) 和 (3, 4) 的网格单元。

有没有一种快速有效的方法来从线的端点计算这些象限?

我将在 R 中工作,但 Python 或伪代码中的答案也可以。谢谢!

【问题讨论】:

  • 您可能是指网格 cells 而不是 quadrants
  • 谢谢,是的,你可以称它们为细胞。有什么建议吗?
  • stackoverflow.com/questions/11694886/traverse-a-2-5d-grid 的可能重复项(忽略 z 部分)。
  • 嗨 lhf 看起来像一个类似的问题,但我不知道任何 c++。您是否有机会将其翻译成 R 或伪代码并作为答案发布?

标签: python r pseudocode


【解决方案1】:

从事空间数据工作的人们一直在处理这类问题,因此可能值得支持他们的努力。这是一个使用 R 的 raster 包(以及它所依赖的 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)

【讨论】:

  • 很好,我不知道 extract 可以做到这一点,它会挑选出线下的所有单元格,并且似乎也可以处理零长度线。
  • @mdsumner -- 很高兴知道这一点,但我并不感到惊讶:raster 是一个结构良好的包,ennit?
  • 不错的答案 - 尽管SpatialLines(list(Lines(list(Line(rbind(a,b))), "ab"))),这条线一定是我最近看到的比较迟钝的线之一
  • @thelatemail -- 这更好吗? library(rgeos); string &lt;- paste0("LINESTRING(", paste(a, b, collapse=", "), ")"); SL &lt;- readWKT(string)
  • 哈哈,有人需要写一些更简单的包装“向量”,但这样可以允许每个对象内有多个几何图形。不明显如何使包装器普遍有用
【解决方案2】:

我会建议Bresenham's line algorithm(或相关的Wu's algorithm)的一些变体。这些代码在计算机图形学中广泛用于绘制线条,并且应该能够适应您的特定需求(例如非整数端点)。

【讨论】:

  • Bresenham 的算法没有找到该段穿过的所有单元格。
  • 您好,谢谢,但据我所知,Bresenham 并没有得到线通过的每一个细胞,而且 Wu 得到的细胞比直接通过的更多。
  • 我认为修改其中一个或两个来工作很容易。例如,在 Brasenham's 中,您可以在增加 y 的任何时候标记两个像素(除非该线正好穿过四个单元格之间的角)。我会尝试用 Python 来实现。
猜你喜欢
  • 1970-01-01
  • 2020-01-25
  • 2017-06-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
相关资源
最近更新 更多