- 2つのベクトルがあるとする。
- その線形結合としてのようにパラメタ表示することがある
- この場合は、tの値によって、を結んだ直線上に「等間隔」で点を取ることができる
- 今回は、角座標表示で考えて、がなす角から、「角度として等間隔」で点をとりたい
- 掲載図にあるように、のノルムがr1,r2で、ベクトル間の角度は。ただし、掲載図では、を基準として角度を計測しておりはを意味している
- 間にあるベクトルの位置は、角度で指定してある。このときにの長さがわかればよい
DistSimplex<-function(vs,p,n){# vs:(x,y)coordinates, p:new center, n: 各辺をn等分(角として)する
newvs<-t(t(vs)-p)
r<-sqrt(apply(newvs^2,1,sum))
#outx<-outy<-rep(0,n*length(vs[,1]))
outx<-outy<-matrix(0,length(vs[,1]),n)
counter<-0
deltatheta<-rep(0,length(vs[,1]))
#for(i in 1:length(vs[,1])){
for(i in 1:18){
st<-i
end<-i+1
if(i==length(vs[,1])){
end<-1
}
if(r[st]!=0 & r[end]!=0){
cosst<-newvs[st,1]/r[st]
sinst<-newvs[st,2]/r[st]
cosend<-newvs[end,1]/r[end]
sinend<-newvs[end,2]/r[end]
tst<-ThetaAngle(cosst,sinst)
tend<-ThetaAngle(cosend,sinend)
difft<-tend-tst
if(difft>=0 & difft <=pi){
}else if(difft > pi & difft<=2*pi){
difft<-(-1)*(2*pi - difft)
}else if(difft<0 & difft >=-pi){
}else if(difft< -pi & difft >= -2*pi){
difft<-2*pi+difft
}
deltatheta[i]<-difft
#if(difft<0){
#difft<-difft+2*pi
#}
#print(difft)
ts<-tst+difft*(0:(n-1))/n + difft/(2*n)
newt1<-tst-ts
newt2<-tend-ts
newrs<-r[st]*r[end]/(r[st]*sin(newt1)-r[end]*sin(newt2)) * sin(difft)
#if(i!=0){
#par(new=TRUE)
#}
#plot(newrs*cos(ts),newrs*sin(ts))
#outx[(counter+1):(n*i)]<-newrs*cos(ts)
#outy[(counter+1):(n*i)]<-newrs*sin(ts)
outx[i,]<-newrs*cos(ts)
outy[i,]<-newrs*sin(ts)
}
counter<-n*i
plot(outx,outy)
}
return(list(x=outx+p[1],y=outy+p[2],p=p,n=n,rp<-sqrt(outx^2+outy^2),deltatheta=deltatheta))
}