awkで二次元座標回転

社内ツールとして、複数の DXF ファイル内にある文字列を一括で変換するスクリプトを組みました。スクリプトとは言っても、ファイルを列挙して一括置換させるだけのシンプルなものでした。

最初はそれで良かったのですが、どんどんと上からの要望が膨らんでしまい、シェルスクリプトで DXF 内に図形を配置する為のモジュールを組み込まなければならなくなりました。

DXF のような複数行にまたがる BEGIN – END 構文を持つテキストデータの場合、awk が活躍します。という事で、awk で書きました。

次に示すのは、awk で二次元座標値(x, y)の回転を行うコードの抜粋です。

# 円周率
function pi()
{
  return atan2( 0, -1 );
}

# 度→ラジアン
function deg2rad(deg)
{
  return (pi() * deg / 180);
}

# ラジアン→度
function rad2deg(rad)
{
  return (rad * 180 / pi());
}

# 点(cx,cy)を中心にangle度回転した時の、指定された点(_x,_y)の座標を返す "_x'\t_y'"
function rotate(cx, cy, _x, _y, _rAng)
{
  _rAng = deg2rad(_rAng);
  return sprintf("%f\t%f",
    (_x-cx)*cos(-_rAng)-(_y-cy)*sin(-_rAng)+cx,(_x-cx)*sin(-_rAng)+(_y-cy)*cos(-_rAng)+cy);
}

pi() は円周率を返し、deg2rad() とrad2deg() は、度とラジアン値を相互変換する関数です。 rotate() は、例えば、点Aを中心にして点Bをn度回転移動させた場合の点B’の位置をタブ区切りの float 型文字列で返してくれます。

※ 2020/07/02 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください