lib/vector3.rb in gmath3D-0.1.1 vs lib/vector3.rb in gmath3D-0.2.0

- old
+ new

@@ -1,93 +1,173 @@ require 'gmath3D' module GMath3D + # + # Vector3 represents a point or a vector on 3D space. + # class Vector3 < Geom public attr_accessor :x attr_accessor :y attr_accessor :z + # [Input] + # _x_, _y_, _z_ should be Numeric. + # [Output] + # return new instance as Vector3. def initialize(x=0.0,y=0.0,z=0.0) + Util.check_arg_type(Numeric, x) + Util.check_arg_type(Numeric, y) + Util.check_arg_type(Numeric, z) super() @x = x @y = y @z = z end + + def to_element_s + "[#{@x}, #{@y}, #{@z}]" + end + + def to_s + "Vector3" + to_element_s + end + + # [Input] + # _rhs_ should be Vector3. + # [Output] + # return true if rhs equals myself. def ==(rhs) equals_inner(rhs) end + + # [Input] + # _rhs_ should be Vector3. + # [Output] + # return added result as Vector3. def +(rhs) add(rhs) end + + # [Input] + # _rhs_ should be Vector3. + # [Output] + # return subtracted result as Vector3. def -(rhs) subtract(rhs) end + + # [Input] + # _rsh_ should be Numeric. + # [Output] + # return multiplyed result as Vector3. def *(rhs) multiply(rhs) end + + # [Input] + # _rhs_ should be Numeric. + # [Output] + # return divided result as Vector3. def /(rhs) divide(rhs) end + # [Input] + # _rhs_ should be Vector3. + # [Output] + # return inner product as Numeric def dot(rhs) Util.check_arg_type(Vector3, rhs) self.x*rhs.x + self.y*rhs.y + self.z*rhs.z end + + # [Input] + # _rhs_ should be Vector3. + # [Output] + # return cross product as Vector3. def cross(rhs) Util.check_arg_type(Vector3, rhs) Vector3.new( self.y*rhs.z - self.z*rhs.y, self.z*rhs.x - self.x*rhs.z, self.x*rhs.y - self.y*rhs.x) end + # [Output] + # return vector length as Numeric def length Math::sqrt(self.x*self.x + self.y*self.y + self.z*self.z) end + + # [Input] + # _rhs_ should be Vector3. + # [Output] + # return distance between two points as Numeric. def distance(rhs) Util.check_arg_type(Vector3, rhs) Math::sqrt((self.x - rhs.x)*(self.x - rhs.x) + (self.y - rhs.y)*(self.y - rhs.y) + (self.z - rhs.z)*(self.z - rhs.z)) end - def distance(rhs) - Util.check_arg_type(Vector3, rhs) - Math::sqrt((self.x - rhs.x)*(self.x - rhs.x) + (self.y - rhs.y)*(self.y - rhs.y) + (self.z - rhs.z)*(self.z - rhs.z)) - end + # [Input] + # _rhs_ should be Vector3. + # [Output] + # return two vectors angle as Numeric (rad). def angle(rhs) Util.check_arg_type(Vector3, rhs) vec1Length = self.length ; vec2Length = rhs.length ; return 0.0 if(vec1Length*vec2Length < self.tolerance ) v = self.dot(rhs)/(vec1Length*vec2Length) Math::acos( v ) end + + # [Output] + # return normalized vector as Vector3 def normalize() self / self.length.to_f end + # [Input] + # _rhs_ should be Vector3 + # [Output] + # return true if myself and rhs is parallel as boolean def parallel?(rhs) Util.check_arg_type(Vector3, rhs) return false if(self.length < self.tolerance or rhs.length < rhs.tolerance) return false if(self.cross(rhs).length > self.tolerance) return true end + + # [Input] + # _rhs_ should be Vector3. + # [Output] + # return true if myself and rhs have same direction as boolean. def same_direction?(rhs) Util.check_arg_type(Vector3, rhs) return false if(!parallel?(rhs)) return false if(self.dot(rhs) < self.tolerance) return true end + # This function projects self vector to rhs vector. + # [Input] + # _rhs_ should be Vector3. + # [Output] + # return projected result as Vector3. def project_to(rhs) Util.check_arg_type(Vector3, rhs) return Vector3.new, 0.0 if( rhs.length < rhs.tolerance ) parameter = self.dot( rhs ) / ( rhs.x * rhs.x + rhs.y * rhs.y + rhs.z * rhs.z ).to_f return rhs*parameter, parameter end + + # [Output] + # return column vector as Matrix def to_column_vector return Matrix.column_vector([x,y,z]) end + private def equals_inner(rhs) return false if( !rhs.kind_of?(Vector3) ) return false if((self.x - rhs.x).abs > @tolerance) return false if((self.y - rhs.y).abs > @tolerance)