class GMath3D::Rectangle

Rectangle represents a four edged finite plane on 3D space.

Attributes

base_point[RW]
u_vector[RW]
v_vector[RW]

Public Class Methods

new(base_point_arg = Vector3.new(), u_vector_arg = Vector3.new(1,0,0), v_vector_arg = Vector3.new(0,1,0)) click to toggle source
Input

base_point , u_vector, v_vector should be Vector3.

u_vector and v_vector should be orthogonalized.

Output

return new instance of Rectangle.

Calls superclass method GMath3D::Geom::new
# File lib/rectangle.rb, line 22
def initialize(base_point_arg = Vector3.new(), u_vector_arg = Vector3.new(1,0,0), v_vector_arg = Vector3.new(0,1,0))
  Util3D.check_arg_type(::Vector3, base_point_arg)
  Util3D.check_arg_type(::Vector3, u_vector_arg)
  Util3D.check_arg_type(::Vector3, v_vector_arg)
  super()
  self.base_point = base_point_arg
  self.u_vector = u_vector_arg
  self.v_vector = v_vector_arg
end

Public Instance Methods

==(rhs) click to toggle source
Input

rhs is Rectangle.

Output

return true if rhs equals myself.

# File lib/rectangle.rb, line 42
def ==(rhs)
  return false if rhs == nil
  return false if( !rhs.kind_of?(Rectangle) )
  return false if( self.base_point != rhs.base_point)
  return false if( self.u_vector != rhs.u_vector)
  return false if( self.v_vector != rhs.v_vector)
  return true
end
area() click to toggle source
Output

return rectangle area as Numeric.

# File lib/rectangle.rb, line 107
def area
  return (u_vector.cross(v_vector)).length
end
center_point() click to toggle source
Output

return center point as Vector3.

# File lib/rectangle.rb, line 101
def center_point
  return base_point + u_vector*0.5 + v_vector*0.5
end
distance(target) click to toggle source
Input

target shold be Vector3.

Output

return “distance, point on rectangle” as [Numeric, Vector3].

# File lib/rectangle.rb, line 129
    def distance(target)
      # with Point
      if(target.kind_of?(Vector3))
        return distance_to_point(target)
      elsif(target.kind_of?(Line))
        #with Line
#        return distance_to_line(target)
      end
      Util3D.raise_argurment_error(target)
    end
edges() click to toggle source
Output

return edges of rectangle as Array of FiniteLine.

# File lib/rectangle.rb, line 67
def edges
  edge_ary = Array.new(4)
  edge_ary[0] = FiniteLine.new( base_point, base_point+u_vector)
  edge_ary[1] = FiniteLine.new( base_point+u_vector, base_point+u_vector+v_vector)
  edge_ary[2] = FiniteLine.new( base_point+u_vector+v_vector, base_point+v_vector)
  edge_ary[3] = FiniteLine.new( base_point+v_vector, base_point)
  return edge_ary
end
initialize_copy( original_obj ) click to toggle source
# File lib/rectangle.rb, line 32
def initialize_copy( original_obj )
  @base_point = original_obj.base_point.dup
  @u_vector = original_obj.u_vector.dup
  @v_vector = original_obj.v_vector.dup
end
normal() click to toggle source
Output

return normal of rectangle as Vector3.

# File lib/rectangle.rb, line 89
def normal
  return (u_vector.cross(v_vector)).normalize()
end
opposite_point() click to toggle source
Output

return point of opposite to base_point as Vector3.

# File lib/rectangle.rb, line 95
def opposite_point
  return base_point + u_vector + v_vector
end
point(u, v) click to toggle source
Input

u, v should be Numeric.

Output

return point on rectangle as Vector3.

# File lib/rectangle.rb, line 59
def point(u, v)
  Util3D.check_arg_type(::Numeric, u)
  Util3D.check_arg_type(::Numeric, v)
  return base_point + u_vector*u + v_vector*v
end
to_s() click to toggle source
# File lib/rectangle.rb, line 51
def to_s
  "Rectangle[base#{@base_point.to_element_s}, u#{@u_vector.to_element_s}, v#{@v_vector.to_element_s}"
end
uv_parameter(check_point) click to toggle source
Input

check_point shold be Vector3.

Output

return u, v parametes on check_point as [Numeric, Numeric].

# File lib/rectangle.rb, line 115
def uv_parameter(check_point)
  Util3D.check_arg_type(::Vector3, check_point)
  mat = Matrix[[u_vector.x, u_vector.y, u_vector.z],
        [v_vector.x, v_vector.y, v_vector.z],
        [normal.x, normal.y, normal.z]]
  vec = (check_point - base_point).to_column_vector
  ans = mat.t.inv*vec
  return ans[0,0], ans[1,0]
end
vertices() click to toggle source
Output

return vertices of rectangle as Array of Vector3.

# File lib/rectangle.rb, line 78
def vertices
  vertices = Array.new(4)
  vertices[0] = base_point
  vertices[1] = base_point+u_vector
  vertices[2] = base_point+u_vector+v_vector
  vertices[3] = base_point+v_vector
  return vertices
end

Private Instance Methods

distance_to_point(check_point) click to toggle source
# File lib/rectangle.rb, line 141
def distance_to_point(check_point)
  u,v = self.uv_parameter(check_point)
  if(u >= 0 && u <= 1 && v >= 0 && v <= 1)
    point_on_rect = self.point( u, v )
    distance = point_on_rect.distance(check_point)
    return distance, point_on_rect
  end
  # rectangle does not contain projected point
  # check distance to FiniteLines
  finite_lines = self.edges
  return FiniteLine.ary_distanc_to_point(finite_lines, check_point)
end