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
ofFiniteLine
.
# 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
asVector3
.
# 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
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