2019年2月3日: Virtuoso、orient の定義と合成のまとめ

# 2019年2月3日: Virtuoso、orient の定義と合成のまとめ

2019年2月3日 19時27分

<p>Virtuoso オブジェクトで使われるオブジェクトの配置の仕方を指定する <code>orient</code> の定義とその合成をまとめた。${\tt MXR90}$ の定義とかよく忘れるし、合成についてはいつも分かんなくなるから。</p>

<h2>定義</h2>

<table>
<tr>
<td>
$$
{\tt R0}=\left(
\begin{matrix}
1 &amp; 0\newline
0 &amp; 1
\end{matrix}
\right)
$$
</td>
<td>
$$
{\tt MX}=\left(
\begin{matrix}
1 &amp; 0\newline
0 &amp; -1
\end{matrix}
\right)
$$
</td>
</tr>
<tr>
<td>
$$
{\tt R90}=\left(
\begin{matrix}
0 &amp; -1\newline
1 &amp; 0
\end{matrix}
\right)
$$
</td>
<td>
$$
{\tt MXR90}=\left(
\begin{matrix}
0 &amp; 1\newline
1 &amp; 0
\end{matrix}
\right)
={\tt R90}\bullet{\tt MX}
$$
</td>
</tr>
<tr>
<td>
$$
{\tt R180}=\left(
\begin{matrix}
-1 &amp; 0\newline
0 &amp; -1
\end{matrix}
\right)
$$
</td>
<td>
$$
{\tt MY}=\left(
\begin{matrix}
-1 &amp; 0\newline
0 &amp; 1
\end{matrix}
\right)
$$
</td>
</tr>
<tr>
<td>
$$
{\tt R270}=\left(
\begin{matrix}
0 &amp; 1\newline
-1 &amp; 0
\end{matrix}
\right)
$$
</td>
<td>
$$
{\tt MYR90}=\left(
\begin{matrix}
0 &amp; -1\newline
-1 &amp; 0
\end{matrix}
\right)
={\tt R90}\bullet{\tt MY}
$$
</td>
</tr>
</table>

<h2>合成</h2>

<p>二つの変換を合成する。「$左項\bullet右項$」の形で。</p>

<p>この集合に含まれる写像はどれでも合成後のものはこの集合自身に含まれる。数学的に言えば、<code>orient</code> の集合は「$\bullet$」合成に関して群を成してる。行列を真面目に計算せずに、この表から直接答えを検索するだけでいい。</p>

<table>
<tr>
<th rowspan="2" colspan="2"></th>
<th colspan="8">右項
</th>
</tr>
<tr>
<th>${\tt R0}$</th>
<th>${\tt R90}$</th>
<th>${\tt R180}$</th>
<th>${\tt R270}$</th>
<th>${\tt MX}$</th>
<th>${\tt MXR90}$</th>
<th>${\tt MY}$</th>
<th>${\tt MYR90}$
</th>
</tr>
<tr>
<th rowspan="8">左項</th>
<th>${\tt R0}$</th>
<td>${\tt R0}$</td>
<td>${\tt R90}$</td>
<td>${\tt R180}$</td>
<td>${\tt R270}$</td>
<td>${\tt MX}$</td>
<td>${\tt MXR90}$</td>
<td>${\tt MY}$</td>
<td>${\tt MYR90}$
</td>
</tr>
<tr>
<th>${\tt R90}$</th>
<td>${\tt R90}$</td>
<td>${\tt R180}$</td>
<td>${\tt R270}$</td>
<td>${\tt R0}$</td>
<td>${\tt MXR90}$</td>
<td>${\tt MY}$</td>
<td>${\tt MYR90}$</td>
<td>${\tt MX}$
</td>
</tr>
<tr>
<th>${\tt R180}$</th>
<td>${\tt R180}$</td>
<td>${\tt R270}$</td>
<td>${\tt R0}$</td>
<td>${\tt R90}$</td>
<td>${\tt MY}$</td>
<td>${\tt MYR90}$</td>
<td>${\tt MX}$</td>
<td>${\tt MXR90}$
</td>
</tr>
<tr>
<th>${\tt R270}$</th>
<td>${\tt R270}$</td>
<td>${\tt R0}$</td>
<td>${\tt R90}$</td>
<td>${\tt R180}$</td>
<td>${\tt MYR90}$</td>
<td>${\tt MX}$</td>
<td>${\tt MXR90}$</td>
<td>${\tt MY}$
</td>
</tr>
<tr>
<th>${\tt MX}$</th>
<td>${\tt MX}$</td>
<td>${\tt MYR90}$</td>
<td>${\tt MY}$</td>
<td>${\tt MXR90}$</td>
<td>${\tt R0}$</td>
<td>${\tt R270}$</td>
<td>${\tt R180}$</td>
<td>${\tt R90}$
</td>
</tr>
<tr>
<th>${\tt MXR90}$</th>
<td>${\tt MXR90}$</td>
<td>${\tt MX}$</td>
<td>${\tt MYR90}$</td>
<td>${\tt MY}$</td>
<td>${\tt R90}$</td>
<td>${\tt R0}$</td>
<td>${\tt R270}$</td>
<td>${\tt R180}$
</td>
</tr>
<tr>
<th>${\tt MY}$</th>
<td>${\tt MY}$</td>
<td>${\tt MXR90}$</td>
<td>${\tt MX}$</td>
<td>${\tt MYR90}$</td>
<td>${\tt R180}$</td>
<td>${\tt R90}$</td>
<td>${\tt R0}$</td>
<td>${\tt R270}$
</td>
</tr>
<tr>
<th>${\tt MYR90}$</th>
<td>${\tt MYR90}$</td>
<td>${\tt MY}$</td>
<td>${\tt MXR90}$</td>
<td>${\tt MX}$</td>
<td>${\tt R270}$</td>
<td>${\tt R180}$</td>
<td>${\tt R90}$</td>
<td>${\tt R0}$
</td>
</tr>
</table>

<h2>関連するAPI関数</h2>

<p><code>orient</code>（$O$）はアフィン変換の一部として、変位（$\vec{d}$）と 拡大倍率（$\alpha$）の情報と一緒に使われる。アフィン変換（<code>transform</code>）のデータ形式はリストでこの通り。</p>

<p>$${\tt(}\vec{d}\ \ O\ \ \alpha{\tt)}$$</p>

<p>この形式のデータが次のアフィン変換 $T(\vec{r})$ に対応する。</p>

<p>$$T(\vec{r})=\alpha\cdot\left(O\ \vec{r}+\vec{d}\right)$$</p>

<p>んで、<code>transform</code> に関係する関数は次の通り。</p>

<table>
<tr>
<th>関数
</th>
<th>機能
</th>
</tr>
<tr>
<td>
<code>(dbTransformPoint <var>point</var> <var>transform</var>)</code>
</td>
<td>点 <code><var>point</var></code> を変換 <code><var>transform</var></code> した点を求めて返す。
</td>
</tr>
<tr>
<td>
<code>(dbTransformBBox <var>rectangle</var> <var>transform</var>)</code>
</td>
<td>矩形 <code><var>rectangle</var></code> を変換 <code><var>transform</var></code> した矩形を求めて返す。
</td>
</tr>
<tr>
<td>
<code>(dbConcatTransform  <var>transform<sub>former</sub></var>  <var>transform<sub>latter</sub></var>)</code>
</td>
<td>変換 <code><var>transform<sub>former</sub></var></code> に続く <code><var>transform<sub>latter</sub></var></code> を合成した変換（$transform_{latter}\bullet{}transform_{former}$）を求めて返す。 
</td>
</tr>
</table>

<h2>逆元</h2>

<p>面白いのは ${\tt R90}$ と ${\tt R270}$ 以外は逆元が自分自身だということ。</p>

<table>
<tr>
<th>$orient$</th>
<th>$orient^{-1}$</th>
<th>備考
</th>
</tr>
<tr>
<td>${\tt R0}$</td>
<td>${\tt R0}$</td>
<td>${\tt R0}$ は単位元だから当たり前。
</td>
</tr>
<tr>
<td>${\tt R90}$</td>
<td>${\tt R270}$</td>
<td>
</td>
</tr>
<tr>
<td>${\tt R180}$</td>
<td>${\tt R180}$</td>
<td>
</td>
</tr>
<tr>
<td>${\tt R270}$</td>
<td>${\tt R90}$</td>
<td>
</td>
</tr>
<tr>
<td>${\tt MX}$</td>
<td>${\tt MX}$</td>
<td>
</td>
</tr>
<tr>
<td>${\tt MXR90}$</td>
<td>${\tt MXR90}$</td>
<td>$\begin{eqnarray}{\tt MXR90}^{-1}&amp;=&amp;\left({\tt R90}\bullet{\tt MX}\right)^{-1}\newline&amp;=&amp;{\tt MX}^{-1}\bullet{\tt R90}^{-1}\newline&amp;=&amp;{\tt MX}\bullet{\tt R270}\newline&amp;=&amp;{\tt MXR90}\end{eqnarray}$
</td>
</tr>
<tr>
<td>${\tt MY}$</td>
<td>${\tt MY}$</td>
<td>
</td>
</tr>
<tr>
<td>${\tt MYR90}$</td>
<td>${\tt MYR90}$</td>
<td>$\begin{eqnarray}{\tt MYR90}^{-1}&amp;=&amp;\left({\tt R90}\bullet{\tt MY}\right)^{-1}\newline&amp;=&amp;{\tt MY}^{-1}\bullet{\tt R90}^{-1}\newline&amp;=&amp;{\tt MY}\bullet{\tt R270}\newline&amp;=&amp;{\tt MYR90}\end{eqnarray}$
</td>
</tr>
</table>