ラスターイメージをクリップするAutoCADのコマンド。
imageclip
モデル空間に配置したラスターを、レイアウト上のビューポート内で
表示した場合、そのラスターがビューポート枠によって切り取られて
一部が表示されないということがありえる。
そんな状態をモデル空間上で実現しようとしたとき、ラスターのクリップが
大変役に立つ。(レイアウト図面をモデル空間図面に変換したときの話)
データ構造的な、ラスターのクリップを解説する。
まずは、クリップされているかどうかという情報。
そして、クリップ領域を表現する2点または、3点以上の座標列。
2点の場合は、矩形の対角となる2点を意味し、
3点以上の場合は、その座標列で囲まれる多角形を意味する。
コマンド内で指定する「クリップの種類」として、矩形にするのか
ポリゴンにするのかに対応する。
この座標、XYの座標ではなくてピクセルの座標になっているのが曲者だ。
左下を、0,0としたピクセル座標となっていて、DXFリファレンスによると、
「既定は(- 0.5, – 0.5)、(size.x-0.5, size.y-0.5)。」だそうだ。
この「-0.5」の意味はよくわからない。
外側に0.5ずつ広げるというなら、枠の分ということで理解できるが、
式から判断するに、左下に0.5ずらすということになるので、意味不明だ。
問題はピクセル座標だということ。
ビューポート枠の座標はXY座標で保持されている。
ビューポート枠を考慮して、ラスターのクリップ座標を計算しなおすには、
両者を同じ基準の座標に変換しなければならない。
ピクセル座標と、その画像の縦と横のピクセル数、尺度、角度を考慮して、
XY座標に変換する。
ややこしい計算になりそうだと頭を悩ませていたところに、そのものずばりのAPIを発見。
OdDbRasterImage::getPixelToModelTransform ※DWGdirectの関数
Returns the pixel-to-model coordinate transformation matrix for this raster image entity.
このAPIにより得られる3次元マトリックスから2次元マトリックスを取得して、
ピクセル座標を変形(OdGePoint2d::transformBy)すると、XY座標が取得できた。
あとは、ビューポート枠の領域とラスタークリップの領域のANDをとり、
得られた座標をピクセル座標に逆変換(OdGeMatrix2d::inverse)すればよい。
最後に、ピクセル座標をラスターのクリップ情報にセットする。
我ながら会心の出来だ。
ところで、ラスターイメージはAutoCAD LTでは扱えない。
まず、LTではラスターイメージの挿入ができない。
ラスターイメージが挿入されたDWG図面をLTで開くと、
そのままの状態で表示されて、移動や複写、削除はできる。
ただ、明るさやコントラスト、尺度、クリップの状態など、
ラスターイメージ固有情報の編集ができない。
LTらすたという有名なフリーソフトがある。
Vectorの人気ランキングで、常に上位だ。(現在は1位)
AutoCAD LTでラスターデータをレギュラー版と同様に使えるようにする、大変便利なソフトだ。
はじめまして。
>この「-0.5」の意味
ピクセル1つを点ではなく面と考えると、ピクセル中心から見た左下の座標ではないでしょうか。
tamekichiさん、はじめまして。
とってもよく理解できました。
>点ではなく面と考える...
なるほど。
ピクセルを、点としてしか考えられませんでした。
目から鱗です。
ありがとうございました。