Skip to content
Daisuke YAMAGUCHI edited this page Sep 7, 2016 · 20 revisions

要約

Siren::BndBox クラスは、 X, Y, Z 軸それぞれの方向に大きさを持つ直方体の入れ物のようなものです。形状が存在している空間を概略的に表すために用います。 Open CASCADE における Bnd_Box クラスに相当します。

複雑な幾何形状同士の正確な交線計算を大量に行うと大きな処理コストがかかります。X, Y, Z 軸方向それぞれに「幾何形状が存在する範囲」を表すバウンディングボックスを交差判定などに用いると、コストを書けずに交差しない物体を処理から弾くことができます。また、座標系の入れ子を意識せずに、ワールド座標系における幾何形状の存在しているおおよその位置と大きさを取得することが可能です。

特異メソッド

  • new -> BndBox
    • 空(void)のバウンディングボックスのインスタンスを作成します。

インスタンスメソッド

  • add(shape|[x, y, z]|bndbox) -> nil

    • バウンディングボックスに Shape オブジェクト、座標、または別のバウンディングボックスを追加します。バウンディングボックスは追加されたものを内包する大きさになるので、既存の状態よりも外側にあるオブジェクトや座標が追加された場合、破壊的に範囲が拡張されます。
  • min -> [x, y, z]

    • バウンディングボックスが示す最小位置を返します。
  • max -> [x, y, z]

    • バウンディングボックスが示す最大位置を返します。
  • void? -> bool

    • 空かどうかを返します。
  • void! -> nil

    • 空に設定します。破壊的メソッドです。
  • whole? -> bool

    • X, Y, Z 軸方向の大きさそれぞれが無限大であれば真を返します。
  • whole! -> nil

    • X, Y, Z 軸方向の大きさそれぞれを無限大に設定します。破壊的メソッドです。
  • gap -> float, gap = float

    • ギャップを取得・設定します。
  • openxmin? -> bool, openymin? -> bool, openzmin? -> bool, openxmax? -> bool, openymax? -> bool, openzmax? -> bool

    • X, Y, Z 軸方向の範囲の最小値・最大値のそれぞれについて、無限大であれば真を返します。
  • openxmin! -> nil, openymin! -> nil, openzmin! -> nil, openxmax! -> nil, openymax! -> nil, openzmax! -> nil

    • X, Y, Z 軸方向の範囲の最小値・最大値のそれぞれについて、無限大に設定します。破壊的メソッドです。
  • xthin?(tol) -> bool, ythin?(tol) -> bool, zthin?(tol) -> bool

    • X, Y, Z 軸方向のそれぞれの範囲の大きさが、tol で指定したトレランス以下の場合、真を返します。
  • center -> [x, y, z]

    • バウンディングボックスの中心座標を取得します。いずれかの軸方向の範囲が無限大だった場合、値は保証されません。
  • xsize -> float, ysize -> float, zsize -> float

    • バウンディングボックスの各軸方向の大きさを取得します。いずれかの軸方向の範囲が無限大だった場合、値は保証されません。
  • out?(BndBox) -> bool

    • 指定したバウンディングボックスがこのバウンディングボックスの外にあるかどうかを取得します。一部でも重なっていれば偽を返します。
  • to_s -> String, inspect -> String

    • 保持している情報を人間が読める文字列にします。
  • dist(BndBox) -> float

    • 指定されたバウンディングボックスとの最短距離を取得します。
  • square -> float

    • このバウンディングボックスの対角線の距離を取得します。

補足

BndBox は、 Shape#bndbox取得した時点での形状の大きさを保持するものであり、元の形状の大きさを都度評価しているわけではありません。

# 10x10x10 のボックスを作成
box = Siren.box [10,10,10]

# box の現在のバウンダリーボックスを取得
bnd = box.bndbox

# 元の形状を原点を中心に2倍に拡大する
box.scale! [0, 0, 0], 2

# bnd は2倍にする前の値を保持
p bnd
 => #<BndBox:0x2755de0
    xmin=-0.000000, ymin=-0.000000, zmin=-0.000000,
    xmax=10.000000, ymax=10.000000, zmax=10.000000>

# box.bndbox で再取得すると変更されていることが分かる
p box.bndbox
 => #<BndBox:0x2755ca8
    xmin=-0.000000, ymin=-0.000000, zmin=-0.000000,
    xmax=20.000000, ymax=20.000000, zmax=20.000000>

Clone this wiki locally