平面と面

planeオブジェクトは、その平面の正規化ベクトルと座標原点から平面までの 距離で表現される。 2対の正規化ベクトルと距離がplaneオブジェクトに記録される。 1つは、変換後の現状を表現し、もう1つが平面を定義したときの 正規化ベクトルと距離を表現する。




plane [クラス]


  :super   propertied-object 

:slots ((normal :type float-vector)
(distance :float))


平面方程式を定義する。平面は境界がなく、無限に広がっているものとする。


:normal [メソッド]

この平面の正規化ベクトルを返す。


:distance point [メソッド]
この平面とpointとの間の距離を計算する。


:coplanar-point point [メソッド]
もし、pointがこの平面の上に置かれているならTを返す。


:coplanar-line line [メソッド]
もし、lineがこの平面の上に置かれているなら、Tを返す。


:intersection point1 point2 [メソッド]

point1point2を端点とする線分とこの平面との交点 を計算する。その線分の上の交点に対するパラメータを返す。 もし、線分とこの平面が平行であるなら、:parallelを返す。


:intersection-edge edge [メソッド]
この平面とpoint1point2で表現される線分あるいはエッジとの 交点のパラメータを返す。


:foot point [メソッド]
この平面上にpointを直角に投影した位置の3次元ベクトルを返す。


:init normal point [メソッド]

pointを通りnormalを面の正規化ベクトルとする平面を定義する。 normalは、正規化されていなければならない。 $ \vert normal\vert=1$



polygon [クラス]


  :super   plane 

:slots (convexp edges vertices
(model-normal float-vector)
(model-distance :float))


polygonは、平面の上の輪で表現される。 convexpは、その輪が凸面であるかどうかを示す論理フラグである。 edgesは、この輪の輪郭や頂点のリストであるverticesで 形成されるエッジのリストである。


:box &optional tolerance [メソッド]

この多角形のためのbounding-boxを返す。


:boxtest box2 &optional tolerance [メソッド]
この多角形のためのbounding-boxを作成し, そのboundign-boxbox2との共通領域を返す。 もし,共通領域がなかった場合,NILを返す。


:edges [メソッド]
この多角形のエッジのリストを返す。 そのリストは,この平面の正規化ベクトルに沿ってその多角形を見たとき, 時計方向の順番になっている。 もし,正規化ベクトルをねじと考えると,そのエッジは ねじを入れる方向に回転させる向きの順番になっている。 多角形または面が立体オブジェクトの面を表現するために使用されているとき, その正規化ベクトルはその立体の外側に向かっている。 多角形をそのオブジェクトの外側から見たとき,エッジは 反時計方向の順番になっている。


:edge n [メソッド]
エッジのn番目の要素を返す。


:vertices [メソッド]
この多角形の頂点をエッジと同じ順番にならべたものを返す。 最初の頂点は,そのリストの最後に重複してコピーされているため, そのリストは実際の頂点の数より1だけ長くなっていることに注意すること。 これは,頂点のリストを用いてエッジへの変換を簡単にするためである。


:vertex n [メソッド]
頂点のn番目の要素を返す。


:insidep point &optional (tolerance *epsilon*) [メソッド]
この領域に対して相対的に置かれたpointの位置にしたがって :inside,:outsideあるいは:borderを返す。


:intersect-point-vector point vnorm [メソッド]
pointと正規化方向ベクトルvnormによって定義される 擬似線分との交点を計算する。


:intersect-line p1 p2 [メソッド]
p1p2で指定される線分との交点を計算する。 その結果は、交点がなければNILを返し,交点があればその交点の位置の パラメータのリストを返す。


:intersect-edge edge [メソッド]
edgeで指定される線分との交点を計算する。 その結果は,交点がなければNILを返し、交点があれば 交点の位置のパラメータのリストを返す。


:intersect-face aregion [メソッド]
もし,この領域がaregionと交差しているなら,Tを返す。


:transform-normal [メソッド]


:reset-normal [メソッド]
この多角形の現在のverticesリストから面の正規化ベクトルを再計算する。


:invert [メソッド]


:area [メソッド]
この領域の面積を返す。


:init &key :vertices :edges :normal :distance [メソッド]



face [クラス]


  :super   polygon 

:slots (holes mbody primitive-face id)


穴を持った面を定義する。 mbodytypeは、基本bodyとbody内の面の属性(:top, :bottom, :side) を表現する。


:all-edges [メソッド]



:all-vertices [メソッド]
この面および内部ループ(穴)の輪郭のエッジあるいは頂点をすべて返す。 :edges:verticiesメソッドは, 輪郭を構成するエッジと頂点のみを返す。


:insidep point [メソッド]
pointがこの面の内部にあるかどうかを決定する。 もしpointがこの面の外側の輪郭の中にあり,どれかの穴の 範囲内にあるならば,外側として分類される。


:area [メソッド]
この面の面積を返す。 これは,外側のエッジで囲まれる面積から穴の面積を引いたものである。


:centroid &optional point [メソッド]
この面の重心を表現する実数と実数ベクトルのリストを返す。 もし,pointが与えられないならば,最初の数はこの多角形の 面積を表わし,2番目のベクトルがこの多角形の重心の位置を示す。 もし,pointが与えられたならば,この多角形を底面としその点を頂点 とするような多角錐を考え,その体積と重心のベクトルを返す。


:invert [メソッド]
この面の向きをひっくり返す。 正規化ベクトルが逆方向とされ,エッジループの順番も反転される。


:enter-hole hole [メソッド]
この面に穴holeを加える。


:primitive-body [メソッド]
この面を定義する基本bodyを返す。


:id [メソッド]
(:bottom), (:top)(:side seq-no.)の中の1つを返す。


:face-id [メソッド]
基本bodyの型とこの面の型をリストで返す。 例えば,円柱の側面は ((:cylinder radius height segments) :side id)を返す。


:body-type [メソッド]
この面を定義する基本bodyを返す。


:init &key :normal :distance :edges :vertices :holes [メソッド]



hole [クラス]


  :super   polygon 

:slots (myface)


穴は,面の内部ループを表現する多角形である。faceのオブジェクトは、 自分のholesスロット の中にholeのリストを持っている。


:face [メソッド]

このholeを含む面を返す。


:enter-face face [メソッド]
このholeを囲んでいる面faceへリンクを作る。 このメソッドは、faceクラスの:enter-holeメソッドと共に 使用されるものである。


:init &key :normal :distance :edges :vertices :face [メソッド]


2016-04-05