lib/mageo/vector3d.rb in mageo-0.0.2 vs lib/mageo/vector3d.rb in mageo-0.0.3

- old
+ new

@@ -1,12 +1,9 @@ #! /usr/bin/ruby require "rubygems" -gem "malge" -require "malge.rb" -#require "malge/simultaneousequations.rb" -#require "simultaneousequations.rb" +require "malge" # Open class to add "to_v3d" method. class Array # Convert Array to Mageo::Vector3D def to_v3d @@ -27,18 +24,17 @@ # Vector class specialized for vectors in a three-dimensional Cartesian space. # This class provide exterior_product method and others, which is not included # in native Vector class. # This class is constructed under the assumption in the Cartesian coordinate. # If you want to be in an internal coordinate, you can use Math/Mageo::Vector3DInternal.rb . -# +# # Memo: # Mageo::Vector3DInternal との対比として、Vector3DCartesian という名前にすることも考えたが、 # 長くなるし、普通直交座標で考えるよね、と。 -# +# # インスタンス生成の時点で要素数をチェックし、要素の追加削除を禁止しているので # 要素数は常に3であることが保証されている。 -# class Mageo::Vector3D < Vector class TypeError < Exception; end class ZeroOperation < Exception; end class RangeError < Exception; end @@ -47,11 +43,11 @@ def self.[](*args) raise RangeError, "#{args}" unless args.size == 3 super(*args) end - + # Get the exterior product. def self.exterior_product(vec0, vec1) [vec0, vec1].each_with_index do |vec, index| unless (vec.class == Mageo::Vector3D) raise TypeError, "Vector #{index}, #{vec.inspect}." @@ -106,17 +102,16 @@ def [](index) raise RangeError, "index: #{index}." if (index < 0 || 2 < index) super index end - + def []=(index, val) raise RangeError, "index: #{index}." if (index < 0 || 2 < index) super index, val end - - + # ベクトルが等しいかチェック。 # other として Mageo::Vector3D クラス以外のインスタンス渡すと Vector3D::TypeError。 # 両者の差分ベクトルの長さが tolerance 以下という判定になる。 def equal_in_delta?(other, tolerance = 0.0) raise TypeError if (other.class != Mageo::Vector3D) @@ -155,15 +150,21 @@ def clone super().to_v3d end # Convert to Mageo::Vector3DInternal. Non-destructive. - def to_v3di(axes) - #pp axes.is_a?(Mageo::Axes) + def internal_coordinates(axes) raise TypeError unless axes.is_a?(Mageo::Axes) axes = axes.to_a Mageo::Vector3DInternal[ *(Malge::SimultaneousEquations.cramer(axes.transpose, self)) ] + end + + # Change the self.class to Vector3DInternal, + # Keeping the values of coordinates. + def to_v3di + axes = Mageo::Axes.new( [ [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0] ]) + internal_coordinates(axes) end #Return size, always 3. def size return 3