埋め尽くし

  • 正方形のタイルで平面を埋め尽くすのはタイリングの一種
  • 正三角形のタイルで平面を埋め尽くすのもタイリングの一種
  • 正三角形は正単体の一つ
  • 正単体での埋め尽くし・タイリングとは?
  • 頂点数2の正単体が1次元空間でタンデムに並んでいるのは、1次元空間の1正単体による埋め尽くし
  • 頂点数3の正単体(正三角形)が2次元空間でタイリングしていれば、2次元空間の2正単体による埋め尽くし
  • 頂点数4の正単体(正四面体)が3次元空間で並びつくせば、3次元空間の3正単体による埋め尽くし
  • 頂点数nの正単体がn-1次元空間で並びつくせば、n-1次元空間のn-1正単体による埋め尽くし
  • 埋め尽くしが部分的であれば、辺縁が生じる
  • 並んだタイルの辺縁は「多次元折れ線(折れ面)の角」に当たる頂点を列挙すれば決まる(包の頂点)
  • 1次元の場合は、両端
  • 2次元の場合は2次元面上の多角形の頂点
  • 辺縁決定頂点を列挙すれば決まるのであれば、それ以外の点は「ないものとして省略」できる
  • こうすれば、複体の省略表現ができる
  • 必要な情報は、k次元超多角形をその次元と頂点集合とで列挙すること
    • {\{1,4,5,7,6 | k_1=2\},\{1,2,9,13,15|k_2=4\},\{6,20|k_31\}\}など
    • この情報から、k次元超次元多角形同士の隣接状態は復元できる(復元できないようなら、復元できるように記法を工夫する)
  • 二次元三角形タイル敷き詰めから、中抜きをしてみる処理の試作品
library(igraph)
n <- 8
m <- matrix(sample(0:1,n^2,replace=TRUE),n,n)
m <- sign(m+t(m))
diag(m) <- 0
m[upper.tri(m)] <- 0

m <- matrix(0,n,n)
for(i in 1:(n-1)){
	m[i,i+1] <-m[i+1,i] <-1
}

k <- 5
n <- sum(1:k)
m <- matrix(0,n,n)
for(i in 2:k){
	tmp <- (sum(1:(i-1)) + 1):sum(1:i)
	#print(tmp)
	for(j in 1:length(tmp)){
		target <- c(tmp[j]-(i-1)-1,tmp[j]-(i-1))
		if(j ==length(tmp)){
			target <- target[1]
		}else if(j==1){
			target <- target[2]
		}
		if(j>1){
			target <- c(target,tmp[j]-1)
		}
		#print(target)
		m[tmp[j],target] <- 1
	}
}

m <- sign(m+t(m))

m.ori <- m
g.ori <- graph.adjacency(m.ori,mode="undirected")
plot(g.ori)


todo <- rep(1,n)
max.iter <- 100
cnt.iter <- 1
m.list <- list()
m.list[[1]] <- m.ori
while(sum(todo)>0 & cnt.iter < max.iter){
	current.m <- m.list[[cnt.iter]]
	cnt.iter <- cnt.iter + 1
	s <- sample(which(todo==1))
	for(i in 1:length(s)){
		#es <- m[s[i],]
		es <- which(m[s[i],]==1)
		n.e = length(es)
		#n.e <- sum(es)
		if(n.e < 2){
			todo[s[i]] <- 0
		}else{
			n.max <- (1+sqrt(1+8*n.e))/2
			#n.max <- 6
			ok.n.e <- seq(from=2,to=n.max,by=1)
			this <- which(ok.n.e*(ok.n.e-1) == n.e)
			print(n.max)
			print(ok.n.e)
			print(n.e)
			print(this)
			if(length(this)>0){
				print("potential")
				tmp.m <- m.list[[cnt.iter-1]][es,es]
				tmp.m <- sign(tmp.m+t(tmp.m))
				print(tmp.m)
				n.e.each <- apply(tmp.m,1,sum)
				if(all(n.e.each == 2*(this+1-2))){
					if(n.e>2){
						current.m[s[i],] <- current.m[,s[i]] <- 0
						#current.m[c(s[i],es),c(s[i],es)] <- 0
						todo[s[i]] <- 0
					}
				}
			}
			
		}
	}
	m.list[[cnt.iter]] <- current.m
	#cnt.iter <- cnt.iter+1
}
g <- graph.adjacency(m.list[[2]],mode="undirected")

par(mfcol=c(1,2))
plot(g.ori)
plot(g)