FrontPage  ページ一覧  検索  更新履歴  RSS  ログイン

Psychlops Wiki - Group 差分

  • 最後の更新で追加された部分はこのように表示します。
  • 最後の更新で削除された部分はこのように表示します。

! 概要
 複数の[[図形|図形一覧]]をまとめて一つの図形のように扱いたい場合に、これをグループ化して取り扱うためのクラスです(Adobe IllustratorやMicrosoft PowerPointにも同様の機能があります)。付随的機能として、平行移動、回転、拡大縮小ができるようになります。ただし、Imageを登録する場合にはcache(quicken)しておく必要があります。

! 基本的な使い方

{{syntax_highlight('cpp')}}
<<<
Psychlops::Rectangle rect(100,100);
rect.fill = Color::red;
Psychlops::Ellipse ellipse(100,100);
ellipse.fill = Color::white;

Group g;
rect.join(g).centering(0,0).shift(-100,100);
ellipse.join(g).centering(0,0).shift(100,100);
g.centering();

g.draw();
>>>


! 回転や拡大縮小などアフィン変換に使う場合

Groupに回転や拡大縮小についてのに登録されている

!! 回転の場合

Groupにrotation値を指定した状態でGroupをdrawすると、Groupに登録されているFigureオブジェクト全てがGroupの基準座標(Groupの内部的には(0, 0)、Groupの外部的にはGroupのdatum)を中心に回転します。

{{syntax_highlight('cpp')}}
<<<
#include <psychlops.h>
using namespace Psychlops;

void psychlops_main() {

Canvas d(Canvas::window);
Group gr;

Image img("sample.png");    // Imageを読み込む
img.cache();                // VRAMにキャッシュ(quicken)する
img.join(gr).centering(gr); // ImageをGroupに登録し、相対座標を合わせておく(画像の中心を回転datumにする)
gr.centering();             // Group全体を画面に対しセンタリングする

double phase = 0.0;
while(!Keyboard::esc.pushed()) {
d.clear();

gr.rotation += 1.0;
gr.draw();

d.flip();
if(AppState::shouldBeClose) break;
}

}
>>>


! 変数
:Point datum:Groupの基準座標を示します。Group内のすべてのFigureはこの座標分ずらされて描画されます。また、回転の原点座標ともなります。この変数に対する操作はGroup全体の平行移動に相当します。
:double rotation:回転角度を指定します。後述のaxisを指定しなければ画面平面上での回転となります。この回転は、標準ではGroup全体を一枚のレイヤとしてまわすものにまります(図)。回転した際のレンダリング精度の劣化は考慮しませんので、ピクセル単位で完全に制御が必要な刺激には使わないでください。また、あとでAngle型に変わる可能性があります。
:Point axis:回転軸のベクトル方向を指定します。デフォルトは(0, 0, 1)で画面平面の法線です。
:Point scaling:拡大縮小をx,y,z軸方向について指定します。デフォルトは(1,1,1)で、表示上大きさは変化しません。


! 関数
:Group& append(Figure &fig):
:Group& append(Figure *fig):このGroupにFigureを追加します。ポインタで保持するため、Groupより寿命の短いFigure変数を指定するとハングアップする可能性があります。

:virtual Group& draw(Drawable &drawable = *Drawable\:\:prime):Figureを順次描画します。


! 扱いが変更になるかもしれない機能

:std\:\:vector<Figure *> contents:Figureのポインタを保持する動的配列です。アクセス方法はSTLのstd::vectorの使い方を参照してください。将来的に直接アクセスできなくなる可能性があります。

:virtual Group& clip(const Rectangle &rect):このGroupを表示する際に、rectで指定された範囲に収まる部分だけ描画し、その外側を無視するよう指定します(クリッピング)。将来的に、Groupを継承した子クラスに機能が移される可能性があります。

:virtual Group& clip(bool sw):引数にfalseを指定するとクリッピングが解除されます。