Entry

プログラミングメモ - RECT 構造体の仕様とかつらつら

2009年05月24日

自前の幾何計算用ライブラリでも作ろうかな,と思って,簡単なもんをぼちぼち作ってます。ま,こゆのはプログラマの数だけあるようなもんなので,別に大した話じゃありません。

で,基本的なクラスとして,長方形の領域を表す RECT クラス/構造体を考えてみたんですけれど,これって宣言するのがかなり難儀に思えてきました。どゆとこが難儀なのか,具体例で示してみようと思います。例えば,Windows API で用意されている RECT 構造体はこんな具合に宣言されている。

typedef struct tagRECT { 
   LONG left;
   LONG top;
   LONG right;
   LONG bottom;
} RECT;

けどこれ,使い方によっては,メンバと値が矛盾することがあります。例えば,左上原点で右下方向が正方向の座標系の場合で,

RECT rctA;
rctA.left = 120;  
rctA.top = 330;  
rctA.right  = 10;  
rctA.bottom = 130;

こんな値を入れられちゃう。解く問題にもよるんだろうけれど,ここで RECT::top が上方向の座標を表すとするのは,一般的に言って無理があります。また,メンバ名の文字数がまちまちなもんで,構造体に代入する箇所の桁がそろわないってのも,個人的には難です(細かいんですが)。そもそも,幾何計算で使う座標系の概念に,「上」とか「下」とかいったもんはなかったりするので,その点でもごにょごにょ。

一方,一部の RECT 構造体では,次のような宣言もよく使われるようです。

typedef struct tagRECT { 
   LONG x_;
   LONG y_;
   LONG width_;
   LONG height_;
} RECT;

ただ,これも,同じ領域を一意に決めることができない難点があります。例えば,

RECT rctA;
rctA.x_ = 10;  
rctA.y_ = 20;  
rctA.width_  = 100;  
rctA.height_ = 200;

と,

RECT rctA;
rctA.x_ = 110;  
rctA.y_ = 220;  
rctA.width_  = -100;  
rctA.height_ = -200;

は,同じ領域を表すことになるんだろうけど,値が異なります。正規化すればいいんですけど,できれば同じ値は同じもんとして,異なる値は異なる値として保持したいところ。

計算幾何学の本を見てみると,多角形であるポリゴン一般は,点の集合として表現されることが多いみたい。この方法でいくと,四角形は4つの点クラスで表現されます。一方,長方形の場合は,同じ四角形の中でも2点が決まれば決定できる特別な形で,用途としてもよく使うことから,それ用の構造体が宣言されます。しかし,RECT クラス/構造体を幾何計算一般のデータ構造として採用するべきかは,別個に考えなくちゃいけない感じ。通常のポリゴンクラスに bool is_rect() const を設けとくだけでもいいんでねいかともつらつら。

難しく考えすぎなんだろうか。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN