gmath3D 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,245 @@
1
+ include GMath3D
2
+
3
+ MiniTest::Unit.autorun
4
+
5
+ class FiniteLineTestCase < MiniTest::Unit::TestCase
6
+ def test_initialize
7
+ start_point_tmp = Vector3.new(1.0, 0.0, 2.0)
8
+ end_point_tmp = Vector3.new(1.0, -3.5, 1.0)
9
+ line = FiniteLine.new(start_point_tmp, end_point_tmp)
10
+
11
+ assert_equal(start_point_tmp ,line.start_point)
12
+ assert_equal(end_point_tmp ,line.end_point )
13
+
14
+ lineDefault = FiniteLine.new()
15
+ assert_equal(Vector3.new(0,0,0), lineDefault.start_point)
16
+ assert_equal(Vector3.new(1,0,0), lineDefault.end_point )
17
+ end
18
+
19
+ def test_direction
20
+ start_point_tmp = Vector3.new(1.0, 0.0, 2.0)
21
+ end_point_tmp = Vector3.new(1.0, -3.5, 1.0)
22
+ line = FiniteLine.new(start_point_tmp, end_point_tmp)
23
+ assert_in_delta( 0.0, line.direction.x, line.tolerance)
24
+ assert_in_delta(-3.5, line.direction.y, line.tolerance)
25
+ assert_in_delta(-1.0, line.direction.z, line.tolerance)
26
+ end
27
+
28
+ def test_param
29
+ start_point_tmp = Vector3.new(1.0, 1.0, 2.0)
30
+ end_point_tmp = Vector3.new(2.0, 3.0, -4.0)
31
+ line = FiniteLine.new(start_point_tmp, end_point_tmp)
32
+ assert_equal( Vector3.new(1.0, 1.0, 2.0), line.point(0.0))
33
+ assert_equal( Vector3.new(1.5, 2.0, -1.0), line.point(0.5))
34
+ assert_equal( Vector3.new(2.0, 3.0, -4.0), line.point(1))
35
+
36
+ # if param is smaller than 0 or bigger than 1 then return nil
37
+ assert_equal( nil, line.point(-1.0))
38
+ assert_equal( nil, line.point(1.2))
39
+ end
40
+
41
+ def test_length
42
+ start_point_tmp = Vector3.new(0.0, 0.0, 2.0)
43
+ end_point_tmp = Vector3.new(2.0, 2.0, 2.0)
44
+ line = FiniteLine.new(start_point_tmp, end_point_tmp)
45
+
46
+ assert_in_delta(Math::sqrt(8), line.length, line.tolerance)
47
+ end
48
+
49
+ def test_distance_to_point
50
+ start_point_tmp = Vector3.new(0.0, 0.0, 2.0)
51
+ end_point_tmp = Vector3.new(2.0, 2.0, 2.0)
52
+ line = FiniteLine.new(start_point_tmp, end_point_tmp)
53
+
54
+ targetPoint = Vector3.new(1.0, 1.0, -4.0)
55
+ distance, pointOnLine, parameter = line.distance(targetPoint)
56
+ assert_in_delta(6.0, distance, targetPoint.tolerance)
57
+ assert_equal( Vector3.new(1.0, 1.0, 2.0), pointOnLine)
58
+ assert_in_delta(0.5, parameter, targetPoint.tolerance)
59
+
60
+ targetPoint2 = Vector3.new(3.0, 3.0, 2.0)
61
+ distance, pointOnLine, parameter = line.distance(targetPoint2)
62
+ assert_in_delta(Math::sqrt(2), distance, targetPoint.tolerance)
63
+ assert_equal( end_point_tmp, pointOnLine)
64
+ assert_in_delta(1.0, parameter, targetPoint.tolerance)
65
+
66
+ targetPoint3 = Vector3.new(0.0, -1.0, 3.0)
67
+ distance, pointOnLine, parameter = line.distance(targetPoint3)
68
+ assert_in_delta(Math::sqrt(2), distance, targetPoint.tolerance)
69
+ assert_equal( start_point_tmp, pointOnLine)
70
+ assert_in_delta(0.0, parameter, targetPoint.tolerance)
71
+
72
+ target_point4 = Vector3.new( 2,3,3)
73
+ line = FiniteLine.new( Vector3.new(1,2,3), Vector3.new(1,4,3))
74
+ distance, point_on_line, parameter = line.distance( target_point4 )
75
+ assert_in_delta( 1, distance, line.tolerance )
76
+ assert_equal( Vector3.new(1,3,3), point_on_line )
77
+ assert_in_delta( 0.5, parameter, line.tolerance )
78
+ end
79
+
80
+ def test_distance_to_line
81
+ start_point_tmp = Vector3.new(0.0, 0.0, 2.0)
82
+ end_point_tmp = Vector3.new(2.0, 2.0, 2.0)
83
+ finite_line = FiniteLine.new(start_point_tmp, end_point_tmp)
84
+
85
+ #intersect case
86
+ infinite_line = Line.new(Vector3.new(0.0, 2.0, 3.0), Vector3.new(2.0, -2.0, -2.0))
87
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(infinite_line)
88
+ assert_in_delta(0.0, distance, infinite_line.tolerance)
89
+ assert_equal( Vector3.new(1,1,2), point1)
90
+ assert_equal( Vector3.new(1,1,2), point2)
91
+ assert_in_delta(0.5, parameter1, infinite_line.tolerance)
92
+ assert_in_delta(0.5, parameter2, infinite_line.tolerance)
93
+
94
+ #not intersect case
95
+ infinite_line = Line.new(Vector3.new(0.0, 2.0, 4.0), Vector3.new(2.0, -2.0, 0.0))
96
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(infinite_line)
97
+ assert_in_delta(2.0, distance, infinite_line.tolerance)
98
+ assert_equal( Vector3.new(1,1,2), point1)
99
+ assert_equal( Vector3.new(1,1,4), point2)
100
+ assert_in_delta(0.5, parameter1, infinite_line.tolerance)
101
+ assert_in_delta(0.5, parameter2, infinite_line.tolerance)
102
+
103
+ #not intersect case2
104
+ infinite_line = Line.new(Vector3.new(-2.0, 2.0, 4.0), Vector3.new(0.0, -2.0, 0.0))
105
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(infinite_line)
106
+ assert_in_delta(Math::sqrt(8), distance, infinite_line.tolerance)
107
+ assert_equal( Vector3.new(0,0,2), point1)
108
+ assert_equal( Vector3.new(-2,0,4), point2)
109
+ assert_in_delta(0.0, parameter1, infinite_line.tolerance)
110
+ assert_in_delta(1.0, parameter2, infinite_line.tolerance)
111
+
112
+ #not intersect case3
113
+ infinite_line = Line.new(Vector3.new(12.0, 12.0, 2.0), Vector3.new(0, 5.0, 0.0))
114
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(infinite_line)
115
+ assert_in_delta(10, distance, infinite_line.tolerance)
116
+ assert_equal( Vector3.new(2,2,2), point1)
117
+ assert_equal( Vector3.new(12,2,2), point2)
118
+ assert_in_delta(1.0, parameter1, infinite_line.tolerance)
119
+ assert_in_delta(-2.0, parameter2, infinite_line.tolerance)
120
+
121
+ #parallel case
122
+ infinite_line = Line.new(Vector3.new(0, -2.0, 6.0), Vector3.new(-1.0, -1.0, 0.0))
123
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(infinite_line)
124
+ assert_in_delta(Math::sqrt(18), distance, infinite_line.tolerance)
125
+ assert_equal( nil, point1)
126
+ assert_equal( nil, point2)
127
+ assert_equal( nil, parameter1)
128
+ assert_equal( nil, parameter2)
129
+
130
+ #including case
131
+ infinite_line = Line.new(Vector3.new(-2, -2.0, 2.0), Vector3.new(1.0, 1.0, 0.0))
132
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(infinite_line)
133
+ assert_in_delta(0, distance, infinite_line.tolerance)
134
+ assert_equal( nil, point1)
135
+ assert_equal( nil, point2)
136
+ assert_equal( nil, parameter1)
137
+ assert_equal( nil, parameter2)
138
+ end
139
+
140
+ def test_distance_to_finite_line
141
+ finite_line = FiniteLine.new(Vector3.new(0.0, 0.0, 2.0), Vector3.new(2.0,2.0,2.0))
142
+
143
+ #intersect case
144
+ target_finite_line = FiniteLine.new(Vector3.new(2.0, 0.0, 2.0), Vector3.new(0.0, 2.0,2.0))
145
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(target_finite_line)
146
+ assert_in_delta(0.0, distance, target_finite_line.tolerance)
147
+ assert_equal( Vector3.new(1,1,2), point1)
148
+ assert_equal( Vector3.new(1,1,2), point2)
149
+ assert_in_delta(0.5, parameter1, target_finite_line.tolerance)
150
+ assert_in_delta(0.5, parameter2, target_finite_line.tolerance)
151
+
152
+ #not intersect case1
153
+ target_finite_line = FiniteLine.new(Vector3.new(2.0, 0.0, 4.0), Vector3.new(0.0, 2.0, 4.0))
154
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(target_finite_line)
155
+ assert_in_delta(2.0, distance, target_finite_line.tolerance)
156
+ assert_equal( Vector3.new(1,1,2), point1)
157
+ assert_equal( Vector3.new(1,1,4), point2)
158
+ assert_in_delta(0.5, parameter1, target_finite_line.tolerance)
159
+ assert_in_delta(0.5, parameter2, target_finite_line.tolerance)
160
+
161
+ #not intersect case2
162
+ target_finite_line = FiniteLine.new(Vector3.new(3.0, 2.0, 2.0), Vector3.new(5.0, 0.0, 2.0))
163
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(target_finite_line)
164
+ assert_in_delta(1.0, distance, target_finite_line.tolerance)
165
+ assert_equal( Vector3.new(2,2,2), point1)
166
+ assert_equal( Vector3.new(3,2,2), point2)
167
+ assert_in_delta(1.0, parameter1, target_finite_line.tolerance)
168
+ assert_in_delta(0.0, parameter2, target_finite_line.tolerance)
169
+
170
+ #not intersect case3
171
+ target_finite_line = FiniteLine.new(Vector3.new(-3.0, 5.0, 5.0), Vector3.new(0.0, 2.0, 2.0))
172
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(target_finite_line)
173
+ assert_in_delta(Math::sqrt(2), distance, target_finite_line.tolerance)
174
+ assert_equal( Vector3.new(1,1,2), point1)
175
+ assert_equal( Vector3.new(0,2,2), point2)
176
+ assert_in_delta(0.5, parameter1, target_finite_line.tolerance)
177
+ assert_in_delta(1.0, parameter2, target_finite_line.tolerance)
178
+
179
+ #not intersect case4
180
+ target_finite_line = FiniteLine.new(Vector3.new(-2.0, 5.0, 0), Vector3.new(-2.0, 2.0, 0))
181
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(target_finite_line)
182
+ assert_in_delta(Math::sqrt(12), distance, target_finite_line.tolerance)
183
+ assert_equal( Vector3.new(0,0,2), point1)
184
+ assert_equal( Vector3.new(-2,2,0), point2)
185
+ assert_in_delta(0, parameter1, target_finite_line.tolerance)
186
+ assert_in_delta(1, parameter2, target_finite_line.tolerance)
187
+
188
+ #parallel case1
189
+ target_finite_line = FiniteLine.new(Vector3.new(4,4,0),Vector3.new(5,5,0))
190
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(target_finite_line)
191
+ assert_in_delta(Math::sqrt(12), distance, target_finite_line.tolerance)
192
+ assert_equal( Vector3.new(2,2,2), point1)
193
+ assert_equal( Vector3.new(4,4,0), point2)
194
+ assert_in_delta(1.0, parameter1, target_finite_line.tolerance)
195
+ assert_in_delta(0.0, parameter2, target_finite_line.tolerance)
196
+
197
+ #parallel case2
198
+ target_finite_line = FiniteLine.new(Vector3.new(2,2,0),Vector3.new(5,5,0))
199
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(target_finite_line)
200
+ assert_in_delta(2, distance, target_finite_line.tolerance)
201
+ assert_equal( Vector3.new(2,2,2), point1)
202
+ assert_equal( Vector3.new(2,2,0), point2)
203
+ assert_in_delta(1.0, parameter1, target_finite_line.tolerance)
204
+ assert_in_delta(0.0, parameter2, target_finite_line.tolerance)
205
+
206
+ #parallel case3
207
+ target_finite_line = FiniteLine.new(Vector3.new(1,1,1),Vector3.new(5,5,1))
208
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(target_finite_line)
209
+ assert_in_delta(1, distance, target_finite_line.tolerance)
210
+ assert_equal( nil, point1)
211
+ assert_equal( nil, point2)
212
+ assert_equal( nil, parameter1)
213
+ assert_equal( nil, parameter2)
214
+
215
+ #including case1
216
+ target_finite_line = FiniteLine.new(Vector3.new(2,2,2),Vector3.new(5,5,2))
217
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(target_finite_line)
218
+ assert_in_delta(0, distance, target_finite_line.tolerance)
219
+ assert_equal( Vector3.new(2,2,2), point1)
220
+ assert_equal( Vector3.new(2,2,2), point2)
221
+ assert_in_delta(1.0, parameter1, target_finite_line.tolerance)
222
+ assert_in_delta(0.0, parameter2, target_finite_line.tolerance)
223
+
224
+ #including case2
225
+ target_finite_line = FiniteLine.new(Vector3.new(1,1,2),Vector3.new(5,5,2))
226
+ distance, point1, point2, parameter1, parameter2 = finite_line.distance(target_finite_line)
227
+ assert_in_delta(0, distance, target_finite_line.tolerance)
228
+ assert_equal( nil, point1)
229
+ assert_equal( nil, point2)
230
+ assert_equal( nil, parameter1)
231
+ assert_equal( nil, parameter2)
232
+
233
+ end
234
+
235
+ def test_distance_to_invalid_value
236
+ finite_line = FiniteLine.new(Vector3.new(0,1,2), Vector3.new(2,3,4))
237
+ assert_raises ArgumentError do
238
+ finite_line.distance(4)
239
+ end
240
+ assert_raises ArgumentError do
241
+ finite_line.distance(nil)
242
+ end
243
+ end
244
+
245
+ end
data/test/test_geom.rb ADDED
@@ -0,0 +1,14 @@
1
+ include GMath3D
2
+
3
+ MiniTest::Unit.autorun
4
+
5
+ class GeomTestCase < MiniTest::Unit::TestCase
6
+ def test_tolerance
7
+ default_tolerance = Geom.default_tolerance
8
+ geomObject = Geom.new
9
+ assert_equal(default_tolerance, geomObject.tolerance)
10
+ geomObject.tolerance = 1e-8
11
+ assert_equal(1e-8, geomObject.tolerance)
12
+ assert_equal(default_tolerance, Geom.default_tolerance)
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+
3
+ require 'helper'
4
+ require 'test_geom'
5
+ require 'test_util'
6
+ require 'test_vector3'
7
+ require 'test_line'
8
+ require 'test_finite_line'
9
+ require 'test_plane'
10
+ require 'test_rectangle'
11
+ require 'test_triangle'
12
+ require 'test_box'
13
+
14
+
15
+
data/test/test_line.rb ADDED
@@ -0,0 +1,105 @@
1
+ include GMath3D
2
+
3
+ MiniTest::Unit.autorun
4
+
5
+ class LineTestCase < MiniTest::Unit::TestCase
6
+ def test_initialize
7
+ base_point_tmp = Vector3.new(2.0, 3.0, 5.0)
8
+ direction_tmp = Vector3.new(1.0, 1.0, 1.0)
9
+ line = Line.new(base_point_tmp, direction_tmp)
10
+
11
+ assert(base_point_tmp == line.base_point)
12
+ assert(direction_tmp == line.direction )
13
+
14
+ lineDefault = Line.new()
15
+ assert(Vector3.new(0,0,0) == lineDefault.base_point)
16
+ assert(Vector3.new(1,0,0) == lineDefault.direction )
17
+ end
18
+
19
+ def test_point
20
+ base_point_tmp = Vector3.new(2.0, 3.0, 5.0)
21
+ direction_tmp = Vector3.new(1.0, 1.0, 0.0)
22
+ line = Line.new(base_point_tmp, direction_tmp)
23
+
24
+ assert(Vector3.new(2.0, 3.0, 5.0) == line.point(0.0))
25
+ assert(Vector3.new(3.0, 4.0, 5.0) == line.point(1.0))
26
+ assert(Vector3.new(2.5, 3.5, 5.0) == line.point(0.5))
27
+ assert(Vector3.new(4.0, 5.0, 5.0) == line.point(2))
28
+ assert(Vector3.new(1.0, 2.0, 5.0) == line.point(-1.0))
29
+ end
30
+
31
+ def test_distance_to_point
32
+ base_point_tmp = Vector3.new(2.0, 3.0, 5.0)
33
+ direction_tmp = Vector3.new(1.0, 1.0, 0.0)
34
+ line = Line.new(base_point_tmp, direction_tmp)
35
+
36
+ check_point1 = base_point_tmp + Vector3.new(-1.0, 1.0, 0.0)
37
+ distance, closest_point, parameter = line.distance(check_point1)
38
+ assert_in_delta(Math::sqrt(2.0), distance, line.tolerance)
39
+ assert(base_point_tmp == closest_point)
40
+ assert_in_delta(0.0, parameter, line.tolerance)
41
+
42
+ check_point2 = check_point1 + direction_tmp
43
+ distance, closest_point, parameter = line.distance(check_point2)
44
+ assert_in_delta(Math::sqrt(2.0), distance, line.tolerance)
45
+ assert(base_point_tmp + direction_tmp == closest_point)
46
+ assert_in_delta(1.0, parameter, line.tolerance)
47
+
48
+ check_point3 = line.point(0.3)
49
+ distance, closest_point = line.distance(check_point3)
50
+ assert_in_delta(0.0, distance, line.tolerance)
51
+ assert(check_point3 == closest_point)
52
+
53
+ target_point4 = Vector3.new(2,3,3)
54
+ line2 = Line.new( Vector3.new(1,2,3), Vector3.new(0,2,0))
55
+ distance, point_on_line, parameter = line2.distance( target_point4 )
56
+ assert_in_delta( 1, distance, line.tolerance )
57
+ assert_equal( Vector3.new(1,3,3), point_on_line )
58
+ assert_in_delta( 0.5, parameter, line.tolerance )
59
+ end
60
+
61
+ def test_distance_to_line
62
+ base_point_tmp1 = Vector3.new(0.0, 0.0, 0.0)
63
+ direction_tmp1 = Vector3.new(1.0, 1.0, 0.0)
64
+ line1 = Line.new(base_point_tmp1, direction_tmp1)
65
+
66
+ base_point_tmp2 = Vector3.new(1.0, 1.0, 3.0)
67
+ direction_tmp2 = Vector3.new(-1.0, 1.0, 0.0)
68
+ line2 = Line.new(base_point_tmp2, direction_tmp2)
69
+
70
+ distance, point1, point2, parameter1, parameter2 = line1.distance(line2)
71
+ assert_in_delta(3.0, distance, line1.tolerance)
72
+ assert(Vector3.new(1.0, 1.0, 0.0) == point1)
73
+ assert(Vector3.new(1.0, 1.0, 3.0) == point2)
74
+ assert_in_delta(1.0, parameter1, line1.tolerance)
75
+ assert_in_delta(0.0, parameter2, line2.tolerance)
76
+
77
+ # distance for same lines
78
+ distance, point1, point2, parameter1, parameter2 = line1.distance(line1)
79
+ assert_in_delta(0.0, distance, line1.tolerance)
80
+ assert_equal(nil, point1)
81
+ assert_equal(nil, point2)
82
+ assert_equal(nil, parameter1)
83
+ assert_equal(nil, parameter2)
84
+
85
+ # parallel case
86
+ base_point_tmp3 = Vector3.new(0.0, 0.0, 4.0)
87
+ direction_tmp3 = Vector3.new(-1.0, -1.0, 0.0)
88
+ line3 = Line.new(base_point_tmp3, direction_tmp3)
89
+ distance, point1, point2, parameter1, parameter2 = line1.distance(line3)
90
+ assert_in_delta(4.0, distance, line3.tolerance)
91
+ assert_equal(nil, point1)
92
+ assert_equal(nil, point2)
93
+ assert_equal(nil, parameter1)
94
+ assert_equal(nil, parameter2)
95
+ end
96
+
97
+ def test_distance_to_invalid_value
98
+ assert_raises ArgumentError do
99
+ invalidResult = Line.new.distance(nil)
100
+ end
101
+ assert_raises ArgumentError do
102
+ invalidResult = Line.new.distance(5.0)
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,160 @@
1
+ include GMath3D
2
+
3
+ MiniTest::Unit.autorun
4
+
5
+ class PlaneTestCase < MiniTest::Unit::TestCase
6
+ def setup
7
+ @base_point = Vector3.new(0,0,1)
8
+ @normal = Vector3.new(0,0,1)
9
+ @plane = Plane.new(@base_point, @normal)
10
+ @plane_default = Plane.new()
11
+ end
12
+
13
+ def test_initialize
14
+ assert_equal(@base_point, @plane.base_point)
15
+ assert_equal(@normal, @plane.normal)
16
+ assert_equal(Vector3.new(0,0,0),@plane_default.base_point)
17
+ assert_equal(Vector3.new(0,0,1),@plane_default.normal)
18
+ assert_equal(Geom.default_tolerance, @plane_default.tolerance)
19
+ end
20
+
21
+ def test_distance_to_point
22
+ target_point = Vector3.new(1,2,3)
23
+ distance, closest_point = @plane.distance(target_point)
24
+ assert_in_delta(2, distance, target_point.tolerance)
25
+ assert_equal(Vector3.new(1,2,1),closest_point)
26
+
27
+ target_point = Vector3.new(1,-4,-5)
28
+ distance, closest_point = @plane_default.distance(target_point)
29
+ assert_in_delta(5, distance, target_point.tolerance)
30
+ assert_equal(Vector3.new(1,-4,0),closest_point)
31
+
32
+ target_point = Vector3.new(-2,4.5,1.0)
33
+ distance, closest_point = @plane.distance(target_point)
34
+ assert_in_delta(0, distance, target_point.tolerance)
35
+ assert_equal(Vector3.new(-2,4.5,1.0),closest_point)
36
+
37
+ plane2 = Plane.new(Vector3.new( 1.0, 1.0, 1.0), Vector3.new(1.0, 1.0, 0.0))
38
+ target_point = Vector3.new( 0.0, 0.0, 0.0 )
39
+ distance, closest_point = plane2.distance(target_point)
40
+ assert_in_delta( Math::sqrt(2), distance, plane2.tolerance)
41
+ assert_equal( Vector3.new( 1,1,0 ), closest_point)
42
+ end
43
+
44
+ def test_distance_to_line
45
+ #intersect case
46
+ target_line = Line.new(Vector3.new(1,1,2),Vector3.new(1,1,1))
47
+ distance, intersect_point, parameter = @plane.distance(target_line)
48
+ assert_in_delta(0, distance, @plane.tolerance)
49
+ assert_equal(Vector3.new(0,0,1), intersect_point)
50
+ assert_in_delta(-1, parameter, intersect_point.tolerance)
51
+
52
+ #intersect case 2
53
+ target_line = Line.new(Vector3.new(0,0,0),Vector3.new(2,2,2))
54
+ distance, intersect_point, parameter = @plane.distance(target_line)
55
+ assert_in_delta(0, distance, @plane.tolerance)
56
+ assert_equal(Vector3.new(1,1,1), intersect_point)
57
+ assert_in_delta(0.5, parameter, intersect_point.tolerance)
58
+
59
+ #parallel case
60
+ target_line = Line.new(Vector3.new(1,1,1.5),Vector3.new(1,1,0))
61
+ distance, intersect_point, parameter = @plane_default.distance(target_line)
62
+ assert_in_delta(1.5, distance, @plane_default.tolerance)
63
+ assert_equal(nil, intersect_point)
64
+ assert_equal(nil, parameter)
65
+
66
+ #contains case
67
+ target_line = Line.new(Vector3.new(1,1,1),Vector3.new(1,2.0,0))
68
+ distance, intersect_point, parameter = @plane.distance(target_line)
69
+ assert_in_delta(0, distance, @plane.tolerance)
70
+ assert_equal(nil, intersect_point)
71
+ assert_equal(nil, parameter)
72
+ end
73
+
74
+ def test_distance_to_finite_line
75
+ #intersect case
76
+ target_finite_line = FiniteLine.new(Vector3.new(0,0,0),Vector3.new(2,2,2))
77
+ distance, point_on_plane, point_on_line, parameter_on_line = @plane.distance(target_finite_line)
78
+ assert_in_delta(0, distance, @plane.tolerance)
79
+ assert_equal( Vector3.new(1,1,1), point_on_plane)
80
+ assert_equal( Vector3.new(1,1,1), point_on_line)
81
+ assert_in_delta(0.5, parameter_on_line, @plane.tolerance)
82
+
83
+ #intersect case2
84
+ target_finite_line = FiniteLine.new(Vector3.new(0,0,0),Vector3.new(1,1,1))
85
+ distance, point_on_plane, point_on_line, parameter_on_line = @plane.distance(target_finite_line)
86
+ assert_in_delta(0, distance, @plane.tolerance)
87
+ assert_equal( Vector3.new(1,1,1), point_on_plane)
88
+ assert_equal( Vector3.new(1,1,1), point_on_line)
89
+ assert_in_delta(1, parameter_on_line, @plane.tolerance)
90
+
91
+ #not intersect case
92
+ target_finite_line = FiniteLine.new(Vector3.new(2,2,2),Vector3.new(4,5,6))
93
+ distance, point_on_plane, point_on_line, parameter_on_line = @plane.distance(target_finite_line)
94
+ assert_in_delta(1, distance, @plane.tolerance)
95
+ assert_equal( Vector3.new(2,2,1), point_on_plane)
96
+ assert_equal( Vector3.new(2,2,2), point_on_line)
97
+ assert_in_delta(0, parameter_on_line, @plane.tolerance)
98
+
99
+ #not intersect case2
100
+ target_finite_line = FiniteLine.new(Vector3.new(3,6,-9),Vector3.new(-2,3,-5))
101
+ distance, point_on_plane, point_on_line, parameter_on_line = @plane.distance(target_finite_line)
102
+ assert_in_delta(6, distance, @plane.tolerance)
103
+ assert_equal( Vector3.new(-2,3,1), point_on_plane)
104
+ assert_equal( Vector3.new(-2,3,-5), point_on_line)
105
+ assert_in_delta(1, parameter_on_line, @plane.tolerance)
106
+
107
+ #parallel case
108
+ target_finite_line = FiniteLine.new(Vector3.new(3,3,3),Vector3.new(1,-4,3))
109
+ distance, point_on_plane, point_on_line, parameter_on_line = @plane.distance(target_finite_line)
110
+ assert_in_delta(2, distance, @plane.tolerance)
111
+ assert_equal( nil, point_on_plane)
112
+ assert_equal( nil, point_on_line)
113
+ assert_equal( nil, parameter_on_line)
114
+
115
+ #including case
116
+ target_finite_line = FiniteLine.new(Vector3.new(3,3,1),Vector3.new(1,-4,1))
117
+ distance, point_on_plane, point_on_line, parameter_on_line = @plane.distance(target_finite_line)
118
+ assert_in_delta(0, distance, @plane.tolerance)
119
+ assert_equal( nil, point_on_plane)
120
+ assert_equal( nil, point_on_line)
121
+ assert_equal( nil, parameter_on_line)
122
+ end
123
+
124
+ def test_distance_to_plane
125
+ #intersect case
126
+ target_plane = Plane.new(Vector3.new(1,1,4), Vector3.new(1,-1,0))
127
+ distance, intersect_line = @plane.distance(target_plane)
128
+ assert_in_delta(0, distance, @plane.tolerance)
129
+ assert(intersect_line.direction.parallel?(Vector3.new(1,1,0)))
130
+
131
+ #parallel case
132
+ target_plane = Plane.new(Vector3.new(1,1,4), Vector3.new(0,0,-1))
133
+ distance, intersect_line = @plane.distance(target_plane)
134
+ assert_in_delta(3, distance, @plane.tolerance)
135
+ assert_equal(nil, intersect_line)
136
+
137
+ #including case
138
+ target_plane = Plane.new(Vector3.new(1,1,1), Vector3.new(0,0,3))
139
+ distance, intersect_line = @plane.distance(target_plane)
140
+ assert_in_delta(0, distance, @plane.tolerance)
141
+ assert_equal(nil, intersect_line)
142
+ end
143
+
144
+ def test_distance_to_invalid_value
145
+ assert_raises ArgumentError do
146
+ @plane.distance(4)
147
+ end
148
+ assert_raises ArgumentError do
149
+ @plane.distance(nil)
150
+ end
151
+ end
152
+
153
+ def test_project
154
+ assert_equal( Vector3.new( 2.0, 4.0, 1.0), @plane.project(Vector3.new(2.0, 4.0, -5.0)))
155
+ assert_equal( Vector3.new( 2.0, 4.0, 1.0), @plane.project(Vector3.new(2.0, 4.0, 5.0)))
156
+ assert_equal( Vector3.new( 0.0, -4.0, 1.0), @plane.project(Vector3.new(0.0, -4.0, 1.0)))
157
+ plane2 = Plane.new( Vector3.new(1,1,1), Vector3.new(1,1,0))
158
+ assert_equal( Vector3.new( 1,1,5), plane2.project( Vector3.new( 0,0,5)))
159
+ end
160
+ end
@@ -0,0 +1,123 @@
1
+ include GMath3D
2
+
3
+ MiniTest::Unit.autorun
4
+
5
+ class RectangleTestCase < MiniTest::Unit::TestCase
6
+ def setup
7
+ @rectangle = Rectangle.new( Vector3.new(1,2,3), Vector3.new(0,-0.5,0), Vector3.new(0,0,2))
8
+ @rectangle_default = Rectangle.new()
9
+ end
10
+
11
+ def test_initialize
12
+ assert_equal(Vector3.new(1, 2,3), @rectangle.base_point)
13
+ assert_equal(Vector3.new(0,-0.5,0), @rectangle.u_vector)
14
+ assert_equal(Vector3.new(0, 0,2), @rectangle.v_vector)
15
+
16
+ assert_equal(Vector3.new(0,0,0), @rectangle_default.base_point)
17
+ assert_equal(Vector3.new(1,0,0), @rectangle_default.u_vector)
18
+ assert_equal(Vector3.new(0,1,0), @rectangle_default.v_vector)
19
+ end
20
+
21
+ def test_point
22
+ point = @rectangle.point(0.2, 1.0)
23
+ assert_equal(Vector3.new(1, 1.9, 5), point)
24
+
25
+ point = @rectangle.point(-2.0, 0.5)
26
+ assert_equal(Vector3.new(1, 3, 4), point)
27
+
28
+ point = @rectangle_default.point(0,0)
29
+ assert_equal(Vector3.new(0,0,0), point)
30
+
31
+ point = @rectangle_default.point(0.5, 0.5)
32
+ assert_equal(@rectangle_default.center_point, point)
33
+ end
34
+
35
+ def test_edges
36
+ edges = @rectangle.edges
37
+ assert_equal(4, edges.size)
38
+ assert_equal(Vector3.new(1,2, 3), edges[0].start_point)
39
+ assert_equal(Vector3.new(1,1.5,3), edges[0].end_point)
40
+ assert_equal(Vector3.new(1,1.5,3), edges[1].start_point)
41
+ assert_equal(Vector3.new(1,1.5,5), edges[1].end_point)
42
+ assert_equal(Vector3.new(1,1.5,5), edges[2].start_point)
43
+ assert_equal(Vector3.new(1,2 ,5), edges[2].end_point)
44
+ assert_equal(Vector3.new(1,2 ,5), edges[3].start_point)
45
+ assert_equal(Vector3.new(1,2 ,3), edges[3].end_point)
46
+ end
47
+
48
+ def test_normal
49
+ assert_equal(Vector3.new(-1,0,0), @rectangle.normal)
50
+ assert_equal(Vector3.new(0,0,1), @rectangle_default.normal)
51
+ end
52
+
53
+ def test_opposite_point
54
+ assert_equal(Vector3.new(1,1.5,5), @rectangle.opposite_point)
55
+ assert_equal(Vector3.new(1,1,0), @rectangle_default.opposite_point)
56
+ end
57
+
58
+ def test_center_point
59
+ assert_equal(Vector3.new(1,1.75,4), @rectangle.center_point)
60
+ assert_equal(Vector3.new(0.5,0.5,0), @rectangle_default.center_point)
61
+ end
62
+
63
+ def test_area
64
+ assert_in_delta( 1.0, @rectangle.area, @rectangle.tolerance)
65
+ assert_in_delta( 1.0, @rectangle_default.area, @rectangle_default.tolerance)
66
+ end
67
+
68
+ def test_uv_param
69
+ # inside case
70
+ check_point = @rectangle.center_point
71
+ u, v = @rectangle.uv_parameter(check_point)
72
+ assert_in_delta(0.5, u, @rectangle.tolerance)
73
+ assert_in_delta(0.5, v, @rectangle.tolerance)
74
+
75
+ # inside case2
76
+ check_point = @rectangle.point(0.3,0.6) + @rectangle.normal*1.0
77
+ u, v = @rectangle.uv_parameter(check_point)
78
+ assert_in_delta(0.3, u, @rectangle.tolerance)
79
+ assert_in_delta(0.6, v, @rectangle.tolerance)
80
+
81
+ # on edge
82
+ u, v = @rectangle.uv_parameter(Vector3.new(2, 1.75, 5))
83
+ assert_in_delta(0.5, u, @rectangle.tolerance)
84
+ assert_in_delta(1, v, @rectangle.tolerance)
85
+
86
+ # on vertex
87
+ u, v = @rectangle.uv_parameter(@rectangle.opposite_point)
88
+ assert_in_delta(1.0, u, @rectangle.tolerance)
89
+ assert_in_delta(1, v, @rectangle.tolerance)
90
+
91
+ # outside case1
92
+ u, v = @rectangle.uv_parameter(@rectangle.point(2.0, -3.0))
93
+ assert_in_delta(2.0, u, @rectangle.tolerance)
94
+ assert_in_delta(-3.0, v, @rectangle.tolerance)
95
+ end
96
+
97
+ def test_distance_to_point
98
+ # inside case
99
+ distance, point_on_rectangle = @rectangle.distance(Vector3.new(0.5,1.75,4.5))
100
+ assert_in_delta( 0.5, distance, @rectangle.tolerance)
101
+ assert_equal(Vector3.new(1, 1.75, 4.5), point_on_rectangle)
102
+
103
+ # on edge
104
+ distance, point_on_rectangle = @rectangle.distance(Vector3.new(2.0,1.5,4.5))
105
+ assert_in_delta( 1.0, distance, @rectangle.tolerance)
106
+ assert_equal(Vector3.new(1, 1.5, 4.5), point_on_rectangle)
107
+
108
+ # on vertex
109
+ distance, point_on_rectangle = @rectangle.distance(Vector3.new(-0.5,2,3))
110
+ assert_in_delta( 1.5, distance, @rectangle.tolerance)
111
+ assert_equal(Vector3.new(1,2,3), point_on_rectangle)
112
+
113
+ # outside on edge
114
+ distance, point_on_rectangle = @rectangle.distance(Vector3.new(0,1.75,2))
115
+ assert_in_delta( Math::sqrt(2), distance, @rectangle.tolerance)
116
+ assert_equal(Vector3.new(1,1.75,3), point_on_rectangle)
117
+
118
+ # outside on vertex
119
+ distance, point_on_rectangle = @rectangle.distance(Vector3.new(0,0,0))
120
+ assert_in_delta( Math::sqrt(12.25), distance, @rectangle.tolerance)
121
+ assert_equal(Vector3.new(1,1.5,3), point_on_rectangle)
122
+ end
123
+ end