Class: GMath3D::FiniteLine

Inherits:
Geom
  • Object
show all
Includes:
BoxAvailable
Defined in:
lib/finite_line.rb

Overview

FiniteLine represents a finite line on 3D space.

Instance Attribute Summary collapse

Attributes inherited from Geom

#tolerance

Class Method Summary collapse

Instance Method Summary collapse

Methods included from BoxAvailable

#box

Methods inherited from Geom

default_tolerance

Constructor Details

#initialize(start_point = Vector3.new(0,0,0), end_point = Vector3.new(1,0,0)) ⇒ FiniteLine

Input

start_point and end_point should be Vector3.

Output

return new instance as FiniteLine



18
19
20
21
22
23
24
# File 'lib/finite_line.rb', line 18

def initialize(start_point = Vector3.new(0,0,0), end_point = Vector3.new(1,0,0))
  Util3D.check_arg_type(Vector3, start_point)
  Util3D.check_arg_type(Vector3, end_point)
  super()
  @start_point = start_point
  @end_point  = end_point
end

Instance Attribute Details

#end_pointObject

Returns the value of attribute end_point.



10
11
12
# File 'lib/finite_line.rb', line 10

def end_point
  @end_point
end

#start_pointObject

Returns the value of attribute start_point.



9
10
11
# File 'lib/finite_line.rb', line 9

def start_point
  @start_point
end

Class Method Details

.ary_distanc_to_point(finite_lines, target_point) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/finite_line.rb', line 111

def self.ary_distanc_to_point(finite_lines, target_point)
  Util3D.check_arg_type(::Array, finite_lines)
  Util3D.check_arg_type(Vector3, target_point)
  distance_ary = Array.new(0)
  points_ary   = Array.new(0)
  finite_lines.each do | item |
    distance, point = item.distance(target_point)
    distance_ary.push(distance);
    points_ary.push(point)
  end
  distance = distance_ary.min
  closest_point = points_ary[distance_ary.index(distance)]
  return distance, closest_point
end

.ary_distance_to_line(finite_lines, target_line) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/finite_line.rb', line 126

def self.ary_distance_to_line(finite_lines, target_line)
  Util3D.check_arg_type(::Array, finite_lines)
  Util3D.check_arg_type(Line, target_line)
  distance_ary = Array.new(0)
  point_on_target_ary = Array.new(0)
  point_on_finite_line_ary = Array.new(0)
  param_on_target_ary = Array.new(0)
  param_on_finite_line_ary = Array.new(0)
  finite_lines.each do | item |
    distance, point_on_myself, point_on_target, parameter_on_myself, parameter_on_tatget = item.distance(target_line)
    distance_ary.push(distance)
    point_on_target_ary.push(point_on_target)
    point_on_finite_line_ary.push(point_on_myself)
    param_on_target_ary.push(parameter_on_tatget)
    param_on_finite_line_ary.push(parameter_on_myself)
  end
  distance = distance_ary.min
  point_on_finiteline = point_on_finite_line_ary[distance_ary.index(distance)]
  point_on_target = point_on_target_ary[distance_ary.index(distance)]
  param_on_finiteline = param_on_finite_line_ary[distance_ary.index(distance)]
  param_on_target = param_on_target_ary[distance_ary.index(distance)]
  return distance, point_on_finiteline, point_on_target, param_on_finiteline, param_on_target
end

Instance Method Details

#==(rhs) ⇒ Object

Input

rhs should be FiniteLine.

Output

return true if rhs equals myself.



49
50
51
52
53
54
55
# File 'lib/finite_line.rb', line 49

def ==(rhs)
  return false if rhs == nil
  return false if !rhs.kind_of?(FiniteLine)
  return false if( self.start_point != rhs.start_point)
  return false if( self.end_point != rhs.end_point)
  return true
end

#directionObject

Output

return direction as vector from start_point to end_point as Vector3



65
66
67
# File 'lib/finite_line.rb', line 65

def direction
  @end_point - @start_point
end

#distance(target) ⇒ Object

This function returns closest distance between FiniteLine and anothor element.

Input

target should be Vector3 or Line or FiniteLine

Output
in case target is Vector3

return “distance, closest point on myself, parameter on myself” as [Numeric, Vector3, Numeric]

in case target is Line or FiniteLine

return “distance, point on myself, point on target, parameter on myself, parameter on tatget” as [Numeric, Vector3, Vector3, Numeric, Numeric]



97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/finite_line.rb', line 97

def distance(target)
  # with Point
  if(target.kind_of?(Vector3))
    return distance_to_point(target)
    #with Line
  elsif(target.kind_of?(Line))
    return distance_to_line(target)
  #widh Finite Line
  elsif(target.kind_of?(FiniteLine))
    return distance_to_finite_line(target)
  end
  Util3D.raise_argurment_error(target)
end

#initialize_copy(original_obj) ⇒ Object



26
27
28
29
# File 'lib/finite_line.rb', line 26

def initialize_copy( original_obj )
  @start_point = original_obj.start_point.dup
  @end_point = original_obj.end_point.dup
end

#lengthObject

Output

return length as Numeric



83
84
85
# File 'lib/finite_line.rb', line 83

def length
  @start_point.distance(@end_point)
end

#point(parameter) ⇒ Object

Input

parameter should be Numeric.

Output

return a point on line at input parameter position as Vector3



73
74
75
76
77
78
79
# File 'lib/finite_line.rb', line 73

def point(parameter)
  if(parameter < 0.0 or 1.0 < parameter)
    return nil
  else
    return @start_point * (1.0 - parameter) + @end_point * parameter
  end
end

#rotate(mat) ⇒ Object

Input

mat should be Matrix which row and col size are 3.

Output

return rotated FiniteLine.



39
40
41
42
43
# File 'lib/finite_line.rb', line 39

def rotate(mat)
  rot_start_point = mat*start_point
  rot_end_point = mat*end_point
  return FiniteLine.new(rot_start_point, rot_end_point)
end

#to_sObject



31
32
33
# File 'lib/finite_line.rb', line 31

def to_s
  "FiniteLine[from#{start_point.to_element_s}, to#{end_point.to_element_s}]"
end

#verticesObject

Output

return Array of start_point and end_point.



59
60
61
# File 'lib/finite_line.rb', line 59

def vertices
  return [start_point, end_point]
end