0

立方体と 3 つの間隔 Cx、Cy、および Cz を、それぞれ x、y、および z 軸上の立方体の投影として定義する必要があります。interval predicate を使用することになっていますinterval_dur。リンク上の画像は、私が本当に必要としているものをより明確にするかもしれません。

立方体投影

元の質問は次のようになります。

各軸上の投影間の定性的な関係を考慮することで、直方体の内側上部などの 3 次元の定性的な空間関係を定義できます。図 1 はC、x 軸、y 軸、および z 軸上に間隔投影された直方体を示しています。(a) 立方体を定義しCます。3 つの区間CxCy、およびCzを、それぞれ x 軸、y 軸、z 軸上の直方体の射影として定義します。インターバル述語を使用しますinterval_dur

4

2 に答える 2

0

確かに、この回答はトピックから外れている可能性がありますが、質問に SWI-Prolog のタグを付けたので、バージョン 7.1 で利用可能になった拡張機能を示します: dicts

:- module(cuboid, []).

M.cx() := Cx :- Cx is M.x2 - M.x1 .
M.cy() := Cy :- Cy is M.y2 - M.y1 .
M.cz() := Cz :- Cz is M.z2 - M.z1 .

M.volume() := V :- V is M.cx() * M.cy() * M.cz().

M.scale(F) := cuboid{x1:X1, x2:X2, y1:Y1, y2:Y2, z1:Z1, z2:Z2} :-
        maplist(mult(F, M), [x1,x2, y1,y2, z1,z2], [X1,X2, Y1,Y2, Z1,Z2]).

mult(F, M, A, V) :- V is M.A * F.

ここに使用例があります

1 ?- C = cuboid{x1:1, x2:2, y1:1, y2:2, z1:1, z2:2}, writeln(C.volume()).
1
C = cuboid{x1:1, x2:2, y1:1, y2:2, z1:1, z2:2}.

2 ?- S = $C.scale(3), Vs = S.volume().
S = cuboid{x1:3, x2:6, y1:3, y2:6, z1:3, z2:6},
Vs = 27.

spatial relations私は、またはqualitative relationsあなたが探していることについてほとんど手がかりがありません。2つの直方体の間の空間関係のセットになると思います。

intersect, is_on_top, is_at_left, etc...

処理するアプリケーション ドメインに応じて、制約ライブラリの使用を検討してください。実数の場合は library( clpr )、有理数の場合は library( clpq )、整数の場合は library( clpfd )。

この最後のものはより開発されており、積極的に管理されています。

于 2013-12-24T00:31:24.390 に答える