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 は回転する角度で、原点から軸の伸びる方向に対して右ねじ方向を正とする。