mieki256's diary



2021/06/21(月) [n年前の日記]

#1 [prog] 図形の座標データを取れるツールってないものか

何かしらの実験プログラムを書く際に、三角形や多角形の頂点座標列をソース内に記述したい時があるのだけど、それら座標値列を簡単に取得できる便利ツールって無いのかなと思えてきた。

昨日、ソレ系のプログラムを書いた際には、Inkscape を使って座標値列を取得したのだけど…。
  1. アイコン画像用テンプレートから新規作成することで、ピクセル値で管理するキャンバスを用意して、
  2. キャンバスサイズを目的のサイズに変更して、
  3. 図形を描いて、
  4. XML を覗いて、座標値列をコピペして、
みたいな。ただ、Inkscape は SVG作成ソフトなので、SVG仕様のせいか、謎の座標値になることもあって、どうも不便だなと…。

ビットマップ画像編集ツールの類では、図形を描いても座標値を取れないので、ドローツールっぽい何かを使うことになるのだろうけど…。本格的なドローソフトになっちゃうと、それも違うわけで…。そもそも、各図形の頂点座標列を視認したり取得できるドローソフトなんて聞いたことが無い気もする。

まあ、ほとんど需要が無さそうだし、そんなツールがあるわけもないか…。頻繁に行う作業でもないから、座標値列を手打ちして試行錯誤するのが妥当、ということになっちゃうよな…。

待てよ。GIMP のイメージマップ作成フィルタを使えばいいのでは…。GIMPを起動して、任意の画像サイズを新規作成してから、フィルター → ウェブ → イメージマップ。少なくとも、矩形とポリゴンぐらいは指定できるはず。

試してみたけど、イイ感じかも。HTMLソースをコピペして編集する手間はあるけど、当てずっぽうで座標値を打ち込んでいくよりは楽な気がする。

#2 [love2d] love2dで凸多角形の内外判定

Windows10 x64 20H2 + love2d 11.3 の環境で、点が凸多角形の内外にあるか判定する処理を書いてみた。昨日は、三角形の内外判定を外積を使って行ってみたけど、座標値の数が増えても処理できるように対応させた。

_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 ディレクトリ名、で実行。

poly_collision_ss.gif

比較的簡単な処理なので、凸多角形にしか対応してないあたりがアレだけど…。凹多角形ではおかしな結果になるはず。たぶん。

もっとも、凹多角形については、事前に人力で複数の凸多角形に分割しておけば済む予感。

#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 が既に入ってた…。

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版。
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 してもエラーが出る。何故。

最後のあたりに「,」を入れてしまっていたのが原因だった…。
    "Goal": {
        "path": "imgs/img10.png",
        ...
    },
}

以下が正しい。
    "Goal": {
        "path": "imgs/img10.png",
        ...
    }
}

今後は気を付けないと…。などとメモしたけど、たぶん3日後には忘れてまた同じミスをしてそう。

*1: 依存している yajl-ruby (YAJL C Bindings for Ruby) からしてコンパイラが必要っぽい。

以上、1 日分です。

過去ログ表示

Prev - 2021/06 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project