lib/triangle.rb in gmath3D-0.2.3 vs lib/triangle.rb in gmath3D-0.2.4
- old
+ new
@@ -13,13 +13,13 @@
# [Input]
# _vertex1_, _vertex2_, _vertex3_ should be Vector3.
# [Output]
# return new instance of Triangle.
def initialize(vertex1 = Vector3.new(), vertex2 = Vector3.new(1,0,0), vertex3 = Vector3.new(0,1,0))
- Util.check_arg_type(::Vector3, vertex1)
- Util.check_arg_type(::Vector3, vertex2)
- Util.check_arg_type(::Vector3, vertex3)
+ Util3D.check_arg_type(::Vector3, vertex1)
+ Util3D.check_arg_type(::Vector3, vertex2)
+ Util3D.check_arg_type(::Vector3, vertex3)
super()
@vertices = Array.new([vertex1, vertex2, vertex3])
end
def initialize_copy( original_obj )
@@ -50,11 +50,11 @@
# [Input]
# _parameter_ should be three element Array of Numeric.
# [Output]
# return point on triangle at parameter position as Vector3.
def point( parameter )
- Util.check_arg_type(::Array, parameter )
+ Util3D.check_arg_type(::Array, parameter )
# TODO Argument check
return self.vertices[0]*parameter[0] + self.vertices[1]*parameter[1] + self.vertices[2]*parameter[2]
end
# [Output]
@@ -88,22 +88,36 @@
vec1 = self.vertices[1] - self.vertices[0]
vec2 = self.vertices[2] - self.vertices[0]
return (vec1.cross(vec2).normalize)
end
+ # [Input]
+ # _vertex_index_ should be 0..2.
# [Output]
+ # return angle as Numeric(radian).
+ def angle( vertex_index )
+ return nil if(vertex_index < 0 || vertex_index > 2)
+ vert1 = self.vertices[vertex_index]
+ vert2 = self.vertices[(vertex_index+1)%3]
+ vert3 = self.vertices[(vertex_index+2)%3]
+ vec1 = vert2 - vert1
+ vec2 = vert3 - vert1
+ vec1.angle(vec2)
+ end
+
+ # [Output]
# return normal vector reversed triangle
- def reverse()
+ def reverse
return Triangle.new(@vertices[0], @vertices[2], @vertices[1])
end
# [Input]
# _check_point_ should be Vector3.
# [Output]
# return barycentric_coordinate on check_point as three element Array of Numeric.
def barycentric_coordinate( check_point )
- Util.check_arg_type(::Vector3, check_point)
+ Util3D.check_arg_type(::Vector3, check_point)
v0 = @vertices[0]
v1 = @vertices[1]
v2 = @vertices[2]
@@ -169,18 +183,18 @@
return distance_to_line(target)
elsif(target.kind_of?(Plane))
#with Plane
return distance_to_plane(target)
end
- Util.raise_argurment_error(target)
+ Util3D.raise_argurment_error(target)
end
# [Input]
# _check_point_ shold be Vector3.
# [Output]
# return true if triangle contains _check_point_.
def contains?( check_point )
- Util.check_arg_type(Vector3, check_point )
+ Util3D.check_arg_type(Vector3, check_point )
plane = Plane.new( vertices[0], self.normal)
distance, projected_point = plane.distance(check_point)
return false if( distance > self.tolerance )
g_coord = self.barycentric_coordinate(check_point)
g_coord.each do |item|