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

- old
+ new

@@ -1,52 +1,45 @@ #! /usr/bin/ruby -# written by Ippei KISHIDA -# -require "matrix" -require "mageo/polar2d.rb" -require "mageo/polar3d.rb" -require "mageo/axes.rb" -require "mageo/vector.rb" require "rubygems" gem "malge" require "malge.rb" #require "malge/simultaneousequations.rb" #require "simultaneousequations.rb" # Open class to add "to_v3d" method. class Array - # Convert Array to Vector3D + # Convert Array to Mageo::Vector3D def to_v3d - Vector3D[*self] - #要素数チェックは Vector3D.[] 側でやっている。 + Mageo::Vector3D[*self] + #要素数チェックは Mageo::Vector3D.[] 側でやっている。 end end class Vector - # Return a new instance converted to Vector3D class. + # Return a new instance converted to Mageo::Vector3D class. def to_v3d - Vector3D[*self] - #要素数チェックは Vector3D.[] 側でやっている。 + Mageo::Vector3D[*self] + #要素数チェックは Mageo::Vector3D.[] 側でやっている。 end end # 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/Vector3DInternal.rb . +# If you want to be in an internal coordinate, you can use Math/Mageo::Vector3DInternal.rb . # # Memo: -# Vector3DInternal との対比として、Vector3DCartesian という名前にすることも考えたが、 +# Mageo::Vector3DInternal との対比として、Vector3DCartesian という名前にすることも考えたが、 # 長くなるし、普通直交座標で考えるよね、と。 # # インスタンス生成の時点で要素数をチェックし、要素の追加削除を禁止しているので # 要素数は常に3であることが保証されている。 # -class Vector3D < Vector +class Mageo::Vector3D < Vector class TypeError < Exception; end class ZeroOperation < Exception; end class RangeError < Exception; end @@ -58,11 +51,11 @@ end # Get the exterior product. def self.exterior_product(vec0, vec1) [vec0, vec1].each_with_index do |vec, index| - unless (vec.class == Vector3D) + unless (vec.class == Mageo::Vector3D) raise TypeError, "Vector #{index}, #{vec.inspect}." end end bX = vec1[0]; @@ -81,30 +74,30 @@ end # Get the scalar triple product. def self.scalar_triple_product(vec0, vec1, vec2) [vec0, vec1, vec2].each_with_index do |vec, index| - raise TypeError, "#{index}th vector: #{vec.inspect}" unless (vec.class == Vector3D) + raise TypeError, "#{index}th vector: #{vec.inspect}" unless (vec.class == Mageo::Vector3D) end vec0.inner_product(vec1.exterior_product(vec2)) end # Get the angle with radian between self and other vectors. def self.angle_radian(vec0, vec1) [vec0, vec1].each_with_index do |vec, index| - raise TypeError, "#{index}th vector: #{vec.inspect}" unless (vec.class == Vector3D) + raise TypeError, "#{index}th vector: #{vec.inspect}" unless (vec.class == Mageo::Vector3D) raise ZeroOperation, "#{index}th vector: #{vec.inspect}" if (vec.r == 0.0) end Math::acos(vec0.inner_product(vec1) / (vec0.r * vec1.r)) end # Get the angle with degree between self and other vectors. def self.angle_degree(vec0, vec1) [vec0, vec1].each_with_index do |vec, index| - raise TypeError, "#{index}th vector: #{vec.inspect}" unless (vec.class == Vector3D) + raise TypeError, "#{index}th vector: #{vec.inspect}" unless (vec.class == Mageo::Vector3D) raise ZeroOperation, "#{index}th vector: #{vec.inspect}" if (vec.r == 0.0) end self.angle_radian(vec0, vec1) * (180.0 / Math::PI) end @@ -121,57 +114,57 @@ super index, val end # ベクトルが等しいかチェック。 - # other として Vector3D クラス以外のインスタンス渡すと Vector3D::TypeError。 + # other として Mageo::Vector3D クラス以外のインスタンス渡すと Vector3D::TypeError。 # 両者の差分ベクトルの長さが tolerance 以下という判定になる。 def equal_in_delta?(other, tolerance = 0.0) - raise TypeError if (other.class != Vector3D) + raise TypeError if (other.class != Mageo::Vector3D) return (other - self).r <= tolerance end # Vectorクラスで用意されているメソッドは Vectorクラスインスタンスを返すようになっているので、 - # Vector3D クラスインスタンスを返すようにした + メソッド。 + # Mageo::Vector3D クラスインスタンスを返すようにした + メソッド。 def +(vec) - unless (vec.class == Vector3D) + unless (vec.class == Mageo::Vector3D) raise TypeError, "#{vec.inspect}." end super(vec).to_v3d end # Vectorクラスで用意されているメソッドは Vectorクラスインスタンスを返すようになっているので、 - # Vector3D クラスインスタンスを返すようにした - メソッド。 + # Mageo::Vector3D クラスインスタンスを返すようにした - メソッド。 def -(vec) - unless (vec.class == Vector3D) + unless (vec.class == Mageo::Vector3D) raise TypeError, "#{vec.inspect}." end super(vec).to_v3d end # Vectorクラスで用意されているメソッドは Vectorクラスインスタンスを返すようになっているので、 - # Vector3D クラスインスタンスを返すようにした * メソッド。 + # Mageo::Vector3D クラスインスタンスを返すようにした * メソッド。 # Argument 'val' must have :to_f method. def *(val) #raise TypeError if (val.class != Float) raise TypeError unless val.methods.include?(:to_f) super(val.to_f).to_v3d end # Vectorクラスで用意されているメソッドは Vectorクラスインスタンスを返すようになっているので、 - # Vector3D クラスインスタンスを返すようにした clone メソッド。 + # Mageo::Vector3D クラスインスタンスを返すようにした clone メソッド。 def clone super().to_v3d end - # Convert to Vector3DInternal. Non-destructive. + # Convert to Mageo::Vector3DInternal. Non-destructive. def to_v3di(axes) - #pp axes.is_a?(Axes) - raise TypeError unless axes.is_a?(Axes) + #pp axes.is_a?(Mageo::Axes) + raise TypeError unless axes.is_a?(Mageo::Axes) axes = axes.to_a - Vector3DInternal[ *(Malge::SimultaneousEquations.cramer(axes.transpose, self)) ] + Mageo::Vector3DInternal[ *(Malge::SimultaneousEquations.cramer(axes.transpose, self)) ] end #Return size, always 3. def size return 3 @@ -194,20 +187,20 @@ def angle_degree(vec) self.class.angle_degree(self, vec) end - #3次元極座標への変換した Polar3D インスタンスを返す。 + #3次元極座標への変換した Mageo::Polar3D インスタンスを返す。 def to_p3d r = self.r if r == 0.0 theta = 0.0 phi = 0.0 else - theta = Polar2D.minimum_radian(Math::acos(self[2] / r)) + theta = Mageo::Polar2D.minimum_radian(Math::acos(self[2] / r)) phi = Vector[ self[0], self[1] ].to_p2d.theta end - Polar3D.new(r, theta, phi) + Mageo::Polar3D.new(r, theta, phi) end #x, y, z 軸のいずれかで self を回転する。破壊的。 #axis は 0, 1, 2 のいずれかで、それぞれ x, y, z軸を示す。 #radian は回転する角度で、原点から軸の伸びる方向に対して右ねじ方向を正とする。