幾何学モデリング

Euslispは、3次元の幾何学モデルの内部表現として(境界表現)を採用している。 Brep内の要素はedge, plane, polygon, face, hole,bodyクラスによって 表現される。 基本bodyの作成関数とbodyの合成関数は、これらのクラスの新しい インスタンスを作る。 もっと属性を持った独自の幾何学クラスを使用するためには、 edge-class*, *face-class*body-class*の特殊変数に 独自のクラスオブジェクトを設定すること。

頂点とエッジと面の分類

頂点とエッジと面の分類

種々の幾何学関数

vplus vector-list

のすべての要素の合計を実数ベクトルとして 新しく作り、返す。 v+との違いは、vplusが2つ以上の引数について合計を計算し、 結果のベクトルが指定できない点である。

vector-mean vector-list

の平均ベクトルを返す。

triangle a b c &optional (normal #f(0 0 1))

は、2次元または3次元の実数ベクトルである。 normalは、a,b,cが置かれる平面の正規ベクトルである。 trianglea,b,cで形作られる三角形の領域の2倍の大きさを返す。 normalと同じ方向から見たときにa,b,cが時計方向に回転する ならば、triangleは正である。 言い換えると、もしtriangleが正ならば、 ca-bの線分の左手側に位置し、 ba-cの右手側に位置している。

triangle-normal a b c

で定義される三角形に対して垂直方向の正規ベクトルを見つける。

vector-angle v1 v2 &optional (normal (v* v1 v2))

2つのベクトルの角度を計算する。 これは次の式であらわされるatan(normal\(\cdot\)(v1:math:timesv2), v1\(\cdot\)v2)。 v1,v2normalは正規ベクトルでなければならない。 normalが与えられないとき、v1,v2の共通垂線の正規ベクトルが 使用される。この場合、結果は\(0\)から\(\pi\)までの範囲の正の角度になる。 符号付きの角度を得るためには、normalを指定しなければならない。

face-normal-vector vertices

同じ平面の上にあるベクトルのリストから面の正規化ベクトルを計算する。

farthest p points

3次元ベクトルのリストpointsの中からpより最も遠い点を捜す。

farthest-pair points

3次元ベクトルのリストpointsからもっとも遠い点の組を 捜す。

maxindex 3D-floatvec

の3つの要素の中で絶対値が最大の要素の位置を捜す。

random-vector &optional (range 1.0)

3次元デカルト空間の中で同次的に分散されるランダムベクトルを発生する。

random-normalized-vector &optional (range 1.0)

3次元の正規化ランダムベクトルを返す。

random-vectors count range

の大きさのランダムベクトルをcount個つくり、そのリストを返す。

line-intersection p1 p2 p3 p4

は、すべて2次元以上の実数ベクトルである。 p1-p2p3-p4が平面上の2つの線分として定義される。 line-intersectionは、これらの2つの線分の交差する点のパラメータ(線分に置ける 交点の位置の比率)を2要素のリストで返す。3次元で使用するとき、 p1, p2, p3, p4は共通平面内になければならない。

collinear-p p1 p2 p3 &optional tolerance

は、すべて3次元の実数ベクトルで3つの点を表現している。 collinear-pは、もし\(\Vert\)((p2:math:-p1)\(\times\)(p3:math:-p1))\(\Vert\)が coplanar-threshold*より小さければ、p1-p3の線分の上に p2を投影したときのパラメータを返す。そうでなければ、NILを返す。

find-coplanar-vertices p1 p2 p3 vlist

は、3次元の実数ベクトルで、この3つのベクトルから平面を表現している。 find-coplanar-verticesは、その平面内にある点を vlistの中から捜す。

find-connecting-edge vertex edgelist

に接続されたedgelistの中からエッジを捜す。

make-vertex-edge-htab bodfacs

は、bodyあるいはfaceのリストである。 make-vertex-edge-htabは、bodfacsの中の頂点を抽出し、それに接続されるエッジの検索ができる ハッシュテーブルを作る。

left-points points p1 p2 normal

は、正規化ベクトルnormalで表現される 平面内にあるものと仮定する。 left-pointsは、p1, p2間の線分の左側に置かれている点を pointsの中から捜し、集める。

right-points points p1 p2 normal

は、正規化ベクトルnormalで表現される 平面内にあるものと仮定する。 right-pointsは、p1, p2間の線分の右側に置かれている点を pointsの中から捜し、集める。

left-most-point points p1 p2 normal

は、正規化ベクトルnormalで表現される 平面内にあるものと仮定する。 left-most-pointsは、p1, p2で決定される線分の左側に置かれている点を pointsの中から捜し、その中でもっとも遠い点を返す。

right-most-point points p1 p2 normal

は、正規化ベクトルnormalで表現される 平面内にあるものと仮定する。 right-most-pointsは、p1, p2で決定される線分の右側に置かれている点を pointsの中から捜し、その中でもっとも遠い点を返す。

eps= num1 num2 &optional (tolerance *epsilon*)

2つの実数num1num2を比較して、torelanceの誤差範囲内で 等しいかどうかを返す。

eps:math:`<` num1 num2 &optional (tolerance *epsilon*)

が明らかにnum2よりも小さいときTを返す。すなわち、 num1\(<\)num2-toleranceである。

eps:math:`<=` num1 num2 &optional (tolerance *epsilon*)

が多分num2よりも小さいときあるいは等しいときTを返す。すなわち、 num1\(<\)num2+toleranceである。

eps:math:`>` num1 num2 &optional (tolerance *epsilon*)

が明らかにnum2よりも大きいときTを返す。すなわち、 num1\(>\)num2+toleranceである。

eps:math:`>=` num1 num2 &optional (tolerance *epsilon*)

が多分num2よりも大きいときあるいは等しいときTを返す。すなわち、 num1\(>\)num2-toleranceである。

bounding-box

:super = ** object**
:slots (minpoint maxpoint)

xy-,yz-やzx-平面に平行な面を境界とする最小の四角柱を定義する。 bounding-boxは、初期に与えられるベクトルの次元によって、 どんな次元でも使用することができる。 bounding-boxは、surrounding-boxの名前で定義されていた。

:box **

このbounding-boxのオブジェクト自身を返す。

:volume **

このbounding-boxの体積を返す。

:grow rate

このbounding-boxのサイズをrate率で増加または減少させる。 rateが0.01のとき、1%拡大される。

:inner point

がこのbounding-box内にあればTを返し、 そうでないときはNILを返す。

:intersection box2 &optional tolerance

このbounding-boxbox2との共通bounding-boxを返す。 もし、torelanceが与えられたならば、このboxはその誤差で拡大される。 もし、共通部分がなければ、NILを返す。

:union box2

このbounding-boxbox2を結合したbounding-boxを返す。

:intersectionp box2

このbounding-boxbox2との間に共通領域があればTを返し、 そうでなければNILを返す。 このメソッドは、:intersectionよりも速い。なぜなら、新しい bounding-boxのインスタンスを作らないためである。

:extreme-point direction

このbounding-boxの8つの頂点の中で、directionとの内積が最大のものを 返す。

:corners **

このbounding-boxのすべての頂点のリストを返す。 もし、このboxが2次元であれば、4点が返される。 同様に3次元の場合、8点が返される。

:below box2 &optional (direction #(0 0 1)

このbounding-boxbox2に対してdirectionの示すベクトル の下の方向にあればTを返す。 このboundign-boxdirectionの方向に動かされるとき、 2つのboxに共通部分でできるかどうかをチェックするために使用される。

:body **

このbounding-boxによって内包される立方体を表現する bodyを返す。

:init vlist &optional tolerance

とmaxpointスロットをvlistから設定する。 もし、torelanceが指定されたなら、このbounding-boxは その量で増大される。

make-bounding-box points &optional tolerance

のリストの中から最小と最大の座標値を見つけ、 bounding-boxのインスタンスを作る。

bounding-box-union boxes &optional (tolerance *contact-threshold*)

の結合で表現されるbounding-boxのインスタンスを作る。 その結果は、toleranceによって拡張される。

bounding-box-intersection boxes &optional (tolerance *contact-threshold*)

の共通領域を表現するbounding-boxのインスタンスを作る。 その結果は、toleranceによって拡張される。

線とエッジ

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

line

:super = ** propertied-object**
:slots ((pvert :type float-vector) (nvert :type float-vector))

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

:vertices **

とnvertのリストを返す。

:point p

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

:parameter point

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

:direction **

からnvertへ向かう正規化ベクトルを返す。

:end-point v

この線分の他の端点を返す。すなわち、 もしvがpvertに等しいとき、nvertを返す。 もしvがnvertに等しいとき、pvertを返す。 それ以外のとき、NILを返す。

:box **

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

:boxtest box

とこの線分のbounding-boxの共通部分をチェックする。

:length **

この線分の長さを返す。

:distance point-or-line

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

:foot point

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

:common-perpendicular l

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

:project plane

にpvertとnvertを投影した2つの点のリストを返す。

:collinear-point point &optional (tolerance *coplanar-threshold*)

を用いてtorelanceの誤差範囲内でpointがこの線分と 一直線上にあるかどうかをチェックする。 もし、pointがこの線分と一直線上にあるとき、その線分のその点に 対するパラメータを返す。そうでなければ、NILを返す。

:on-line-point point &optional (tolerance *coplanar-threshold*)

がこの線分と一直線上にあり、pvertとnvertとの間に あるかどうかをチェックする。

:collinear-line ln &optional (tolerance *coplanar-threshold*)

がこの線分と共通線上にあるとき、すなわちlnの両端がこの線分上に あるときTを返し、そうでないときNILを返す。

:coplanar ln &optional (tolerance *coplanar-threshold*)

とこの線分が共通平面上にあるかどうかをチェックする。 この線分の両端とlnの1つの端点で平面が定義される。 もし、lnの他の端点がその平面上にあるとき、Tを返す。 そうでなければ、NILを返す。

:intersection ln

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

:intersect-line ln

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

edge

:super = ** line**
:slots (pface nface
(angle :type float)
(flags :type integer))

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

make-line point1 point2

をpvertとし、point2をnvertとする lineのインスタンスを作る。

:pvertex pf

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

:nvertex face

をこのエッジの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

をpfaceとし、pvをpvertexとし、nvを nvertexとして設定する。 このメソッドは、このエッジの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

平面と面

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

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

:intersection-edge edge

この平面とpoint1point2で表現される線分あるいはエッジとの 交点のパラメータを返す。

:foot point

この平面上にpointを直角に投影した位置の3次元ベクトルを返す。

:init normal point

を通りnormalを面の正規化ベクトルとする平面を定義する。 normalは、正規化されていなければならない。\(|normal|=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

と正規化方向ベクトルvnormによって定義される 擬似線分との交点を計算する。

:intersect-line p1 p2

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

:intersect-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がこの面の外側の輪郭の中にあり,どれかの穴の 範囲内にあるならば,外側として分類される。

:area **

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

:centroid &optional point

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

:invert **

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

:enter-hole hole

この面に穴holeを加える。

:primitive-body **

この面を定義する基本bodyを返す。

:id **

や(: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

立体(body)

body

:super = ** cascaded-coords**
:slots (faces edges vertices model-vertices box convexp evertedp csg)

3次元形状を定義する。

:magnify rate

このbodyのサイズをrateで変更する。拡大は,csgリストの中に 記録される。

:translate-vertices vector

モデルの頂点を相対移動する。vectorはローカル座標系で与えられなければならない。 変換はcsgリストに記録される。

:rotate-vertices angle axis

モデルの頂点をaxis軸回りにangleラジアン回転させる。 回転はcsgリストに記録される。

:reset-model-vertices **

:newcoords rot &optional pos

座標系をrotposを用いて変更する。 posが省略された時はnewrotにはcoordinatesのインスタンスを与える。

:vertices **

このbodyのすべての頂点のリストを返す。

:edges **

このbodyのすべてのエッジのリストを返す。

:faces **

このbodyを構成するすべての面のリストを返す。

:box **

このbodybounding-boxを返す。

:Euler **

このbodyのオイラー数を計算する。これは, faces+vertices\(-\)edges\(-\)2\(-\)holesである。 これは,\(-\)2ringsと等しくなるべきである。

:perimeter **

すべてのエッジの長さの合計を返す。

:volume &optional (reference-point #f(0 0 0))

このbodyの体積を返す。

:centroid &optional (point #f(0 0 0)

このbodyが均質な立体と仮定し,重心の位置を返す。

:possibly-interfering-faces box

:common-box body

このbodyと他のbodyの共通な最小のboxを返す。 もし,2つのbodyが干渉しているならば,その交差部分は この共通boxの中に存在するはずである。

:insidep point

もし,pointがこのbodyに属するなら,:insideを返す。 もし,pointがこのbodyの表面上にある場合,:borderを返す。 そうでなければ,:outsideを返す。

:intersect-face face

もし,このbodyの面とfaceの間に干渉がある場合,Tを返す。

:intersectp body

このbodyと他のbodyとの間の交差部分を返す。

:evert **

すべての面とエッジの方向を反転させる。 そのため,このbodyの内部は外部になる。

:faces-intersect-with-point-vector point direction

からdirectionの方向に伸びるベクトルと交差する面をすべて集める。

:distance target

は,実数ベクトルあるいは平面オブジェクトである。 :distanceメソッドは,targetから最も近い面を見つけ, その面と距離のリストを返す。

:csg **

が構築された履歴であるcsgスロットを返す。

:primitive-body **

このbodyを構築する基本bodyのリストを返す。

:primitive-body-p **

もし,このbodyが[primitive-body-creation] 節で示される関数の内の1つから作られた基本bodyであるなら,Tを返す。

:creation-form **

このbodyを作るためのLisp表現を返す。

:body-type **

もし,このbodyが基本bodyあるいはこのbodyの表現が複雑(に構成された) bodyなら,作成パラメータのリストを返す。

:primitive-groups **

2つの要素をもつリストを返す。 最初の要素は,このbodyを構成するために追加(body+)された基本body のリストである。次の要素は,差し引かれた基本bodyのリストである。

:get-face &optional body face id

は,このbodyを構成しているbodyのインスタンスであり, 基本body型の1つである。例えば,:cube, :prism, :cone, :solid-of-resolutionなどか あるいはNILである。 もし,faceidも与えられないならば,bodyに一致する面をすべて返す。 もし,faceが与えられたなら,その上にフィルターが実行される。 faceは,:top,:bottomと:sideの内の1つでなければならない。 (send abody :get-face :cylinder :top)は,abodyを構成する円柱の上面すべてを返す。 もし,faceが:sideなら,idで番号付けされた面を取り出すことができる。 (send abody nil :side 2)は,idが0から始まるため,abodyを構成する bodyの側面から3番目の面をすべて返す。

:init &key faces edges vertices

よりこのbodyを初期化する。 :facesは,必要な引き数である。 :faces,:edges:verticesは完全な立体モデルを定義するために 矛盾のない関係を持っていなければならないので,矛盾した引き数でこのメソッドを 呼び出すことは,意味の無いことである。 bodyを作るために,[primitive-body-creation]節で書いている基本bodyの作成関数と [BodyComposition]節の**body**合成関数を使用する。

:constraint b

このbodybに接触しているとき, このbodyの拘束を返す。このメソッドの詳細な説明は[Contact]節を参照すること。

基本bodyの作成関数

make-plane &key normal point distance

を通り,normalの方向を向いたplaneオブジェクトを作る。 pointを与える代わりdistanceを指定することもできる。

*xy-plane* **

*yz-plane* **

*zx-plane* **

基本body

基本body

make-cube xsize ysize zsize &key name color

x,y,z軸の方向に大きさがxsize,ysize,zsizeである,直方体を作る。 この直方体の原点はbodyの中心に置かれる。

make-prism bottom-points sweep-vector &key name color

に沿ったbottom-pointsにより定義される 形状を積み上げることにより角柱を作る。 もし、sweep-vectorが実数ベクトルでなく数字であれば、\(z\)方向の 角柱の高さとして扱われる。 bottom-pointsは,このbodyの底面を定義する順番になっていなければならない。 例えば, (make-prism ’(#f(1 1 0) #f(1 -1 0) #f(-1 -1 0) #f(-1 1 0)) 2.0) は,高さ2.0の直方体を作る。

make-cylinder radius height &key (segments 12) name color

半径radiusと高さheightで指定される円柱を作る。 底面は,xy-平面に定義され,座標系の原点は底面の中心に置かれる。

make-cone top bottom &key (segments 16) color name

頂点がtopで底面がbottomである角錐を作る。 topは,3次元ベクトルである。 bottomは,底面の頂点のリストあるいは半径である。 もし,頂点のリストなら,順番を慎重にしなさい。 `` (make-cone #f(0 0 10) (list #f(10 0 0) #f(0 10 0) #f(-10 0 0) #f(0 -10 0)))`` は,正方形の底面を持つ四角錐を作る。

make-solid-of-revolution points &key (segments 16) name color

は,z軸まわりの時計方向に回転される。 もし、pointsのリストの2つの端点がz軸上に置かれてないならば, 曲面を作る。したがって, (make-solid-of-revolution ’(#f(0 0 1) #f(1 0 0))) は、円錐を作り、 (make-solid-of-revolution ’(#f(1 0 1) #f(1 0 0))) は、円柱を作る。 pointsは、順番が重要であり、\(z\)軸の高い方から低い方へ 整列しておくことが望まれる。

make-torus points &key (segments 16) name color

ドーナッツのようなtorus形状を作る。 pointsは,断面上の頂点のリストである。

make-icosahedron &optional (radius 1.0)

正20面体を作る。それぞれの面は正三角形である。

make-dodecahedron &optional (radius 1.0)

正12面体を作る。それぞれの面は,正五角形である。

make-gdome abody

の三角面を4つの面に小分けすることにより 測地ドームを新しく作る。 abodyは,最初正20面体とすべきである。 それから,make-gdomeの結果を再帰的にmake-gdomeに与えることができる。 それぞれの呼び出しで,測地ドームの面の数は,4倍に増加する。すなわち, 20, 80, 320, 1280, 5120などになる。

(setq g0 (make-icosahedron 1.0))        ; 20 facets
(setq g1 (make-gdome g0))               ; 80 facets
(setq g2 (make-gdome g1))               ; 320 facets
...

grahamhull vertices &optional (normal #f(0 0 1))

Grahamのアルゴリズムを用いて,2次元上で凸状の覆いを計算する。 quickhullよりも遅い。

quickhull vertices &optional (normal #f(0 0 1))

2分探索法を用いて2次元上で凸状の覆いを計算する。

convex-hull-3d vertices

gift-wrapping法を用いて3次元上で凸面の覆いを計算する。

make-body-from-vertices vertices-list

矛盾しない順番になっている面のループを定義する頂点のリストからbodyを返す。

bodyの合成関数

face+ face1 face2

face* face1 face2

face2は,3次元上で共通平面上にある。 face+は,これらの面の結合を構築し,面のオブジェクトとして返す。 もし,交差領域がないなら,元の2つの面が返される。 face*は,これらの面の交差領域を返す。もし,交差領域がなければ,NILを返す。

cut-body body cutting-plane

cutting-planeで切断し,その切断面に作られる面のリストを返す。

body+ body1 body2 &rest more-bodies

body- body1 body2

body* body1 body2

2つあるいはそれ以上のbodyの和,差あるいは積を計算する。 それぞれのbodyは,body+, body-, body*の処理を行う前に コピーされ,元のbodyは変更されない。 その結果のbodyの新しい座標系の位置・姿勢は,ワールド座標系のものと一致している。 もし,しきい値パラメータcoplanar-threshold*,contact-threshold*,parallel-threshold* を正確に設定するなら,2つのbodyが面同士で接触している場合でも これらの関数は正しく働くであろう。 しかしながら,もしbodyの頂点が他のbodyの頂点あるいは面に接触している場合, どの処理も失敗する。

body/ body plane

で作られたplaneクラスのインスタンスであるplanebodyを切断する。新しく作られたbodyが返される。

body-interference &rest bodies

の中で1対1の組み合わせにおける干渉をチェックし, 交差している2つのbodyのリストを返す。

座標軸

coordinates-axesクラスは,画面上に表示可能な3次元座標軸を定義する。 それぞれの軸とz軸の頂点の矢印は,lineオブジェクトで定義される。 このクラスは,cascaded-coordsを継承しているので, このクラスのオブジェクトは,bodyのような他のcascaded-coordsを元とする オブジェクトに付けることができる。 このオブジェクトは,bodyの座標軸あるいは他の座標の相対座標系を見るために 使用される。

coordinates-axes

:super = ** cascaded-coords**
:slots (size model-points points lines)

表示可能な3次元座標軸を定義する。