はじめに
てきとうな2点を結んで直線にしたときに
直線が斜めになっていたり原点から離れていたりして困ることはありませんか?
OutSystemsを使って任意の2点(直線)を原点と(x,0)に戻す処理を作りたいと思います。
※ただし x>0とします。
計算方法
概要
- 1点を原点に平行移動、もう1点も同様に平行移動
- y=0と平行移動した2点からSinθ,Cosθを算出
- 回転
詳しくは下で書きます。
1.点の平行移動
- 任意の2点(a,b),(c,d)を選択
- 原点に平行移動する点を(a,b)とし、2点ともx軸方向に-a,y軸方向に-bだけ平行移動
2.sinθとcosθの算出
平行移動した2点(0,0),(c-a,d-b)と(c-a,0)から三角比を使ってSinθ,Cosθ(符号あり)を算出
3.回転
θ回転する行列は
\begin{pmatrix}
X \\
Y
\end{pmatrix}
=
\begin{pmatrix}
\cos\theta & -\sin\theta \\
\sin\theta & \cos\theta
\end{pmatrix}
\begin{pmatrix}
x\\
y
\end{pmatrix}
ですが、今回は平行移動させた2点を原点と(x,0)に戻すために逆回転(-θ回転)をしたいのでこちらを使います。
\begin{pmatrix}
X \\
Y
\end{pmatrix}
=
\begin{pmatrix}
\cos\theta & \sin\theta \\
-\sin\theta & \cos\theta
\end{pmatrix}
\begin{pmatrix}
x\\
y
\end{pmatrix}
逆回転
逆回転は回転する角度がθから-θになるので
\begin{pmatrix}
\cos(-\theta) & -\sin(-\theta) \\
\sin(-\theta) & \cos(-\theta)
\end{pmatrix}
=
\begin{pmatrix}
\cos\theta & \sin\theta \\
-\sin\theta & \cos\theta
\end{pmatrix}
となります。
これを前提として
- 求めたSinθとCosθを逆回転行列に代入
- 逆回転行列を使って計算して(X,Y)=(xCosθ+ySinθ,-xSinθ+yCosθ)を算出
実装
計算方法で説明した処理は、OutSystems内のアクションとして作成します。
・平行移動の処理:「ParallelMove」アクション
・SinθとCosθを算出する処理:「CosSin」アクション
・回転する処理:「RotateMove」アクション
作成した処理を下に貼ります。
それぞれの処理のinputとoutput
ParallelMove・input:任意の2点
・output:平行移動した点
CosSin
・input:平行移動した2点
・output:SinθとCosθ
RotateMove
・input:平行移動した2点,SinθとCosθ
・output:回転した2点
実行
4回とも2つの点が原点と(x,0)になっていることを確認できました。
簡単な説明
・PointX1,PointY1,PointX2,PointY2:座標・RotateOriginX,RotateOriginY:回転後の原点
・RotateOtherX,RotateOtherY:回転後のもう1点
さいごに
今回は2点(直線)でやりましたが他の図形にも応用できると思います。