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