Skip to content
Daisuke YAMAGUCHI edited this page Nov 1, 2016 · 47 revisions

要約

Siren::Vec は、ベクトルを扱うためのクラスです。これは Open CASCADE の gp_Vec クラスの機能をラッピングしたクラスであり、Ruby の Vector クラスとは別のものです。 Open CASCADE の gp_Vec クラスに相当するものです。

Vec の特性

  • Array を引数に取るメソッドに渡すと、暗黙の型変換により配列として扱われます。

特異メソッド


コンストラクタ

new(x, y, z) -> Vec
new([x, y, z] = [0, 0, 0]) -> Vec

Vec オブジェクトを作成します。 引数を省略すると、 要素 [0, 0, 0] を持つベクトルが作成されます。

例)

vec1 = Siren::Vec.new [1, 2, 3]
  # => #<Vec:0x2c01f00 @x=1.000000, @y=2.000000, @z=3.000000>
vec2 = Siren::Vec.new
  # => #<Vec:0x2c01eb8 @x=0.000000, @y=0.000000, @z=0.000000>
vec3 = Siren::Vec.new 1.1, 2.5, 3.14
  # => #<Vec:0x0000000 @x=1.100000, @y=2.500000, @z=3.140000>

零ベクトルを生成する

zero -> Vec

大きさが 0 で方向を持たない、要素 [0, 0, 0] のベクトルを生成して返します。

例)

vec1 = Siren::Vec.zero
  # => #<Vec:0x2c01e58 @x=0.000000, @y=0.000000, @z=0.000000>

方向毎の単位ベクトルを生成する

x -> Vec
y -> Vec
z -> Vec
xdir -> Vec
ydir -> Vec
zdir -> Vec

それぞれ、要素 [1, 0, 0], [0, 1, 0], [0, 0, 1] を持つベクトルを生成して返します。

例)

vec1 =  Siren::Vec.x
  # => #<Vec:0x2c01df8 @x=1.000000, @y=0.000000, @z=0.000000>
vec2 = Siren::Vec.zdir
  # => #<Vec:0x2c01d98 @x=0.000000, @y=0.000000, @z=1.000000>

その他のベクトルを生成する

xy -> Vec
xz -> Vec
yx -> Vec
yz -> Vec
zx -> Vec
zy -> Vec
xyz -> Vec

それぞれ、要素 [1, 1, 0], [1, 0, 1], [1, 1, 0], [0, 1, 1], [1, 0, 1], [0, 1, 1], [1, 1, 1] を持つベクトルを生成して返します。これらを単位ベクトルにするには、Siren::Vec.normal を用います。

例)

vec1 = Siren::Vec.xyz
  # => #<Vec:0x2c01f60 @x=1.000000, @y=1.000000, @z=1.000000>
uvec = Siren::Vec.xyz.normal
  # => #<Vec:0x2c020b0 @x=0.577350, @y=0.577350, @z=0.577350>

インスタンスメソッド

  • self == other -> bool

    • ベクトル同士を比較し、同一であれば真を返します。トレランスを用いたより柔軟な比較は Vec.equal? メソッドを用います。
  • self + other -> Vec

    • ベクトル同士の和を返します。
  • self - other -> Vec

    • ベクトル同士の差を返します。
  • -self -> Vec

    • 逆ベクトルを返します。
  • self * float -> Vec

    • ベクトルの各要素をスカラー倍したものを返します。
  • self / float -> Vec

    • ベクトルの各要素をスカラー値で割ったものを返します。
  • inspect -> String, to_s -> String

    • Vec オブジェクトが保持している要素を人間が読める文字列にして返します。
  • x -> float, x=float

    • X の値を取得、設定します。
  • y -> float, y=float

    • Y の値を取得、設定します。
  • z -> float, z=float

    • Z の値を取得、設定します。
  • to_a -> nil, to_ary -> nil, xyz -> nil

    • ベクトルを X, Y, Z の要素を並べた Array オブジェクトにして返します。
  • equal?(Vec, liner_tol, anguler_tol) -> bool

    • 与えられたベクトルとトレランスを用い比較し、同一であれば真を返します。
  • normal?(Vec, anguler_tol) -> bool

    • 与えられたベクトルがこのベクトルの単位ベクトルであれば真を返します。
  • normal -> Vec

    • 正規化したベクトルを返します。
  • normal! -> self

    • ベクトルを正規化します。破壊的メソッドです。
  • parallel?(Vec, angular_tol) -> bool

    • 与えられたベクトルがこのベクトルと平行であれば真を返します。
  • reverse?(Vec, anguler_tol) -> bool

    • 与えられたベクトルがこのベクトルと反対向きであれば真を返します。
  • reverse -> Vec

    • 逆ベクトルを返します。
  • reverse! -> self

    • 反転します。破壊的メソッドです。
  • angle(Vec) -> float

    • 与えられたベクトルへの角度をラジアンで返します。戻り値の範囲は 0 ~ PI です。
  • angleref(Vec, VRef) -> float

    • angle は単純に2つのベクトルの外積方向を法線とする平面上における角度です。 angleref は VRef で指定した方向から見た場合の2ベクトルの角度です。戻り値の範囲は -PI ~ PI です。
  • magnitude -> nil, size -> nil, length -> nil

    • ベクトルの大きさを返します。
  • cross(Vec) -> Vec

    • 与えられたベクトルとの外積(クロス積)ベクトルを取得します。
  • cross!(Vec) -> self

    • このベクトルを与えられたベクトルとの外積(クロス積)ベクトルにします。
  • dot(Vec) -> float

    • 与えられたベクトルとの内積を取得します。
  • dot_cross(Vec1, Vec2) -> float

  • cross_cross(Vec1, Vec2) -> Vec

  • cross_cross!(Vec1, Vec2) -> self

  • cross_mag -> float

  • cross_square_mag -> float

  • square_mag -> float

  • mirror(Vec) -> Vec

    • 与えられたベクトルを軸にし、このベクトルを線対称移動させたベクトルを返します。
  • mirror!(Vec) -> self

    • 与えられたベクトルを軸にし、このベクトルを線対称移動させます。破壊的メソッドです。
  • rotate(Vec, angle) -> Vec

    • 与えられたベクトルを回転軸とし、angle 分回転させたベクトルを返します。
  • rotate!(Vec, angle) -> self

    • 与えられたベクトルを回転軸とし、angle 分回転させます。破壊的メソッドです。
  • scale(factor) -> Vec

    • 与えられた倍数で拡縮を行なったベクトルを返します。
  • scale!(factor) -> self

    • 与えられた倍数で拡縮を行います。破壊的メソッドです。
  • transform(Trans) -> Vec

    • 与えられた Trans オブジェクトの行列情報を用いて回転・反転・拡縮を行なったベクトルを返します。
  • transform!(Trans) -> self

    • 与えられた Trans オブジェクトの行列情報を用いて回転・反転・拡縮を行います。破壊的メソッドです。

備考

  • ベクトルは「位置」を持たないため、トランスフォーメーション系メソッドに translate メソッドは存在しません。また、それ以外のトランフォーメーション系メソッドでも、Shape オブジェクトのように位置を指定する引数はありません。

Clone this wiki locally