見出し画像

多次元を一次元に変換する

今後紹介するインジケータ内で使用する関数の説明を

あらかじめしておきたいと思います。

多次元の一般的な感覚

0次元は点であり

点を繋げていくと線が出来上がりそれが1次元です。

さらに無数の線を平行に隙間なく並べていくと面が出来上がり2次元となります。

これが私達が、もつ2次元のイメージですよね。

しかしちょっと工夫をします。

2次元の別のなりたち方

画像1

紙は薄っぺらいので真横から見ると、一本の線に見えます。

その紙を巻いてみましょう。

すると、ロール状(円柱)になります。

それを改めて、真横から見ると円が出来上がっています。

円というのは面ですよね。


線(1次元)であったものが巻くことで面(2次元)になりました。

1次元が2次元に変換されたのです。

このからくりで関数を作ります。

平面座標

本来は特定の座標は、縦yと横xの2つのデータによって

成り立っています。したがって

(x,y)といったような表記がなされます。(0,0)付近はこんな感じの配置です。


$$
\begin{array}{ccc}
(-1, 2)& ( 0, 2) & ( 1, 2) \\(-1, 1)& ( 0, 1) & ( 1, 1)\\
(-1, 0) & ( 0, 0) & ( 1,  0)\\
(-1,-1) & ( 0,-1) & ( 1, -1)\\
\end {array}
$$

渦巻状に

$$
\begin{array}{ccc}
→ & → & →\\↑& → & ↓\\
↑ & ↑& ↓\\
↑ & ← & ← \\
\end {array}
$$

番号を割り振って置き換えると

$$
\begin{array}{ccc}
9 & 10 & 11 \\8& 1 & 2\\
7 & 0 & 3\\
6 & 5 & 4 \\
\end {array}
$$

となります。

(0,0) … 0

(0,1) … 1

(1,1) … 2

(1,0) … 3

(1,-1) … 4

こんな感じに座標ごとに番号を割り当てることができます。

2つのデータはこのようにすれば1つの値で表すことが可能なのです。


この割当を行う関数を作りました。

hnkn(x,y)=>// (hnkn←henkan←変換)
   xxx=int(x)
   yyy=int(y)
   NNN=max(abs(xxx),abs(yyy))
   OOO=pow(2*NNN,2)
   oOO=pow(2*NNN+1,2)
   OoO=pow(2*NNN-1,2)
   PPP=iff(abs(xxx)-abs(yyy)>=0,1,0)
   pPP=pow((PPP-1),2)
   RRR=iff(xxx>=0,1,0)
   rRR=pow((RRR-1),2)
   SSS=iff(yyy>=0,1,0)
   sSS=pow((SSS-1),2)
   PPP*RRR*(OOO-(yyy-(-xxx)))+PPP*rRR*(oOO-(abs(xxx)+1-yyy))
    +pPP*SSS*(OoO+xxx-(-(yyy-1)))+pPP*sSS*(OOO+abs(yyy)-xxx)

関数名と変数名はテキトーなので

好みのに書き換えてください。そのままでも動きます。

引数x,yはそのままの意味です。出力として番号を吐き出します。



また、逆に番号から座標に戻す関数も作ってあります。

kdk(n,d)=>
   nnn=int(n)
   ddd=iff(int(d)==1,1,0)
   Ddd=pow(ddd-1,2)
   CCC=int(sqrt(nnn))
   DDD=iff(CCC%2==1,1,0)
   dDD=pow(DDD-1,2)
   EEE=pow(CCC+1,2)-(CCC+1)
   FFF=iff(nnn-EEE>=0,1,0)
   fFF=pow(FFF-1,2)
   Ddd*DDD*FFF*((CCC+1)/2)+Ddd*DDD*fFF*((CCC+1)/2-(EEE-nnn))
    +Ddd*dDD*FFF*(-CCC/2)+Ddd*dDD*fFF*(-CCC/2+(EEE-nnn))
     +ddd*DDD*fFF*((CCC+1)/2)+ddd*DDD*FFF*((CCC+1)/2-(nnn-EEE))
      +ddd*dDD*fFF*(-CCC/2)+ddd*dDD*FFF*(-CCC/2+nnn-EEE)

nは番号

dはx,yのどちらを知りたいか指定するための引数。xを指定するなら0

yを指定するなら1を入れます。


この記事が気に入ったらサポートをしてみませんか?