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 日分です。
