ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

libboardの紹介

この記事は

TUT Advent Calendar 2014 - Adventarの参加記事です。
12/1に突然始まってトップバッターで、記事書いてるのはもちろん当日なのでサクッと行きましょう。

libboard is 何

 ベクトル画像を簡単に出力できるC++用のライブラリです。
 CV系の研究室に居ると、プログラムの出力結果を可視化したいことがよくあるのですが、bmpppmpngのようなラスタ画像では不都合なことがちょくちょくあります。線をいっぱいひいたのはいいものの、拡大したら潰れちゃってよく見えない! というのでは問題です。実際、進捗報告会でボスに結果を見せるのに重要な部分を拡大して・・・と言うのはよくやりますから拡大しても綺麗に見えたほうがいいに決まってます。
 ということで、拡大しても潰れないベクトル画像の出番なのですが、コレをC++から出力しようと思っても手頃な方法が見つからない。折角C++なんだからpng++くらい簡単に使えないと使う気にはならない。PostScript形式なんかのフォーマットを自分で調べてライターを用意してもいいのですが、ベクトル画像出力はそんなに手間をかけたくない。なんて考えてたらlibboardなんていうステキなライブラリを見つけたのでご紹介というわけです。

ざっくりした説明

公式はこちら(The Board library - A vector graphics C++ library (Postscript, SVG, Fig))。
Linuxディストロのパッケージには入っていない様子です。なので、ソースコードを入手して自分でビルドすることになります。
Linuxはconfigureによるビルドが可能で、windowsとかでもcmakeでイケルんじゃないかな? 自分はUbuntu 14.04でだけ動作を確認してます。
使い方は簡単で

  1. ``LibBoard::Board''クラスのインスタンスを生成
  2. ``Board''オブジェクトに対して描画関数を呼び出す
  3. ``Board''オブジェクトに対してファイル出力関数を呼び出す

の3ステップ。めちゃくちゃ簡単。多角形の描画も専用の点クラスのstd::vectorとして渡せるのでとっても楽ちん。

ビルド方法

ビルドの方法です。Linuxの場合の方法のみ書きます
まずは、gitからソースコード一式を入手

git clone http://git.code.sf.net/p/libboard/source-code libboard

こんどはビルドとインストール

cd libboard
./configure --prefix=/hoge/piyo
make
make doc
make install
make install-doc

たったこれだけ。``/hoge/piyo''はインストール先ディレクトリのパスです。僕はいっつもは``/opt/local/libboard''みたいな感じにしてます。``/usr/local''は削除がめんどい。
あとは使いたいプログラム側で(makefileとか)設定すればOK
CMakeLists.txtもあるのでcmakeでもビルドできるとは思うのですが、やったこと無いので分からないです。

プログラム側の初期設定

ビルドが終わったらヘッダとライブラリが出来上がってると思うのでそれらを使うようにコンパイラにオプションを渡すようにすればOKです。
コンパイル時は

-I/hoge/piyo/include

リンク時は

-L/hoge/piyo/lib -lboard

とかこんな感じ。
pkg-configは無いので、パスをmakefileに直で書くとかそんな感じになります。

使い方

サンプル(Board: Examples)があるのでこれらを見て下さい。難しいことは何もないです。

注意点

 eps形式で出力する際

という仕様らしく、たとえば本来バウンディングボックスが正方形になるような図形を描画するとTeXとかに出力したepsを貼り付けた時に図形が上下にはみ出ます。バウンディングボックスのサイズは自動計算みたいなことドキュメントに書いてたじゃん!
 なので、出力時に図形サイズ(mm単位)を強制的に指定してアスペクト比を合わせる必要があります。具体的には

LibBoard::Board Writer;

//描画コード

//画像サイズが640x480ならこう
Writer.saveEPS("hoge.eps", 640, 480);

みたいな感じです。
saveEPSに渡すのはmm単位のサイズなのですが、今興味が有るのはアスペクト比だけなので、絶対的な大きさとか単位は関係ないです。適当にピクセル単位のサイズでも入れておきましょう。

おしまい

 具体的な使い方はサンプルに全部投げちゃいましたが、LibBaordはとっても便利なので、C++でベクトル画像を書きたい! という方、ガンガン使いましょう。僕は結構重宝してます。

明日

 だれが担当するんでしょう?
※追記
 翌日の記事はこちら(C++ - 魔術とプロコン - Qiita)まさかのC++魔クロのはなし。闇プログラマー怖い。