gmath3D 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem "bundler", "~> 1.0.0"
10
+ gem "jeweler", "~> 1.6.4"
11
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,16 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ git (1.2.5)
5
+ jeweler (1.6.4)
6
+ bundler (~> 1.0)
7
+ git (>= 1.2.5)
8
+ rake
9
+ rake (0.9.2)
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ bundler (~> 1.0.0)
16
+ jeweler (~> 1.6.4)
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Toshiyasu Shimizu
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,19 @@
1
+ = gmath3D
2
+
3
+ This library defines 3D geometric elements(point, line, plane etc..). It can get two(or more) elements relation, like distance between two elements.
4
+
5
+ == Class list in gmath3D
6
+ * Vector3 class signifies point and vector in 3D.
7
+ * Line class signifies inifinite line in 3D.
8
+ * FiniteLine class signifies finite line in 3D.
9
+ * Plane class signifies inifinite plane in 3D.
10
+ * Rectangle class signifies finite plane that has 4 edges in 3.
11
+ * Triangle class signifies finite plane that has 3 edges in 3.
12
+ * Box class signifies axially aligned box.
13
+ * Geom class is parent class of all 3D elements.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2011 Toshiyasu Shimizu. See LICENSE.txt for
18
+ further details.
19
+
data/Rakefile ADDED
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "gmath3D"
18
+ gem.homepage = "http://github.com/toshi0328/gmath3D"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Geometric elements in 3D}
21
+ gem.description = %Q{This library defines 3D geometric elements(point, line, plane etc..). It can get two(or more) elements relation, like distance between two elements.}
22
+ gem.email = "toshi0328@gmail.com"
23
+ gem.authors = ["Toshiyasu Shimizu"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ task :default => :test
36
+
37
+ require 'rake/rdoctask'
38
+ Rake::RDocTask.new do |rdoc|
39
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
40
+
41
+ rdoc.rdoc_dir = 'rdoc'
42
+ rdoc.title = "gmath3D #{version}"
43
+ rdoc.rdoc_files.include('README*')
44
+ rdoc.rdoc_files.include('lib/**/*.rb')
45
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
data/gmath3D.gemspec ADDED
@@ -0,0 +1,71 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{gmath3D}
8
+ s.version = "0.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Toshiyasu Shimizu"]
12
+ s.date = %q{2011-09-24}
13
+ s.description = %q{This library defines 3D geometric elements(point, line, plane etc..). It can get two(or more) elements relation, like distance between two elements.}
14
+ s.email = %q{toshi0328@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE.txt",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "gmath3D.gemspec",
28
+ "lib/box.rb",
29
+ "lib/finite_line.rb",
30
+ "lib/geom.rb",
31
+ "lib/gmath3D.rb",
32
+ "lib/line.rb",
33
+ "lib/plane.rb",
34
+ "lib/rectangle.rb",
35
+ "lib/triangle.rb",
36
+ "lib/util.rb",
37
+ "lib/vector3.rb",
38
+ "test/helper.rb",
39
+ "test/test_box.rb",
40
+ "test/test_finite_line.rb",
41
+ "test/test_geom.rb",
42
+ "test/test_gmath3D.rb",
43
+ "test/test_line.rb",
44
+ "test/test_plane.rb",
45
+ "test/test_rectangle.rb",
46
+ "test/test_triangle.rb",
47
+ "test/test_util.rb",
48
+ "test/test_vector3.rb"
49
+ ]
50
+ s.homepage = %q{http://github.com/toshi0328/gmath3D}
51
+ s.licenses = ["MIT"]
52
+ s.require_paths = ["lib"]
53
+ s.rubygems_version = %q{1.6.2}
54
+ s.summary = %q{Geometric elements in 3D}
55
+
56
+ if s.respond_to? :specification_version then
57
+ s.specification_version = 3
58
+
59
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
60
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
61
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
62
+ else
63
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
64
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
65
+ end
66
+ else
67
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
68
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
69
+ end
70
+ end
71
+
data/lib/box.rb ADDED
@@ -0,0 +1,74 @@
1
+ require 'gmath3D'
2
+
3
+ module GMath3D
4
+ class Box < Geom
5
+ public
6
+ attr_accessor :min_point
7
+ attr_accessor :max_point
8
+
9
+ def initialize(point1 = Vector3.new(0,0,0), point2 = Vector3.new(1,1,1))
10
+ Util.check_arg_type(Vector3, point1)
11
+ Util.check_arg_type(Vector3, point2)
12
+ super()
13
+ @min_point = Vector3.new();
14
+ @max_point = Vector3.new();
15
+ @min_point.x = [ point1.x, point2.x ].min
16
+ @min_point.y = [ point1.y, point2.y ].min
17
+ @min_point.z = [ point1.z, point2.z ].min
18
+ @max_point.x = [ point1.x, point2.x ].max
19
+ @max_point.y = [ point1.y, point2.y ].max
20
+ @max_point.z = [ point1.z, point2.z ].max
21
+ end
22
+
23
+ def ==(rhs)
24
+ equals_inner(rhs)
25
+ end
26
+ def +(rhs)
27
+ add(rhs)
28
+ end
29
+
30
+ def center
31
+ return (@min_point + @max_point) * 0.5
32
+ end
33
+
34
+ def length
35
+ return max_point.x - min_point.x, max_point.y - min_point.y, max_point.z - min_point.z
36
+ end
37
+
38
+ def volume
39
+ width, height, depth = self.length
40
+ return width*height*depth
41
+ end
42
+
43
+ private
44
+ def equals_inner(rhs)
45
+ return false if( !rhs.kind_of?(Box) )
46
+ return false if(self.min_point != rhs.min_point)
47
+ return false if(self.max_point != rhs.max_point)
48
+ true
49
+ end
50
+ def add(rhs)
51
+ if( rhs.kind_of?(Vector3))
52
+ added_box = Box.new()
53
+ added_box.min_point.x = [ self.min_point.x, rhs.x ].min
54
+ added_box.min_point.y = [ self.min_point.y, rhs.y ].min
55
+ added_box.min_point.z = [ self.min_point.z, rhs.z ].min
56
+ added_box.max_point.x = [ self.max_point.x, rhs.x ].max
57
+ added_box.max_point.y = [ self.max_point.y, rhs.y ].max
58
+ added_box.max_point.z = [ self.max_point.z, rhs.z ].max
59
+ return added_box
60
+ elsif( rhs.kind_of?(Box))
61
+ min_max_point_ary = [rhs.min_point, rhs.max_point]
62
+ return self + min_max_point_ary
63
+ elsif(rhs.kind_of?(Array))
64
+ added_box = self;
65
+ rhs.each do |item|
66
+ added_box = added_box + item
67
+ end
68
+ return added_box
69
+ end
70
+ Util.raise_argurment_error(rhs)
71
+ end
72
+ end
73
+ end
74
+
@@ -0,0 +1,157 @@
1
+ require 'gmath3D'
2
+
3
+ module GMath3D
4
+ class FiniteLine < Geom
5
+ public
6
+ attr_accessor :start_point
7
+ attr_accessor :end_point
8
+
9
+ def initialize(start_point_arg = Vector3.new(0.0,0.0,0.0), end_point_arg = Vector3.new(1.0,0.0,0.0))
10
+ Util.check_arg_type(Vector3, start_point_arg)
11
+ Util.check_arg_type(Vector3, end_point_arg)
12
+ super()
13
+ @start_point = start_point_arg
14
+ @end_point = end_point_arg
15
+ end
16
+
17
+ def direction
18
+ @end_point - @start_point
19
+ end
20
+
21
+ def point(parameter)
22
+ if(parameter < 0.0 or 1.0 < parameter)
23
+ return nil
24
+ else
25
+ return @start_point * (1.0 - parameter) + @end_point * parameter
26
+ end
27
+ end
28
+
29
+ def length
30
+ @start_point.distance(@end_point)
31
+ end
32
+
33
+ def distance(target)
34
+ # with Point
35
+ if(target.kind_of?(Vector3))
36
+ return distance_to_point(target)
37
+ #with Line
38
+ elsif(target.kind_of?(Line))
39
+ return distance_to_line(target)
40
+ #widh Finite Line
41
+ elsif(target.kind_of?(FiniteLine))
42
+ return distance_to_finite_line(target)
43
+ end
44
+ Util.raise_argurment_error(target)
45
+ end
46
+
47
+ def self.ary_distanc_to_point(finite_lines, target_point)
48
+ Util.check_arg_type(::Array, finite_lines)
49
+ Util.check_arg_type(Vector3, target_point)
50
+ distance_ary = Array.new(0)
51
+ points_ary = Array.new(0)
52
+ finite_lines.each do | item |
53
+ distance, point = item.distance(target_point)
54
+ distance_ary.push(distance);
55
+ points_ary.push(point)
56
+ end
57
+ distance = distance_ary.min
58
+ closest_point = points_ary[distance_ary.index(distance)]
59
+ return distance, closest_point
60
+ end
61
+
62
+ private
63
+ def distance_to_point(target)
64
+ # get distance using infinite line
65
+ infinite_line = Line.new(self.start_point, self.direction)
66
+ distance, closest_point, parameter = infinite_line.distance(target)
67
+ if(0.0 <= parameter and parameter <= 1.0)
68
+ return distance, closest_point, parameter
69
+ end
70
+
71
+ distance_to_start_point = @start_point.distance(target)
72
+ distance_to_end_point = @end_point.distance(target)
73
+ if(distance_to_start_point < distance_to_end_point)
74
+ distance = distance_to_start_point
75
+ closest_point = @start_point
76
+ parameter = 0.0
77
+ else
78
+ distance = distance_to_end_point
79
+ closest_point = @end_point
80
+ parameter = 1.0
81
+ end
82
+ return distance, closest_point, parameter
83
+ end
84
+
85
+ def distance_to_line(target_infinite_line)
86
+ self_infinite_line = Line.new(self.start_point, self.direction)
87
+ distance, point1, point2, parameter1, parameter2 = self_infinite_line.distance(target_infinite_line)
88
+ #parallel
89
+ return distance, nil, nil, nil, nil if( point1 == nil and point2 == nil)
90
+ #parameter is in range
91
+ return distance, point1, point2, parameter1, parameter2 if(0 < parameter1 and parameter1 < 1)
92
+ distance_to_start_point, closest_point_to_start_point, parameter_to_start_point =
93
+ target_infinite_line.distance(self.start_point)
94
+ distance_to_end_point, closest_point_to_end_point, parameter_to_end_point =
95
+ target_infinite_line.distance(self.end_point)
96
+ if(distance_to_start_point < distance_to_end_point)
97
+ return distance_to_start_point, self.start_point, closest_point_to_start_point, 0.0, parameter_to_start_point
98
+ else
99
+ return distance_to_end_point, self.end_point, closest_point_to_end_point, 1.0, parameter_to_end_point
100
+ end
101
+ end
102
+
103
+ def distance_to_finite_line(target_finite_line)
104
+ line1 = Line.new(self.start_point, self.direction)
105
+ line2 = Line.new(target_finite_line.start_point, target_finite_line.direction)
106
+ distance, point_myself, point_target, parameter_myself, parameter_target = line1.distance( line2 )
107
+ if(point_myself == nil and point_target == nil)
108
+ #prallel or including case
109
+ point_pair = Array.new(4)
110
+ point_pair[0] = Array.new([self.start_point, target_finite_line.start_point, 0, 0])
111
+ point_pair[1] = Array.new([self.start_point, target_finite_line.end_point, 0,1])
112
+ point_pair[2] = Array.new([self.end_point, target_finite_line.start_point, 1,0])
113
+ point_pair[3] = Array.new([self.end_point, target_finite_line.end_point,1,1])
114
+
115
+ distance_ary = Array.new(0)
116
+ point_pair.each do |points|
117
+ distance_ary << points[0].distance(points[1])
118
+ end
119
+ distance_min = distance_ary.min
120
+ distance_min_ary = Array.new(0)
121
+ distance_min_index = nil
122
+ distance_ary.each do |item|
123
+ if( item - tolerance < distance_min )
124
+ distance_min_ary << item
125
+ distance_min_index = distance_ary.index(item)
126
+ end
127
+ end
128
+ if( distance_min_ary.size == 1)
129
+ target_point_pair = point_pair[distance_min_index]
130
+ distance = target_point_pair[0].distance(target_point_pair[1])
131
+ return distance, target_point_pair[0], target_point_pair[1], target_point_pair[2], target_point_pair[3]
132
+ else
133
+ return distance, nil, nil, nil, nil
134
+ end
135
+ #out of range
136
+ elsif( parameter_myself < 0 or 1 < parameter_myself or parameter_target < 0 or 1 < parameter_target )
137
+ parameter_myself = [1, parameter_myself].min
138
+ parameter_myself = [0, parameter_myself].max
139
+ distance1, point_target, paramter_target_tmp = target_finite_line.distance(point_myself)
140
+
141
+ parameter_target = [1, parameter_target].min
142
+ parameter_target = [0, parameter_target].max
143
+ distance2, point_myself, parameter_myself_tmp = self.distance(point_target)
144
+ if(distance1 < distance2)
145
+ parameter_target = paramter_target_tmp
146
+ else
147
+ parameter_myself = parameter_myself_tmp
148
+ end
149
+ end
150
+ point_myself = line1.point(parameter_myself);
151
+ point_target = line2.point(parameter_target);
152
+ distance = point_myself.distance(point_target)
153
+ return distance, point_myself, point_target, parameter_myself, parameter_target
154
+ end
155
+ end
156
+ end
157
+
data/lib/geom.rb ADDED
@@ -0,0 +1,20 @@
1
+ module GMath3D
2
+
3
+ class Geom
4
+ private
5
+ @@default_tolerance = 1e-6
6
+ @tolerance
7
+
8
+ public
9
+ attr_accessor :tolerance
10
+
11
+ def initialize
12
+ @tolerance = @@default_tolerance
13
+ end
14
+
15
+ def self.default_tolerance
16
+ @@default_tolerance
17
+ end
18
+ end
19
+
20
+ end
data/lib/gmath3D.rb ADDED
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+
3
+ require 'util'
4
+ require 'geom'
5
+ require 'vector3'
6
+ require 'line'
7
+ require 'finite_line'
8
+ require 'plane'
9
+ require 'rectangle'
10
+ require 'triangle'
11
+ require 'box'
data/lib/line.rb ADDED
@@ -0,0 +1,80 @@
1
+ require 'gmath3D'
2
+
3
+ module GMath3D
4
+ class Line < Geom
5
+ public
6
+ attr_accessor :base_point
7
+ attr_accessor :direction
8
+
9
+ def initialize(point = Vector3.new(0.0,0.0,0.0), direction = Vector3.new(1.0,0.0,0.0))
10
+ Util.check_arg_type(Vector3, point)
11
+ Util.check_arg_type(Vector3, direction)
12
+ super()
13
+ @base_point = point
14
+ @direction = direction
15
+ end
16
+
17
+ def point(parameter)
18
+ Util.check_arg_type(::Numeric, parameter)
19
+ @base_point + @direction*parameter
20
+ end
21
+
22
+ def distance(target)
23
+ # with Point
24
+ if(target.kind_of?(Vector3))
25
+ return distance_to_point(target)
26
+ #with Line
27
+ elsif(target.kind_of?(Line))
28
+ return distance_to_line(target)
29
+ end
30
+ Util.raise_argurment_error(target)
31
+ end
32
+
33
+ private
34
+ def distance_to_point(target_point)
35
+ point_on_line1 = self.base_point
36
+ point_on_line2 = self.base_point + self.direction
37
+
38
+ vecAB = point_on_line2 - point_on_line1
39
+ vecAP = target_point - point_on_line1
40
+ vecAQ, parameter = vecAP.project_to(vecAB)
41
+ cross_point = point_on_line1 + vecAQ
42
+ vecPQ = vecAQ - vecAP
43
+ return vecPQ.length, cross_point, parameter
44
+ end
45
+
46
+ def distance_to_line(target_line)
47
+ if(self.direction.parallel?(target_line.direction)) then
48
+ distanceInfo = self.distance(target_line.base_point)
49
+ return distanceInfo[0], nil, nil, nil, nil
50
+ else
51
+ line1_point1 = self.base_point
52
+ line1_point2 = self.base_point + self.direction
53
+ line2_point1 = target_line.base_point
54
+ line2_point2 = target_line.base_point + target_line.direction
55
+
56
+ vec_da = line1_point2 - line1_point1
57
+ vec_db = line2_point2 - line2_point1
58
+ vec_ab = line2_point1 - line1_point1
59
+
60
+ abs_vec_db = vec_db.length*vec_db.length
61
+ abs_vec_da = vec_da.length*vec_da.length
62
+
63
+ delta = (abs_vec_da*abs_vec_db - vec_da.dot( vec_db )*vec_da.dot( vec_db ))
64
+
65
+ if( delta < self.tolerance )
66
+ # TODO ASSERT(false)
67
+ return nil
68
+ end
69
+ parameter1 = (abs_vec_db*vec_ab.dot(vec_da) - vec_da.dot( vec_db )*vec_ab.dot( vec_db ) ) / delta
70
+ parameter2 = (vec_da.dot( vec_db )*vec_ab.dot( vec_da ) - abs_vec_da*vec_ab.dot( vec_db ))/ delta
71
+
72
+ line1_closest_point = line1_point1 + vec_da*parameter1
73
+ line2_closest_point = line2_point1 + vec_db*parameter2
74
+ distance = line1_closest_point.distance( line2_closest_point )
75
+ return distance, line1_closest_point, line2_closest_point, parameter1, parameter2
76
+ end
77
+ end
78
+ end
79
+ end
80
+
data/lib/plane.rb ADDED
@@ -0,0 +1,86 @@
1
+ require 'gmath3D'
2
+
3
+ module GMath3D
4
+ class Plane < Geom
5
+ public
6
+ attr_accessor:base_point
7
+ attr_accessor:normal
8
+
9
+ def initialize(base_point_arg = Vector3.new(), normal_arg = Vector3.new(0,0,1))
10
+ Util.check_arg_type(::Vector3, normal_arg)
11
+ Util.check_arg_type(::Vector3, base_point_arg)
12
+ super()
13
+ @base_point = base_point_arg
14
+ @normal = normal_arg.normalize()
15
+ end
16
+
17
+ def distance(target)
18
+ # with Point
19
+ if(target.kind_of?(Vector3))
20
+ return distance_to_point(target)
21
+ #with Line
22
+ elsif(target.kind_of?(Line))
23
+ return distance_to_line(target)
24
+ #with FiniteLine
25
+ elsif(target.kind_of?(FiniteLine))
26
+ return distance_to_finite_line(target)
27
+ #with Plane
28
+ elsif(target.kind_of?(Plane))
29
+ return distance_to_plane(target)
30
+ end
31
+ Util.raise_argurment_error(target)
32
+ end
33
+
34
+ def project( target_point )
35
+ Util.check_arg_type(::Vector3, target_point)
36
+ distance, closest_point = self.distance( target_point )
37
+ return closest_point
38
+ end
39
+ private
40
+ def distance_to_point(target_point)
41
+ vector_QA = target_point - @base_point
42
+ distance = vector_QA.dot(@normal)
43
+ closest_point = target_point - @normal*distance
44
+ return distance.abs, closest_point
45
+ end
46
+
47
+ def distance_to_line(target_line)
48
+ inner_product_normal_and_line_vec = target_line.direction.dot(self.normal)
49
+ #parallel
50
+ if( inner_product_normal_and_line_vec.abs < @tolerance)
51
+ distance, closest_point = self.distance(target_line.base_point)
52
+ return distance, nil,nil
53
+ end
54
+ parameter = ( self.normal.dot(self.base_point) - self.normal.dot( target_line.base_point ) )/inner_product_normal_and_line_vec.to_f
55
+ intersect_point = target_line.point(parameter)
56
+ return 0.0, intersect_point, parameter
57
+ end
58
+
59
+ def distance_to_finite_line(target_finite_line)
60
+ target_infinite_line = Line.new(target_finite_line.start_point, target_finite_line.direction)
61
+ distance, intersect_point, parameter = self.distance(target_infinite_line)
62
+ point_on_line = intersect_point
63
+ point_on_plane = intersect_point
64
+ if(parameter != nil and (parameter < 0 or 1 < parameter))
65
+ parameter = [0, parameter].max
66
+ parameter = [1, parameter].min
67
+ point_on_line = target_finite_line.point(parameter)
68
+ distance, point_on_plane = self.distance(point_on_line)
69
+ end
70
+ return distance, point_on_plane, point_on_line, parameter
71
+ end
72
+ def distance_to_plane(target_plane)
73
+ line_vector = target_plane.normal.cross(self.normal)
74
+ if(target_plane.normal.parallel?(self.normal))
75
+ distance, point_on_plane = self.distance(target_plane.base_point)
76
+ return distance, nil
77
+ end
78
+ line_vector = line_vector.normalize()
79
+ tangent_vector_on_target_plane = line_vector.cross(target_plane.normal)
80
+ distance, intersect_point, parameter = self.distance(Line.new( target_plane.base_point, tangent_vector_on_target_plane))
81
+ intersect_line = Line.new(intersect_point, line_vector)
82
+ return 0, intersect_line
83
+ end
84
+ end
85
+ end
86
+