4

ボロノイ分割を使用しています。テッセレーションの領域を表すさまざまなポリゴンがあります。

以下のポイントは、図のテッセレーションを描画するために使用されます。

tessdata
    [,1]       [,2]
1  -0.4960583 -0.3529047
2  -2.4986929  0.8897895
3   3.6514561 -1.3533369
4  -1.7263101 -5.5341202
5   2.2140143  0.3883696
6  -2.5208933 -1.4881461
7  -3.2556913  4.4535629
8   0.6423109 -2.8350062
9  -0.4160715  1.2676151
10  4.4059361  4.5641771

tessdata以下のようにテッセレーションを描画するための入力として使用します。

library(deldir)
dd<-deldir(tessdata[,1], tessdata[,2])
plot(dd,wlines="tess")

ここに画像の説明を入力してください

サモンの座標は以下の通りです。

       [,1]        [,2]
1   3.14162704 -1.45728604
2   2.35422623  2.46437927
3  -0.85051049  2.71503294
4   1.94310458 -0.45936958
5   0.08737757  3.74324701
6   1.23007799  1.34443842
7   0.01571924  2.19322032
8   1.43320754  2.64818631
9  -0.05463431  0.66980876
10   1.51344967  5.03351176

サモン座標点を入力するテッセレーションを作成したい。これらのポイントを使用したテッセレーションは、図の領域の1つ内にある必要があります。そのためには、上記のポイントをスケーリングするか、上の図の領域の1つ内のテッセレーションのプロットを制限できます。

必要なデータをすべて網羅したことを願っています。

PS:

sammonのプロジェクションは「MASS」パッケージで提供されます。「deldir」パッケージからのボロノイ分割。

deldir関数出力のdirsgs引数は、テッセレーションの線を形成する点の座標を示します。

パッケージグラフィックスのセグメント関数を使用して、dirsgsから座標が抽出された2つのポイントを結合できます。

4

1 に答える 1

6

ポイントの2番目のセットをテッセレーションのタイルの1つに制限する場合はtile.list、各タイルの説明を使用して、このタイルにあるポイントを確認できます(これを行うには多くの機能があります。次の例では、を使用しますsecr::pointsInPolygon)。

# Sample data
x <- matrix( rnorm(20), nc = 2 )
y <- matrix( rnorm(1000), nc=2 )

# Tessellation
library(deldir)
d <- deldir(x[,1], x[,2])
plot(d, wlines="tess")

# Pick a cell at random 
cell <- sample( tile.list(d), 1 )[[1]]
points( cell$pt[1], cell$pt[2], pch=16 )
polygon( cell$x, cell$y, lwd=3 )

# Select the points inside that cell
library(secr)
i <- pointsInPolygon(
  y, 
  cbind( 
    c(cell$x,cell$x[1]), 
    c(cell$y,cell$y[1])
  )
)
points(y[!i,], pch=".")
points(y[i,], pch="+")

# Compute a tessellation of those points
dd <- deldir(y[i,1], y[i,2])
plot(dd, wlines="tess", add=TRUE)

別のテッセレーションのセル内のテッセレーション

代わりに、ポイントを変換して再スケーリングしてタイルに合わせる場合は、注意が必要です。

ポイントがタイルからどれだけ離れているかを何らかの方法で見積もる必要があります。この目的のために、計算するいくつかの補助関数を定義しましょう。最初にポイントからセグメントまでの距離、次にポイントからポリゴンまでの距離です。

distance_to_segment <- function(M, A, B) {
  norm <- function(u) sqrt(sum(u^2))
  lambda <- sum( (B-A) * (M-A) ) / norm(B-A)^2
  if( lambda <= 0 ) {
    norm(M-A)
  } else if( lambda >= 1 ) {
    norm(M-B)
  } else {
    N <- A + lambda * (B-A)
    norm(M-N)
  }
}
A <- c(-.5,0)
B <- c(.5,.5)
x <- seq(-1,1,length=100)
y <- seq(-1,1,length=100)
z <- apply(
  expand.grid(x,y), 
  1, 
  function(u) distance_to_segment( u, A, B )
)
par(las=1)
image(x, y, matrix(z,nr=length(x)))
box()
segments(A[1],A[2],B[1],B[2],lwd=3)

library(secr)
distance_to_polygon <- function(x, poly) {
  closed_polygon <- rbind(poly, poly[1,])
  if( pointsInPolygon( t(x), closed_polygon ) )
    return(0)
  d <- rep(Inf, nrow(poly))
  for(i in 1:nrow(poly)) {
    A <- closed_polygon[i,]
    B <- closed_polygon[i+1,]
    d[i] <- distance_to_segment(x,A,B)
  }
  min(d)
}
x <- matrix(rnorm(20),nc=2)
poly <- x[chull(x),]
x <- seq(-5,5,length=100)
y <- seq(-5,5,length=100)
z <- apply(
  expand.grid(x,y), 
  1, 
  function(u) distance_to_polygon( u, poly )
)
par(las=1)
image(x, y, matrix(z,nr=length(x)))
box()
polygon(poly, lwd=3)

これで、フォームの変換を探すことができます

x --> lambda * x + a
y --> lambda * y + b

これにより、ポリゴンまでの(2乗の合計)距離が最小化されます。これは実際には十分ではありません。スケーリング係数ラムダがゼロに等しい(またはゼロに近い)結果になる可能性があります。これを回避するために、ラムダが小さい場合にペナルティを追加できます。

# Sample data 
x <- matrix(rnorm(20),nc=2)
x <- x[chull(x),]
y <- matrix( c(1,2) + 5*rnorm(20), nc=2 )
plot(y, axes=FALSE, xlab="", ylab="")
polygon(x)

# Function to minimize:
# either the sum of the squares of the distances to the polygon, 
# if at least one point is outside, 
# or minus the square of the scaling factor.
# It is not continuous, but (surprisingly) that does not seem to be a problem.
f <- function( p ) {
  lambda <- log( 1 + exp(p[1]) )
  a <- p[2:3]
  y0 <- colMeans(y)
  transformed_points <- t( lambda * (t(y)-y0) + a )
  distances <- apply(
    transformed_points, 
    1, 
    function(u) distance_to_polygon(u, x)
  )
  if( all(distances == 0) ) - lambda^2
  else                      sum( distances^2 )
}
# Minimize this function
p <- optim(c(1,0,0), f)$par
# Compute the optimal parameters
lambda <- log( 1 + exp(p[1]) )
a <- p[2:3]
y0 <- colMeans(y)
# Compute the new coordinates
transformed_points <- t( lambda * (t(y)-y0) + a )
# Plot them
segments( y[,1], y[,2], transformed_points[,1], transformed_points[,2], lty=3 )
points( transformed_points, pch=3 )
library(deldir)
plot( 
  deldir( transformed_points[,1], transformed_points[,2] ), 
  wlines="tess", add=TRUE 
)

一連のポイントをシフトおよび再スケーリングして、ポリゴン内に配置します

于 2013-02-13T23:09:30.757 に答える