多次元を一次元に変換する
今後紹介するインジケータ内で使用する関数の説明を
あらかじめしておきたいと思います。
多次元の一般的な感覚
0次元は点であり
点を繋げていくと線が出来上がりそれが1次元です。
さらに無数の線を平行に隙間なく並べていくと面が出来上がり2次元となります。
これが私達が、もつ2次元のイメージですよね。
しかしちょっと工夫をします。
2次元の別のなりたち方
紙は薄っぺらいので真横から見ると、一本の線に見えます。
その紙を巻いてみましょう。
すると、ロール状(円柱)になります。
それを改めて、真横から見ると円が出来上がっています。
円というのは面ですよね。
線(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を入れます。
この記事が気に入ったらサポートをしてみませんか?