• 2つのベクトルv_1,v_2があるとする。
  • その線形結合としてv_x=t v_1 +(1-t) v_2のようにパラメタ表示することがある
  • この場合は、tの値によって、v_1,v_2を結んだ直線上に「等間隔」で点を取ることができる
  • 今回は、角座標表示で考えて、v_1,v_2がなす角から、「角度として等間隔」で点をとりたい
  • 掲載図にあるように、v_1,v_2のノルムがr1,r2で、ベクトル間の角度は\theta2-\theta1。ただし、掲載図では、rxを基準として角度を計測しており\theta1-\theta1を意味している
  • 間にあるベクトルv_xの位置は、角度で指定してある。このときにrxの長さがわかればよい
  • rx=\frac{r1\times r2}{r1\times \sin(\theta1)-r2\times \sin(\theta2)}\sin(\theta1-\theta2)
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))
}