2013-03-13 15 views
5

シミュレーションのラスタ標高データセット、つまり現実的な標高値の2次元マトリックスを作成する方法を知っている人は誰ですか? Rのjitterは適切ではないようです。 Javaでは/ noise()機能を処理するPerlin noiseアルゴリズム例えば:R/Perlinノイズの現実的なシミュレートされた標高データ

size(200, 200); 
float ns = 0.03; // for scaling 
for (float i=0; i<200; i++) { 
    for (float j=0; j<200; j++) { 
    stroke(noise(i*ns, j*ns) * 255); 
    point(i, j); 
    } 
} 

enter image description here

でこれを実現するしかし、私はR文学におけるパーリンノイズへの参照を発見したしました。前もって感謝します。ここで

+1

でオブジェクトデータを抽出することができます様々なガウスランが走ったドームフィールド)、またはおそらくフラクタル表面:http://www.oceanographerschoice.com/2010/10/fractal-landscapes-in-r-part-two/(これには古いコードがあります) –

+0

クイック検索[いくつかのC++コード](http://www.dreamincode.net/forums/topic/66480-perlin-noise/)を作成します。これは調整が難しいはずはありません。 'Rcpp'を使って直接使用することも、Rに変換することもできます。 – Roland

+0

Thanks Ben、Roland。 oceanograherschoiceブログは、C++を学んでいるように、時間があるときに試してみると便利なようなものです。 – geotheory

答えて

10

あなたは、異なるグリッドサイズの を、それらの行列を追加することによって、より多くのフラクタル構造を持つことができます http://webstaff.itn.liu.se/~stegu/TNM022-2005/perlinnoiselinks/perlin-noise-math-faq.html

perlin_noise <- function( 
    n = 5, m = 7, # Size of the grid for the vector field 
    N = 100, M = 100 # Dimension of the image 
) { 
    # For each point on this n*m grid, choose a unit 1 vector 
    vector_field <- apply(
    array(rnorm(2 * n * m), dim = c(2,n,m)), 
    2:3, 
    function(u) u/sqrt(sum(u^2)) 
) 
    f <- function(x,y) { 
    # Find the grid cell in which the point (x,y) is 
    i <- floor(x) 
    j <- floor(y) 
    stopifnot(i >= 1 || j >= 1 || i < n || j < m) 
    # The 4 vectors, from the vector field, at the vertices of the square 
    v1 <- vector_field[,i,j] 
    v2 <- vector_field[,i+1,j] 
    v3 <- vector_field[,i,j+1] 
    v4 <- vector_field[,i+1,j+1] 
    # Vectors from the point to the vertices 
    u1 <- c(x,y) - c(i,j) 
    u2 <- c(x,y) - c(i+1,j) 
    u3 <- c(x,y) - c(i,j+1) 
    u4 <- c(x,y) - c(i+1,j+1) 
    # Scalar products 
    a1 <- sum(v1 * u1) 
    a2 <- sum(v2 * u2) 
    a3 <- sum(v3 * u3) 
    a4 <- sum(v4 * u4) 
    # Weighted average of the scalar products 
    s <- function(p) 3 * p^2 - 2 * p^3 
    p <- s(x - i) 
    q <- s(y - j) 
    b1 <- (1-p)*a1 + p*a2 
    b2 <- (1-p)*a3 + p*a4 
    (1-q) * b1 + q * b2 
    } 
    xs <- seq(from = 1, to = n, length = N+1)[-(N+1)] 
    ys <- seq(from = 1, to = m, length = M+1)[-(M+1)] 
    outer(xs, ys, Vectorize(f)) 
} 

image(perlin_noise()) 

Perlin noise

での説明以下のR、 で実装したものです。

a <- .6 
k <- 8 
m <- perlin_noise(2,2,2^k,2^k) 
for(i in 2:k) 
    m <- m + a^i * perlin_noise(2^i,2^i,2^k,2^k) 
image(m) 
m[] <- rank(m) # Histogram equalization 
image(m) 

Perlin noise, Sum with different grid sizes

+0

Spot on Vincent :)私は他の実装を2〜3時間かけて過ごしました。このコードは私のものよりはるかにエレガントです!必要に応じて帰属する人物を知っていますか? – geotheory

+0

編集にも感謝します。私は、_high_と_low_極点がお互いに隣り合っているところで、繰り返しブリップすることに興味を持っています。モデルはこれらの点を除いて完璧に見える。 – geotheory

+2

このアーチファクトは、ベクトルを正規化するときに、「sqrt」が欠落していたためです。私はそれを修正し、それに応じてプロットを更新しました。 –

0

代替方法:

require(geoR) 
sim <- grf(441, grid="reg", cov.pars=c(1, .25)) 
image(sim, col=gray(seq(1, .1, l=30))) 

enter image description here

ワイドをシミュレートするための `RandomFields`パッケージ(方法のいずれかを参照cbind(sim[[1]], z = sim[[2]])

関連する問題