2012-12-11 3 views
6

私は2次元単位格子と任意の有理数で始まりそして終わる線分の束を持っています。ラインが通過するグリッドセルを計算する効率的な方法が必要です。たとえば、行:グリッド象限を計算する効率的な方法は、行が通過する

(2.1,3.9)から(3.8,4.8)は、左下点(2,3)、(2,4)、(3,4)のグリッドセルを通過します。

ラインのエンドポイントからこれらの象限を計算するための迅速、効率的な方法はありますか?

私はRで作業することがありますが、Pythonや擬似コードで答えがあまりにも動作します。ありがとう!

+4

あなたはおそらく*代わりに*象限*のグリッド*細胞を意味します。 – lhf

+0

ありがとう、あなたはそれらを細胞と呼ぶことができます。助言がありますか? –

+0

http://stackoverflow.com/questions/11694886/traverse-a-2-5d-grid(zの部分を無視する)の可能な複製。 – lhf

答えて

7

人々。ここでは(それが依存しているSPパッケージと機能)Rのラスタパッケージを使用するソリューションです:

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) 

enter image description here

+0

ありがとうジョシュはうまく動作します! –

+0

ニース、私は抽出がこれを行うことができなかった、それはラインの下のすべての細胞を選び出し、ゼロ長のラインも処理するようです。 – mdsumner

+0

@mdsumner - それを知っていて嬉しいですが、**驚くことではありません:**ラスター**は驚くほどよく構築されたパッケージです、ennit? –

0

私はBresenham's line algorithm(または関連Wu's algorithm)のいくつかのバリエーションをお勧めします。これらのコードは、線を描くためにコンピュータグラフィックスで広く使用されており、特定のニーズ(非整数のエンドポイントなど)に適応できる必要があります。それは彼らの努力の上にピギーバッキング価値があるかもしれので、質問のこの種のすべての時間と空間データの契約で作業

+0

Bresenhamのアルゴリズムでは、セグメントが交差するすべてのセルが見つかりません。 – lhf

+0

こんにちは、私はBresenhamのラインが通過するすべての単一の細胞を取得していないと言うことができますが、呉さんは直接通過したものよりも多くの細胞を取得します。 –

+0

私はそれが動作するように片方または両方を変更するのは簡単だと思います。たとえば、Brasenham'sでは、yをインクリメントするたびに(ピクセルが4つのセルの間の角を正確に通過しない限り)、両方のピクセルにマークを付けることができます。私はPythonで実装を試してみるつもりです。 – Blckknght

関連する問題