線とエッジ

頂点の順番やエッジの順番の向きは、bodyを外から見たときに反時計方向 に整列するように定義される。 pvertexnvertexpfacenfaceは、 pfaceが外から見たときエッジの左側に位置しているとき、 pvertexからnvertexに向かう方向にエッジを定義する。




line [クラス]


  :super   propertied-object 

:slots ((pvert :type floatvector)(nvert :type floatvector))


pvertnvertの上を通る線分を定義する。 線分は、pvertからnvertに向かう方向を持つ。 t $ \cdot$ pvert +(1-t)nvert


:vertices [メソッド]

pvertnvertのリストを返す。


:point p [メソッド]

この線分の上でpパラメータで示される位置の3次元のベクトルを返す。 p $ \cdot$ pvert + (1-p)nvert


:parameter point [メソッド]
この線分の上のpointに対するパラメータを計算する。 これは、:pointメソッドの逆メソッドである。


:direction [メソッド]
pvertからnvertへ向かう正規化ベクトルを返す。


:end-point v [メソッド]
この線分の他の端点を返す。すなわち、 もしvpvertに等しいとき、nvertを返す。 もしvnvertに等しいとき、pvertを返す。 それ以外のとき、NILを返す。


:box [メソッド]

この線分のbounding-boxを作成し、返す。


:boxtest box [メソッド]
boxとこの線分のbounding-boxの共通部分をチェックする。


:length [メソッド]
この線分の長さを返す。


:distance point-or-line [メソッド]
この線分とpoint-or-lineの間の距離を返す。 もし点からこの線分におろした垂線の足が pvertnvertの間になければ、 最も近い端点までの距離を返す。 このメソッドを使うことにより、2つの線分の間の距離を計算することができるため、 2つの円柱の間の干渉をテストすることができる。


:foot point [メソッド]

pointからこの線分へおろした垂線の足である点を示すパラメータ を見つける。


:common-perpendicular l [メソッド]
この線分とlとに垂直な線分を見つけ、2つの3次元ベクトルのリスト として返す。 2つの線分が平行で共通な垂線が一意に決定できないとき、:parallelを返す。


:project plane [メソッド]
planepvertnvertを投影した2つの点のリストを返す。


:collinear-point point &optional (tolerance *coplanar-threshold*) [メソッド]
collinear-pを用いてtorelanceの誤差範囲内でpointがこの線分と 一直線上にあるかどうかをチェックする。 もし、pointがこの線分と一直線上にあるとき、その線分のその点に 対するパラメータを返す。そうでなければ、NILを返す。


:on-line-point point &optional (tolerance *coplanar-threshold*) [メソッド]
pointがこの線分と一直線上にあり、pvertnvertとの間に あるかどうかをチェックする。


:collinear-line ln &optional (tolerance *coplanar-threshold*) [メソッド]
lnがこの線分と共通線上にあるとき、すなわちlnの両端がこの線分上に あるときTを返し、そうでないときNILを返す。


:coplanar ln &optional (tolerance *coplanar-threshold*) [メソッド]
lnとこの線分が共通平面上にあるかどうかをチェックする。 この線分の両端とlnの1つの端点で平面が定義される。 もし、lnの他の端点がその平面上にあるとき、Tを返す。 そうでなければ、NILを返す。


:intersection ln [メソッド]
lnは、この線分と共通平面上にあるとする。 :intersectionは、これら2つの線分の交点に対する2つのパラメータの リストを返す。 パラメータは0から1までの実数である。これは、両端で区切られた 線分の内分点を示す。2つの線が平行であるときNILを返す。


:intersect-line ln [メソッド]
lnは、この線分と共通平面上にあるとする。 交点のパラメータが:parallel, :collinear:intersectのような シンボル情報と共に返される。



edge [クラス]


  :super   line 

:slots (pface nface
(angle :type float)
(flags :type integer))


2つの面の間の交差線分として定義されるエッジを表現する。 pfacenfaceがスロットの中に定義されているが、 それらの解釈はこのエッジの方向によって相対的に決まる。 例えば、このエッジがpvertからnvertに向かっていると 考えたとき、pfaceが正しいpfaceを表現している。 そのため、:pface:nfaceメソッドで適当な面を選択するためには、 pvertとnvertの解釈を与えなければならない。


make-line point1 point2 [関数]

point1pvertとし、point2nvertとする lineのインスタンスを作る。


:pvertex pf [メソッド]

pfをこのエッジのpfaceとみなしたpvertexを返す。


:nvertex pf [メソッド]

pfをこのエッジのpfaceとみなしたnvertexを返す。


:body [メソッド]

このエッジを定義するbodyオブジェクトを返す。


:pface pv nv [メソッド]
仮想的にpvnvをこのエッジの pvertとnvertに解釈したときのpfaceを返す。


:nface pv nv [メソッド]
仮想的にpvnvをこのエッジの pvertとnvertに解釈したときのnfaceを返す。


:binormal aface [メソッド]
このエッジとafaceの正規化ベクトルに垂直な方向ベクトルを見つける。


:angle [メソッド]
このエッジでつながった2つの面の間の角度を返す。


:set-angle [メソッド]
このエッジでつながった2つの面の間の角度を計算し、 それをangleスロットに置く。


:invert [メソッド]



:set-face pv nv f [メソッド]
fpfaceとし、pvpvertexとし、nvnvertexとして設定する。 このメソッドは、このエッジのpfaceあるいはnfaceを変更することに 注意すること。


:contourp viewpoint [メソッド]

もし、このエッジが輪郭エッジであれば、すなわち、このエッジのpface あるいはnfaceのどちらかがviewpointから見え、もう一方が 見えないならTを返す。


:approximated-p [メソッド]

このエッジが円柱の側面のような曲面を表現するための近似エッジであるならば、 Tを返す。 近似エッジは部分直線で曲線を表現するのに必要である。


:set-approximated-flag &optional (threshold 0.7) [メソッド]

Euslispでは、どんな曲面もたくさんの平面で近似される。 flagsのLSBは、このエッジの両側の面が曲面であるかどうかを 示すために使用される。

もし、2つの面の間の角度がthresholdより大きいなら、 :set-approximated-flagは、このフラグをTに設定する。



:init &key :pface :nface :pvertex :nvertex [メソッド]



2016-04-05