2021/06/21(月) [n年前の日記]
#1 [prog] 図形の座標データを取れるツールってないものか
何かしらの実験プログラムを書く際に、三角形や多角形の頂点座標列をソース内に記述したい時があるのだけど、それら座標値列を簡単に取得できる便利ツールって無いのかなと思えてきた。
昨日、ソレ系のプログラムを書いた際には、Inkscape を使って座標値列を取得したのだけど…。
ビットマップ画像編集ツールの類では、図形を描いても座標値を取れないので、ドローツールっぽい何かを使うことになるのだろうけど…。本格的なドローソフトになっちゃうと、それも違うわけで…。そもそも、各図形の頂点座標列を視認したり取得できるドローソフトなんて聞いたことが無い気もする。
まあ、ほとんど需要が無さそうだし、そんなツールがあるわけもないか…。頻繁に行う作業でもないから、座標値列を手打ちして試行錯誤するのが妥当、ということになっちゃうよな…。
待てよ。GIMP のイメージマップ作成フィルタを使えばいいのでは…。GIMPを起動して、任意の画像サイズを新規作成してから、フィルター → ウェブ → イメージマップ。少なくとも、矩形とポリゴンぐらいは指定できるはず。
試してみたけど、イイ感じかも。HTMLソースをコピペして編集する手間はあるけど、当てずっぽうで座標値を打ち込んでいくよりは楽な気がする。
昨日、ソレ系のプログラムを書いた際には、Inkscape を使って座標値列を取得したのだけど…。
- アイコン画像用テンプレートから新規作成することで、ピクセル値で管理するキャンバスを用意して、
- キャンバスサイズを目的のサイズに変更して、
- 図形を描いて、
- XML を覗いて、座標値列をコピペして、
ビットマップ画像編集ツールの類では、図形を描いても座標値を取れないので、ドローツールっぽい何かを使うことになるのだろうけど…。本格的なドローソフトになっちゃうと、それも違うわけで…。そもそも、各図形の頂点座標列を視認したり取得できるドローソフトなんて聞いたことが無い気もする。
まあ、ほとんど需要が無さそうだし、そんなツールがあるわけもないか…。頻繁に行う作業でもないから、座標値列を手打ちして試行錯誤するのが妥当、ということになっちゃうよな…。
待てよ。GIMP のイメージマップ作成フィルタを使えばいいのでは…。GIMPを起動して、任意の画像サイズを新規作成してから、フィルター → ウェブ → イメージマップ。少なくとも、矩形とポリゴンぐらいは指定できるはず。
試してみたけど、イイ感じかも。HTMLソースをコピペして編集する手間はあるけど、当てずっぽうで座標値を打ち込んでいくよりは楽な気がする。
[ ツッコむ ]
#2 [love2d] love2dで凸多角形の内外判定
Windows10 x64 20H2 + love2d 11.3 の環境で、点が凸多角形の内外にあるか判定する処理を書いてみた。昨日は、三角形の内外判定を外積を使って行ってみたけど、座標値の数が増えても処理できるように対応させた。
_main.lua
_conf.lua
main.lua と conf.lua を任意のディレクトリに置いて、love ディレクトリ名、で実行。
比較的簡単な処理なので、凸多角形にしか対応してないあたりがアレだけど…。凹多角形ではおかしな結果になるはず。たぶん。
もっとも、凹多角形については、事前に人力で複数の凸多角形に分割しておけば済む予感。
_main.lua
function love.load() polys = { {60, 100, 150, 180, 150, 300, 60, 380}, {160, 60, 440, 60, 360, 180, 240, 180}, {470, 130, 560, 170, 550, 270}, {420, 280, 540, 300, 540, 420, 470, 450, 370, 350}, {260, 280, 320, 320, 320, 400, 260, 440, 190, 400, 190, 320}, } hits = {} for i = 1, #polys do hits[i] = false end end function getCrossVec2D(vx1, vy1, vx2, vy2) return (vx1 * vy2 - vx2 * vy1) end function checkInConvexPoly(pos, mx, my) local cc = {} local x0, y0, x1, y1 x0, y0 = pos[#pos-1], pos[#pos] for i = 1, #pos-1 ,2 do x1, y1 = pos[i], pos[i+1] table.insert(cc, (getCrossVec2D(x1 - x0, y1 - y0, mx - x1, my - y1) < 0)) x0, y0 = x1, y1 end local c0, c1 c0 = cc[1] for i = 2, #cc do c1 = cc[i] if c0 ~= c1 then return false end c0 = c1 end return true end function love.update(dt) local mx, my mx, my = love.mouse.getPosition() for i = 1, #polys do hits[i] = checkInConvexPoly(polys[i], mx, my) end end function love.draw() -- clear canvas love.graphics.clear(0, 0, 0, 1) -- draw polygon for i = 1, #polys do if hits[i] then love.graphics.setColor(1, 0, 0, 1) else love.graphics.setColor(0, 1, 0, 1) end love.graphics.polygon("fill", polys[i]) end -- draw text love.graphics.setColor(1, 1, 1, 1) love.graphics.print("ESC to exit.", 8, 8) end function love.keypressed(key, scancode, isrepeat) if key == "escape" then love.event.quit() end end
_conf.lua
function love.conf(t) t.window.width = 640 t.window.height = 480 t.window.title = "Collision Polygon" t.window.fullscreen = false -- t.window.fullscreentype = "exclusive" end
main.lua と conf.lua を任意のディレクトリに置いて、love ディレクトリ名、で実行。
比較的簡単な処理なので、凸多角形にしか対応してないあたりがアレだけど…。凹多角形ではおかしな結果になるはず。たぶん。
もっとも、凹多角形については、事前に人力で複数の凸多角形に分割しておけば済む予感。
[ ツッコむ ]
#3 [prog][json] JSON関連のツールを導入
JSONデータを扱いやすくするためのツールをいくつか導入。環境は Windows10 x64 20H2。
◎ jqを試用。 :
jq は、JSONデータを分かりやすく整形してくれたりするツールらしい。
_jq
_Download jq
_jq コマンドを使う日常のご紹介 - Qiita
_Windowsでjqコマンドを導入してJSONレスポンスを整形・抽出する
_jqをWindowsマシンにインストールして使ってみる - Qiita
現行版は 1.6。jq-win64.exe をDLして、パスが通ったところに置いてみた。更に、jq.exe にリネームしておいた。
以前も導入したことがあったらしい…。jq 1.5 が既に入ってた…。
_jq
_Download jq
_jq コマンドを使う日常のご紹介 - Qiita
_Windowsでjqコマンドを導入してJSONレスポンスを整形・抽出する
_jqをWindowsマシンにインストールして使ってみる - Qiita
現行版は 1.6。jq-win64.exe をDLして、パスが通ったところに置いてみた。更に、jq.exe にリネームしておいた。
以前も導入したことがあったらしい…。jq 1.5 が既に入ってた…。
◎ YAMLと相互変換したい。 :
JSON は見辛いし編集しづらいので、YAML に変換できないものかなと思えてきた。
ググってみたら、json2yaml とか yaml2json 等があるらしい。Python で実装された版や、Ruby で実装された版、npm でインストールできる版が存在するようで。
_json2yaml - PyPI
_drbild/json2yaml: Convert JSON to YAML or vice versa, while preserving the order of associative arrays.
_python-json2yaml - PyPI
_【json2yaml】JSON を YAML に変換する | レコチョクのエンジニアブログ
_json2yaml | RubyGems.org | コミュニティのGemホスティングサービス
_fukayatsu/json2yaml: Convert between JSON and YAML in CLI
_json2yaml - npm
_npmモジュールでJSONをYAMLに変換、YAMLをJSONに変換する | 株式会社CONFRAGE ITソリューション事業部
Python版をインストールしてみた。Pythonのバージョンは、3.9.5。64bit版。
しかし、json2yaml input.json output.yaml と打ったら、「json2yaml ってコマンドじゃないよね?」と言われて動かなかった。もしかすると、「*NIX環境なら使えますよ」的ツールで、Windows上ではそのまま使えないのかもしれない。Python版はアンインストールした。
Ruby版を試してみる。Ruby のバージョンは、2.6.6 p146。
実行してみる。
そもそも、ワンライナーで変換できてしまうらしい…。
_ワンライナーでのJSON, YAMLの整形や変換とその相違 - Qiita
_YAML <-> JSON 変換 (Rubyで実装) - Qiita
_[Ruby][小ネタ] ワンライナーで JSON を YAML に変換する | DevelopersIO
ググってみたら、json2yaml とか yaml2json 等があるらしい。Python で実装された版や、Ruby で実装された版、npm でインストールできる版が存在するようで。
_json2yaml - PyPI
_drbild/json2yaml: Convert JSON to YAML or vice versa, while preserving the order of associative arrays.
_python-json2yaml - PyPI
_【json2yaml】JSON を YAML に変換する | レコチョクのエンジニアブログ
_json2yaml | RubyGems.org | コミュニティのGemホスティングサービス
_fukayatsu/json2yaml: Convert between JSON and YAML in CLI
_json2yaml - npm
_npmモジュールでJSONをYAMLに変換、YAMLをJSONに変換する | 株式会社CONFRAGE ITソリューション事業部
Python版をインストールしてみた。Pythonのバージョンは、3.9.5。64bit版。
pip install json2yaml
しかし、json2yaml input.json output.yaml と打ったら、「json2yaml ってコマンドじゃないよね?」と言われて動かなかった。もしかすると、「*NIX環境なら使えますよ」的ツールで、Windows上ではそのまま使えないのかもしれない。Python版はアンインストールした。
pip uninstall json2yaml
Ruby版を試してみる。Ruby のバージョンは、2.6.6 p146。
gem install json2yamlコンパイラが必要になるライブラリだったらしい…。 *1 MinGW/MSYS を有効化してインストール。0.0.3 がインストールされた。
実行してみる。
json2yaml input.json > output.yamlこちらは Windows上でも動いてくれたので、Ruby版を使わせてもらおうかなと…。
そもそも、ワンライナーで変換できてしまうらしい…。
_ワンライナーでのJSON, YAMLの整形や変換とその相違 - Qiita
_YAML <-> JSON 変換 (Rubyで実装) - Qiita
_[Ruby][小ネタ] ワンライナーで JSON を YAML に変換する | DevelopersIO
◎ 余談。 :
手打ちで作成した hoge.json を json2yaml hoge.json してみたらエラーが出て悩んだ。jq . hoge.json してもエラーが出る。何故。
最後のあたりに「,」を入れてしまっていたのが原因だった…。
以下が正しい。
今後は気を付けないと…。などとメモしたけど、たぶん3日後には忘れてまた同じミスをしてそう。
最後のあたりに「,」を入れてしまっていたのが原因だった…。
"Goal": { "path": "imgs/img10.png", ... }, }
以下が正しい。
"Goal": { "path": "imgs/img10.png", ... } }
今後は気を付けないと…。などとメモしたけど、たぶん3日後には忘れてまた同じミスをしてそう。
*1: 依存している yajl-ruby (YAJL C Bindings for Ruby) からしてコンパイラが必要っぽい。
[ ツッコむ ]
以上、1 日分です。