Draw.ioで多角形を描画する(ためにMATLABを活用する)

(急遽ネタが降ってきたので、滑り込み投稿します)

# はじめに
私は作図にDraw.io(最近はdiagrams.netともいうらしい)をよく使っているのですが、下図のパワポ・エクセル等の「フリーフォーム：図形」のように多角形を描画したいことがしばしばあります。どうも現状手軽にはできないようですが、ふと「これMATLAB活用で解決するのでは？」と思ったので載せます。
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/7008e157-f445-897b-d387-90c5516309fc.png" width=40%>
 
# Draw.ioでの多角形描画
現状、パワポなどのようには簡単にできません。下記のissuesで議論されてますが、風化してしまったようです。これが可能になると大変便利なんですが…。

https://github.com/jgraph/drawio/issues/800

それでも描画したい場合、一つの選択肢としては下記のように「Polygon」を配置して、右クリック→フォーマットを編集、で端点を編集することで行えます。
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/0a02ea24-7153-886a-4485-6c1866f65694.png" width=80%>
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/c8856112-ff65-e472-fddb-f775d7ed949b.png" width=60%>

が、この座標をどう入力したらいいのか…ということで、ふと[@motorcontrolman](https://qiita.com/motorcontrolman) さんの下記のMATLAB記事を思い出しました。

https://qiita.com/motorcontrolman/items/9a9f15772e56aa6d8c88

こちらの記事では、MATLABのFigure上のデータヒントを活用して、画像中の要所のXY座標を取得する…というテクニックを紹介してます。これが利用できるのでは、ということでやっていきます。

# MATLABでの二次元多角形の端点データの取得方法
以下、MATLABでのやり方を紹介します。適当にカクカクした図形の題材として、下記のノギスの絵を描いてみます。

https://www.irasutoya.com/2018/12/blog-post_32.html

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/08f9d7b3-776e-8cb3-48c0-4b2f004edbe0.png" width=50%>
 
描画したい画像をダウンロードして、下記のMATLABコードを実行します。無地のキャンバスに端点を描きたい場合は、2行目の方をコメント解除してください。

```MATLAB
img = imread("dougu_nogisu.png");
% img = ones(400,400,3); % 白色の画像を表示したい場合はこっち

imshow(img, 'XData', [0 1], 'YData', [0 1]);
axis on;        % 軸を表示
axis([0 1 0 1]) % 表示範囲を0～1に固定
```

実行すると、下記のようにFigureが表示されます。図の右上に表示される「データヒント’をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/dc1a24b1-bf45-3c16-c4c8-82b6799d7316.png)

Shift＋左クリック、で端点にデータヒントを追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/8f3f682c-53f4-d808-95a8-c1bc5d5b7b40.png)

全部データヒントを入れるとこんな感じです。座標は後で微修正するので、適当で良いです。
途中データヒントが重なってしまって見づらいところは、データヒントをクリックしてずらすことができるので、適宜ずらしてデータヒントを入れてきます。全部入れ終わったら、適当な箇所を右クリック→カーソルデータをワークスペースにエクスポート を選択すると座標の構造体がMATLABのワークスペースに出力されます(デフォルトではcursor_infoという名前になります)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/9a71ff93-e6d9-590d-a26a-6ea783a2a012.png)

ワークスペースにあるcursor_infoをダブルクリックすると、変数フィールドに中身が表示されます。Excelの要領で、Position列を選択して、適当なエディタなどにコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/9a22e452-abf2-3207-de6c-05eabb7f7b1e.png)

データの整形は、たまたまMALTABのPositionデータがDraw.io側のフォーマットとそっくりになっているため、末尾のカンマを追加するだけでOKです。注意として、最終行にカンマがあると正しく表示されないのでそこは消してください。

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/bb1160f8-8d8f-7de1-044e-0288189fc8fe.png" width=60%>
 
# Draw.ioでの端点座標入力
データをコピーして、Draw.ioの画面に戻ります。
冒頭のDraw.ioでのフォーマットを入力する画面にて、多角形の端点を表す部分(↓の画像)に、データを貼り付けます。
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/c8856112-ff65-e472-fddb-f775d7ed949b.png" width=60%>
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/f78bed27-16ab-0cb0-2a6f-25cf932f3ddf.png" width=60%>

適用、を押すと下記のとおり多角形が表示されます。何も表示されない場合はデータの体裁が整ってないと思われるので、カンマの有無などに注意してやり直してください。

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/f9edc5c1-bd55-8c0e-480d-0d22e99504fa.png" width=60%>
 
水色丸をクリックすると拡大縮小ができます。また、オレンジの端点をクリックしてからAltを押しながら動かすと、微修正がやりやすいです。微修正すると、こんな感じまでは作れます。当たり前ですがお絵かきソフトではないので、ほどほどのところでやめにしましょう。

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/c2501378-2249-916f-b07c-2f9f4fb6dd35.png" width=60%>
 
追加で2～3分頑張ると、↓このぐらいは簡単にできました。

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/12b29bd2-19b2-bab8-1a47-58533955d9cb.png" width=60%>

# おわりに
ネタ記事のつもりでしたが、慣れると意外に有用でした。

MATLABデータヒントのこの機能、他にも何かに使えそうです。例えばSimscape MultibodyでのExtruded Solidブロックの断面プロファイル作るとか…

https://jp.mathworks.com/help/sm/ug/modeling-extrusions-and-revolutions.html