Plucker座標

  • 3次元空間の直線を考える
  • 直線上の2点のユークリッド座標を決めれば、その直線上の点の座標を計算することができる
  • 別の方法で直線に座標を与えたい
  • 2点のユークリッド座標の代わりに、その斉次座標を考える
  • この2点は、(x_0:x_1:x_2:x_3),(y_0:y_1:y_2:y_3)と4つの値の組で表現できる
  • 射影幾何的には、(x_1/x_0,x_2/x_0,x_3/x_0)が等しい点の集合が原点を通る4次元空間の直線ともみなせる
  • 今、3次元空間の2点を通る直線を考えると、第1点の自由度は3、方向ベクトルを定めると、自由度は2なので、併せて自由度は5
  • 斉次座標的に自由度5のものを定めるには、6つの値の組であればよいことになる
  • その作り方が以下のようになる
  • \begin{pmatrix} x_i, y_i \\ x_j,y_j \end{pmatrix}; 0 \le i < j \le 3なる2x2行列を6個、作る
  • それぞれの2x2座標の行列式 x_i y_j - x_j y_iの値を取ると、6個の値が作れる
  • 並べ方は(p_{01}:p_{02}:p_{03}:p_{23}:p_{31}:p_{12})。ただし、p_{31} = -p_{13}は、i > j行列式になっている
  • この6個の値の組をPlucker 座標と言う
  • また、この6個の値の組の代わりに\begin{pmatrix} x_i,y_i \\ x_j y_j \end{pmatrix}; 0 \le i , j \le 3なる2x2行列を16個、作り、4x4行列の成分とする
  • その4x4行列の成分m_{i,j} = \begin{pmatrix} x_i,y_i \\ x_j y_j \end{pmatrix}とすると、対角成分は0で、反対称行列になる。したがって、情報は冗長で、あくまでも6つの値で決まる行列であるが、反対称行列が出てくるところが、団代数的。
  • ちなみに、この直線をある2点の斉次座標から定めたが、別の2点のペアから始めても、得られる6つの値の組は「同じようなもの」にならなければ、この方法がうまく行っていることにはならない
  • 別の2点の斉次座標は、最初の2点の斉次座標の線形和で表される(射影幾何のルール)。しかも線形独立
  • そのような別の2点の斉次座標から、2x2行列を取り出してその行列式を計算すると、元の対応する行列式にある値をかけたものになっており、その「ある値」は、2x2行列の取り出し方によらず同じである(ちなみにその「ある値」は、はじめの2点の斉次座標を並べた4x2行列Mと、別の2点の4x2行列M’との間に、M' = M \Lambdaと言う関係がある(ただし\Lambdaは2x2行列)ときの、\Lambda行列式になっている。これは、正方行列が積の関係A = B Cのとき、det(A) = det(B) \times det(C)であることからわかる
    • このM' = M \Lambdaと表せることが、「別の2点の斉次座標は、元の2点の斉次座標の線形和」ということ
  • この意味で、6つの値のペアは、どんな2点をとっても、その比は同じと言う意味で斉次座標的な性質になっている
  • ちなみに、Plucker 座標系は、グラスマン座標系の特別な場合(Mathwordlの記事参照)
    • グラスマン多様体は、n次元空間に張られる、0,1,2,...,n次元線形部分空間を全部ひっくるめたもの
    • 特定のk次元部分空間をまとめたものをG(k,n)と書く
    • このとき、_nC_k個の、det(kxk行列)がグラスマン多様体
    • Plucker座標は、k= 2のときで、3次元空間の場合は、n=3だから、_3 C_2 = 6だから、6変数座標
# plucker座標算出関数
my.plucker <- function(x0,y0){
  X0 <- c(1,x0)
  Y0 <- c(1,y0)
  
  M0 <- cbind(X0,Y0)
  
  p.id <- rbind(c(1,2),c(1,3),c(1,4),c(3,4),c(4,2),c(2,3))
  p0 <- rep(0,6)
  for(i in 1:6){
    tmp <- M0[p.id[i,],]
    p0[i] <- det(tmp)
  }
  p0
}

my.plucker.matrix <- function(M0){
 
  p.id <- rbind(c(1,2),c(1,3),c(1,4),c(3,4),c(4,2),c(2,3))
  p0 <- rep(0,6)
  for(i in 1:6){
    tmp <- M0[p.id[i,],]
    p0[i] <- det(tmp)
  }
  p0
}
# 直線を通る2点
x0 <- rnorm(3)
y0 <- rnorm(3)
p0 <- my.plucker(x0,y0)
p0
# この直線を通る別の2点

t <- rnorm(2)

x1 <- x0 + t[1] * (y0-x0)
y1 <- x0 + t[2] * (y0-x0)

p1 <- my.plucker(x1,y1)
p1

p1/p0

## 線形変換

M0 <- cbind(c(1,x0),c(1,y0))

n.pt <- 100
ps <- matrix(0,n.pt,6)
Lambdas <- list()
for(i in 1:n.pt){
  tmp <- matrix(rnorm(4),2,2)
  Lambdas[[i]] <- tmp
  Mtmp <- M0 %*% tmp
  ps[i,] <- my.plucker.matrix(Mtmp)
}

ratio.rows <- apply(log(abs(ps)),2,diff)
range(apply(ratio.rows,1,diff))