mageo 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,73 @@
1
+ #! /usr/bin/ruby
2
+
3
+ require "test/unit"
4
+ require "matrix"
5
+ require "mageo/vector.rb"
6
+ require "mageo/vector3d.rb"
7
+
8
+ class TC_Vector < Test::Unit::TestCase
9
+ #include Math
10
+ $tolerance = 1.0E-10
11
+
12
+ def setup
13
+ @v0 = Vector[ 1.0, 2.0, 3.0 ]
14
+ @v1 = Vector[ 1.0, 1.0 ]
15
+ @v2 = Vector[ 1.0, 2.0, 3.0, 4.0 ]
16
+ end
17
+
18
+ def test_equal
19
+ assert_equal(false, @v0 == Vector[1.0, 2.0, 4.0] )
20
+ assert_equal(true, @v0 == Vector[1.0, 2.0, 3.0] )
21
+ end
22
+
23
+ def test_unit_vector
24
+ assert_raise( Vector::ZeroOperation ){ Vector[0.0, 0.0, 0.0].unit_vector }
25
+
26
+ assert_in_delta( 1.0/Math::sqrt(14.0), @v0.unit_vector[0], $tolerance )
27
+ assert_in_delta( 2.0/Math::sqrt(14.0), @v0.unit_vector[1], $tolerance )
28
+ assert_in_delta( 3.0/Math::sqrt(14.0), @v0.unit_vector[2], $tolerance )
29
+ assert_equal( Vector[1.0, 2.0, 3.0], @v0) #非破壊であることを確認。
30
+ end
31
+
32
+ def test_floor
33
+ tmp = @v0.floor
34
+ assert_equal(Vector, tmp.class)
35
+ assert_equal(1, tmp[0])
36
+ assert_equal(2, tmp[1])
37
+ assert_equal(3, tmp[2])
38
+ assert_equal(3, tmp.size)
39
+
40
+ tmp = @v1.floor
41
+ assert_equal(1, tmp[0])
42
+ assert_equal(1, tmp[1])
43
+ assert_equal(2, tmp.size)
44
+
45
+ tmp = Vector[ 1.1, 2.2].floor
46
+ assert_equal(1, tmp[0])
47
+ assert_equal(2, tmp[1])
48
+ assert_equal(2, tmp.size)
49
+
50
+ tmp = Vector[-1.1,-2.2].floor
51
+ assert_equal(-2, tmp[0])
52
+ assert_equal(-3, tmp[1])
53
+ assert_equal(2, tmp.size)
54
+
55
+ # positive decimal like
56
+ vec = Vector[-1.1,-2.2]
57
+ tmp = vec - vec.floor
58
+ assert_in_delta(0.9, tmp[0], $tolerance)
59
+ assert_in_delta(0.8, tmp[1], $tolerance)
60
+ assert_equal(2, tmp.size)
61
+
62
+ # inherited class
63
+ tmp = Vector3D[1.1, 2.2, 3.3].floor
64
+ assert_equal(Vector3D, tmp.class)
65
+ assert_equal(1, tmp[0])
66
+ assert_equal(2, tmp[1])
67
+ assert_equal(3, tmp[2])
68
+ assert_equal(3, tmp.size)
69
+
70
+ end
71
+
72
+ end
73
+
@@ -0,0 +1,429 @@
1
+ #! /usr/bin/ruby
2
+
3
+ require "test/unit"
4
+ require "matrix"
5
+ require "mageo/vector3d.rb"
6
+ require "mageo/vector3dinternal.rb"
7
+ require "mageo/polar2d.rb"
8
+ require "mageo/polar3d.rb"
9
+
10
+ class TC_Array < Test::Unit::TestCase
11
+ $tolerance = 10.0**(-10)
12
+
13
+ def setup
14
+ @a = [1.0, 2.0, 3.0]
15
+ end
16
+
17
+ def test_to_v3d
18
+ assert_equal( Vector3D, @a.to_v3d.class )
19
+ assert_in_delta( 1.0, @a.to_v3d[0], $tolerance )
20
+ assert_in_delta( 2.0, @a.to_v3d[1], $tolerance )
21
+ assert_in_delta( 3.0, @a.to_v3d[2], $tolerance )
22
+ assert_raise( Vector3D::RangeError ){ [1.0].to_v3d }
23
+ assert_raise( Vector3D::RangeError ){ [0.0, 1.0, 2.0, 3.0].to_v3d }
24
+ end
25
+
26
+ end
27
+
28
+ class TC_Vector < Test::Unit::TestCase
29
+ include Math
30
+
31
+ $tolerance = 10.0**(-10)
32
+
33
+ def setup
34
+ @v0 = Vector[ 1.0, 2.0, 3.0 ]
35
+ @v1 = Vector[ 1.0, 1.0 ]
36
+ @v2 = Vector[ 1.0, 2.0, 3.0, 4.0 ]
37
+ end
38
+
39
+ def test_to_v3d
40
+ assert_equal( Vector3D, @v0.to_v3d.class )
41
+ assert_in_delta( 1.0, @v0.to_v3d[0], $tolerance )
42
+ assert_in_delta( 2.0, @v0.to_v3d[1], $tolerance )
43
+ assert_in_delta( 3.0, @v0.to_v3d[2], $tolerance )
44
+ assert_raise( Vector3D::RangeError ){ Vector[1.0].to_v3d }
45
+ assert_raise( Vector3D::RangeError ){ Vector[0.0, 1.0, 2.0, 3.0].to_v3d }
46
+ end
47
+ end
48
+
49
+ class TC_Vector3D < Test::Unit::TestCase
50
+ $tolerance = 10.0**(-10)
51
+ include Math
52
+
53
+ def setup
54
+ @v00 = Vector3D[1.0, 0.0, 0.0]
55
+ @v01 = Vector3D[1.0, 0.0, 0.0]
56
+ @v02 = Vector3D[0.0, 1.0, 0.0]
57
+ @v03 = Vector3D[0.0, 0.0, 1.0]
58
+ @v04 = Vector3D[0.0, 0.0, 0.0]
59
+ @v05 = Vector3D[0.5, 0.5, 0.0]
60
+ @v07 = Vector3D[1.0, 2.0, 3.0]
61
+ @v08 = Vector3D[0.1, 0.2, 0.3]
62
+ end
63
+
64
+ def test_initialize
65
+ assert_raise( Vector3D::RangeError ){ Vector3D[0.0, 0.0] }
66
+ assert_raise( Vector3D::RangeError ){ Vector3D[0.0, 0.0, 0.0, 0.0] }
67
+
68
+ assert_equal( Vector3D, Vector3D[0.0, 0.0, 1.0].class )
69
+ end
70
+
71
+ def test_add_and_delete
72
+ #追加できないことを確認。
73
+ assert_raise( NoMethodError ){ Vector3D.push( 0.0 ) }
74
+ assert_raise( NoMethodError ){ Vector3D[3] = 0.0 }
75
+
76
+ assert_raise( NoMethodError ){ Vector3D.pop( 0.0 ) }
77
+ assert_raise( NoMethodError ){ Vector3D.delete[3] = 0.0 }
78
+ end
79
+
80
+ def test_access
81
+ # read
82
+ assert_equal(1.0, @v00[0])
83
+ assert_equal(0.0, @v00[1])
84
+ assert_equal(0.0, @v00[2])
85
+ assert_raise(Vector3D::RangeError){@v00[3]}
86
+ assert_raise(Vector3D::RangeError){@v00[-1]}
87
+
88
+ # write
89
+ @v00[0] = 2.0
90
+ @v00[1] = 3.0
91
+ @v00[2] = 4.0
92
+ assert_equal(2.0, @v00[0])
93
+ assert_equal(3.0, @v00[1])
94
+ assert_equal(4.0, @v00[2])
95
+ assert_raise(Vector3D::RangeError){@v00[3] = 0.0}
96
+ assert_raise(Vector3D::RangeError){@v00[-1] = 0.0}
97
+ end
98
+
99
+ def test_size
100
+ assert_equal( 3, @v00.size )
101
+ end
102
+
103
+ def test_exterior_product
104
+ #For class method
105
+ assert_raise( Vector3D::TypeError ){ Vector3D.exterior_product( @v00, [1.0, 2.0, 3.0] ) }
106
+ assert_raise( Vector3D::TypeError ){ Vector3D.exterior_product( @v00, Vector[1.0, 2.0, 3.0] ) }
107
+ assert_raise( Vector3D::TypeError ){ Vector3D.exterior_product( @v00, Vector3DInternal[1.0, 2.0, 3.0] ) }
108
+ assert_raise( Vector3D::TypeError ){ Vector3D.exterior_product( [1.0, 2.0, 3.0] , @v00 ) }
109
+ assert_raise( Vector3D::TypeError ){ Vector3D.exterior_product( Vector[1.0, 2.0, 3.0] , @v00 ) }
110
+ assert_raise( Vector3D::TypeError ){ Vector3D.exterior_product( Vector3DInternal[1.0, 2.0, 3.0], @v00 ) }
111
+
112
+ assert_equal( Vector3D, Vector3D.exterior_product( @v00, @v01 ).class)
113
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v01 )[0], $tolerance )
114
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v01 )[1], $tolerance )
115
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v01 )[2], $tolerance )
116
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v02 )[0], $tolerance )
117
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v02 )[1], $tolerance )
118
+ assert_in_delta( 1.0, Vector3D.exterior_product( @v00, @v02 )[2], $tolerance )
119
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v03 )[0], $tolerance )
120
+ assert_in_delta(-1.0, Vector3D.exterior_product( @v00, @v03 )[1], $tolerance )
121
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v03 )[2], $tolerance )
122
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v04 )[0], $tolerance )
123
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v04 )[1], $tolerance )
124
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v04 )[2], $tolerance )
125
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v05 )[0], $tolerance )
126
+ assert_in_delta( 0.0, Vector3D.exterior_product( @v00, @v05 )[1], $tolerance )
127
+ assert_in_delta( 0.5, Vector3D.exterior_product( @v00, @v05 )[2], $tolerance )
128
+
129
+ assert_in_delta( 0.5, Vector3D.cross_product( @v00, @v05 )[2], $tolerance )
130
+ assert_in_delta( 0.5, Vector3D.vector_product( @v00, @v05 )[2], $tolerance )
131
+
132
+ #For instance method
133
+ assert_raise( Vector3D::TypeError ){ @v00.exterior_product( [1.0, 2.0, 3.0] ) }
134
+ assert_raise( Vector3D::TypeError ){ @v00.exterior_product( Vector[1.0, 2.0, 3.0] ) }
135
+ assert_raise( Vector3D::TypeError ){ @v00.exterior_product( Vector3DInternal[1.0, 2.0, 3.0] ) }
136
+
137
+ assert_equal( 0.0, @v00.exterior_product( @v01 )[0], $tolerance )
138
+ assert_equal( 0.0, @v00.exterior_product( @v01 )[1], $tolerance )
139
+ assert_equal( 0.0, @v00.exterior_product( @v01 )[2], $tolerance )
140
+ assert_equal( 0.0, @v00.exterior_product( @v02 )[0], $tolerance )
141
+ assert_equal( 0.0, @v00.exterior_product( @v02 )[1], $tolerance )
142
+ assert_equal( 1.0, @v00.exterior_product( @v02 )[2], $tolerance )
143
+ assert_equal( 0.0, @v00.exterior_product( @v03 )[0], $tolerance )
144
+ assert_equal(-1.0, @v00.exterior_product( @v03 )[1], $tolerance )
145
+ assert_equal( 0.0, @v00.exterior_product( @v03 )[2], $tolerance )
146
+ assert_equal( 0.0, @v00.exterior_product( @v04 )[0], $tolerance )
147
+ assert_equal( 0.0, @v00.exterior_product( @v04 )[1], $tolerance )
148
+ assert_equal( 0.0, @v00.exterior_product( @v04 )[2], $tolerance )
149
+ assert_equal( 0.0, @v00.exterior_product( @v05 )[0], $tolerance )
150
+ assert_equal( 0.0, @v00.exterior_product( @v05 )[1], $tolerance )
151
+ assert_equal( 0.5, @v00.exterior_product( @v05 )[2], $tolerance )
152
+
153
+ assert_equal( 0.5, @v00.cross_product( @v05 )[2], $tolerance )
154
+ assert_equal( 0.5, @v00.vector_product( @v05 )[2], $tolerance )
155
+ end
156
+
157
+ def test_class
158
+ assert_equal( Vector3D, @v00.class )
159
+ assert_equal( Vector3D, ( @v00 - @v01 ).class )
160
+ assert_equal( Vector3D, ( @v00 * 3.0 ).class )
161
+ assert_equal( Vector3D, @v00.clone.class )
162
+ assert_equal( Vector3D, @v00.dup.class )
163
+
164
+ #assert_equal( Vector3D, @v00.collect{|x| x }.class )
165
+ #assert_equal( Vector3D, @v00.map{|x| x }.class )
166
+ #assert_equal( Vector3D, @v00.map2{|x| x }.class )
167
+ end
168
+
169
+ def test_equal_in_delta?
170
+ assert_raise(Vector3D::TypeError){@v00.equal_in_delta?( Vector[ 1.0, 0.0, 0.0 ])}
171
+ assert_raise(Vector3D::TypeError){@v00.equal_in_delta?( Vector3DInternal[ 1.0, 0.0, 0.0 ])}
172
+ assert_equal(true , @v00.equal_in_delta?( Vector3D[ 1.0, 0.0, 0.0 ]))
173
+ assert_equal(false, @v00.equal_in_delta?( Vector3D[ 1.0, 0.0, 0.1 ]))
174
+ assert_equal(true , @v00.equal_in_delta?( Vector3D[ 1.0, 0.0, 0.1 ], 1.0))
175
+ end
176
+
177
+ def test_plus
178
+ assert_raise( Vector3D::TypeError ){ @v07 + [0.0, 1.0, 2.0] }
179
+ assert_raise( Vector3D::TypeError ){ @v07 + Vector[0.0, 1.0, 2.0] }
180
+ assert_raise( Vector3D::TypeError ){ @v07 + Vector3DInternal[0.0, 1.0, 2.0] }
181
+
182
+ assert_equal( Vector3D, ( @v07 + @v08 ).class )
183
+ t = @v07 + @v08
184
+ assert_in_delta( 1.1, t[0], $tolerance )
185
+ assert_in_delta( 2.2, t[1], $tolerance )
186
+ assert_in_delta( 3.3, t[2], $tolerance )
187
+ end
188
+
189
+ def test_minus
190
+ assert_raise( Vector3D::TypeError ){ @v07 - [0.0, 1.0, 2.0] }
191
+ assert_raise( Vector3D::TypeError ){ @v07 - Vector[0.0, 1.0, 2.0] }
192
+ assert_raise( Vector3D::TypeError ){ @v07 - Vector3DInternal[0.0, 1.0, 2.0] }
193
+
194
+ assert_equal( Vector3D, ( @v07 - @v08 ).class )
195
+ t = @v07 - @v08
196
+ assert_in_delta( 0.9, t[0], $tolerance )
197
+ assert_in_delta( 1.8, t[1], $tolerance )
198
+ assert_in_delta( 2.7, t[2], $tolerance )
199
+ end
200
+
201
+ def test_multiply
202
+ assert_raise( Vector3D::TypeError ){ @v07 * [0.0, 1.0, 2.0] }
203
+ assert_raise( Vector3D::TypeError ){ @v07 * Vector[0.0, 1.0, 2.0] }
204
+ assert_raise( Vector3D::TypeError ){ @v07 * Vector3DInternal[0.0, 1.0, 2.0] }
205
+
206
+ t = @v07 * 3
207
+ assert_equal( Vector3D, t.class )
208
+ assert_in_delta( 3.0, t[0], $tolerance )
209
+ assert_in_delta( 6.0, t[1], $tolerance )
210
+ assert_in_delta( 9.0, t[2], $tolerance )
211
+
212
+ t = @v07 * 3.0
213
+ assert_equal( Vector3D, t.class )
214
+ assert_in_delta( 3.0, t[0], $tolerance )
215
+ assert_in_delta( 6.0, t[1], $tolerance )
216
+ assert_in_delta( 9.0, t[2], $tolerance )
217
+ end
218
+
219
+ def test_scalar_triple_product
220
+ #For class method
221
+ assert_raise( Vector3D::TypeError ){ Vector3D.scalar_triple_product( @v00, @v02, [1.0, 2.0, 3.0] ) }
222
+ assert_raise( Vector3D::TypeError ){ Vector3D.scalar_triple_product( @v00, @v02, Vector[1.0, 2.0, 3.0] ) }
223
+ assert_raise( Vector3D::TypeError ){ Vector3D.scalar_triple_product( @v00, @v02, Vector3DInternal[1.0, 2.0, 3.0] ) }
224
+ assert_raise( Vector3D::TypeError ){ Vector3D.scalar_triple_product( @v00, [1.0, 2.0, 3.0] , @v02 ) }
225
+ assert_raise( Vector3D::TypeError ){ Vector3D.scalar_triple_product( @v00, Vector[1.0, 2.0, 3.0] , @v02 ) }
226
+ assert_raise( Vector3D::TypeError ){ Vector3D.scalar_triple_product( @v00, Vector3DInternal[1.0, 2.0, 3.0], @v02 ) }
227
+ assert_raise( Vector3D::TypeError ){ Vector3D.scalar_triple_product( [1.0, 2.0, 3.0] , @v00, @v02 ) }
228
+ assert_raise( Vector3D::TypeError ){ Vector3D.scalar_triple_product( Vector[1.0, 2.0, 3.0] , @v00, @v02 ) }
229
+ assert_raise( Vector3D::TypeError ){ Vector3D.scalar_triple_product( Vector3DInternal[1.0, 2.0, 3.0], @v00, @v02 ) }
230
+
231
+ assert_in_delta( 0.0, Vector3D.scalar_triple_product( @v00, @v01, @v02), $tolerance )
232
+ assert_in_delta( 1.0, Vector3D.scalar_triple_product( @v00, @v02, @v03), $tolerance )
233
+ assert_in_delta(-1.0, Vector3D.scalar_triple_product( @v00, @v03, @v02), $tolerance )
234
+ assert_in_delta( 0.0, Vector3D.scalar_triple_product( @v00, @v03, @v04), $tolerance )
235
+
236
+ #For instance method
237
+ assert_raise( Vector3D::TypeError ){ @v00.scalar_triple_product( @v02, [1.0, 2.0, 3.0] ) }
238
+ assert_raise( Vector3D::TypeError ){ @v00.scalar_triple_product( @v02, Vector[1.0, 2.0, 3.0] ) }
239
+ assert_raise( Vector3D::TypeError ){ @v00.scalar_triple_product( @v02, Vector3DInternal[1.0, 2.0, 3.0] ) }
240
+ assert_raise( Vector3D::TypeError ){ @v00.scalar_triple_product( [1.0, 2.0, 3.0] , @v02 ) }
241
+ assert_raise( Vector3D::TypeError ){ @v00.scalar_triple_product( Vector[1.0, 2.0, 3.0] , @v02 ) }
242
+ assert_raise( Vector3D::TypeError ){ @v00.scalar_triple_product( Vector3DInternal[1.0, 2.0, 3.0], @v02 ) }
243
+
244
+ assert_in_delta( 0.0, @v00.scalar_triple_product( @v01, @v02), $tolerance )
245
+ assert_in_delta( 1.0, @v00.scalar_triple_product( @v02, @v03), $tolerance )
246
+ assert_in_delta(-1.0, @v00.scalar_triple_product( @v03, @v02), $tolerance )
247
+ assert_in_delta( 0.0, @v00.scalar_triple_product( @v03, @v04), $tolerance )
248
+
249
+ #どれかが Vector3D 以外の、Vector クラスで3要素のものだった場合は例外。
250
+ end
251
+
252
+ def test_angle_radian
253
+ #For class method
254
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_radian( @v00, [1.0, 2.0, 3.0] ) }
255
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_radian( @v00, Vector[1.0, 2.0, 3.0] ) }
256
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_radian( @v00, Vector3DInternal[1.0, 2.0, 3.0] ) }
257
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_radian( [1.0, 2.0, 3.0] , @v00 ) }
258
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_radian( Vector[1.0, 2.0, 3.0] , @v00 ) }
259
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_radian( Vector3DInternal[1.0, 2.0, 3.0], @v00 ) }
260
+ assert_raise( Vector3D::ZeroOperation ) { Vector3D.angle_radian( @v00, @v04) }
261
+
262
+ assert_in_delta( 0.0, Vector3D.angle_radian( @v00, @v01), $tolerance )
263
+ assert_in_delta( PI/2.0, Vector3D.angle_radian( @v00, @v02), $tolerance )
264
+ assert_in_delta( PI/2.0, Vector3D.angle_radian( @v00, @v03), $tolerance )
265
+ assert_in_delta( PI/4.0, Vector3D.angle_radian( @v00, @v05), $tolerance )
266
+
267
+ #For instance method
268
+ assert_raise( Vector3D::TypeError ) { @v00.angle_radian( [1.0, 2.0, 3.0] ) }
269
+ assert_raise( Vector3D::TypeError ) { @v00.angle_radian( Vector[1.0, 2.0, 3.0] ) }
270
+ assert_raise( Vector3D::TypeError ) { @v00.angle_radian( Vector3DInternal[1.0, 2.0, 3.0] ) }
271
+ assert_raise( Vector3D::ZeroOperation ){ @v00.angle_radian( @v04) }
272
+ assert_in_delta( 0.0, @v00.angle_radian( @v01), $tolerance )
273
+ assert_in_delta( PI/2.0, @v00.angle_radian( @v02), $tolerance )
274
+ assert_in_delta( PI/2.0, @v00.angle_radian( @v03), $tolerance )
275
+ assert_in_delta( PI/4.0, @v00.angle_radian( @v05), $tolerance )
276
+
277
+ end
278
+
279
+ def test_angle_degree
280
+ #For class method
281
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_degree( @v00, [1.0, 2.0, 3.0] ) }
282
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_degree( @v00, Vector[1.0, 2.0, 3.0] ) }
283
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_degree( @v00, Vector3DInternal[1.0, 2.0, 3.0] ) }
284
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_degree( [1.0, 2.0, 3.0] , @v00 ) }
285
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_degree( Vector[1.0, 2.0, 3.0] , @v00 ) }
286
+ assert_raise( Vector3D::TypeError ) { Vector3D.angle_degree( Vector3DInternal[1.0, 2.0, 3.0] , @v00 ) }
287
+ assert_raise( Vector3D::ZeroOperation ) { Vector3D.angle_degree( @v00, @v04) }
288
+ assert_in_delta( 0.0, Vector3D.angle_degree( @v00, @v01), $tolerance )
289
+ assert_in_delta( 90.0, Vector3D.angle_degree( @v00, @v02), $tolerance )
290
+ assert_in_delta( 90.0, Vector3D.angle_degree( @v00, @v03), $tolerance )
291
+ assert_in_delta( 45.0, Vector3D.angle_degree( @v00, @v05), $tolerance )
292
+
293
+ #For instance method
294
+ assert_raise( Vector3D::TypeError ) { @v00.angle_degree( [1.0, 2.0, 3.0] ) }
295
+ assert_raise( Vector3D::TypeError ) { @v00.angle_degree( Vector[1.0, 2.0, 3.0] ) }
296
+ assert_raise( Vector3D::TypeError ) { @v00.angle_degree( Vector3DInternal[1.0, 2.0, 3.0] ) }
297
+ assert_raise( Vector3D::ZeroOperation ){ @v00.angle_degree( @v04) }
298
+ assert_in_delta( 0.0, @v00.angle_degree( @v01), $tolerance )
299
+ assert_in_delta( 90.0, @v00.angle_degree( @v02), $tolerance )
300
+ assert_in_delta( 90.0, @v00.angle_degree( @v03), $tolerance )
301
+ assert_in_delta( 45.0, @v00.angle_degree( @v05), $tolerance )
302
+
303
+ #どれかが Vector3D 以外の、Vector クラスで3要素のものだった場合は例外。
304
+ end
305
+
306
+ def test_to_v3di
307
+ array = [ [1.0, 1.0, 1.0], [0.0, 1.0, 1.0], [0.0, 0.0, 1.0] ]
308
+ assert_raise(Vector3D::TypeError){ Vector3D[ 2.0, 5.0, 9.0 ].to_v3di(array) }
309
+
310
+ axes = Axes.new(array)
311
+ t = Vector3D[ 2.0, 5.0, 9.0 ].to_v3di( axes )
312
+ assert_equal( Vector3DInternal, t.class )
313
+ assert_in_delta( 2.0, t[0], $tolerance )
314
+ assert_in_delta( 3.0, t[1], $tolerance )
315
+ assert_in_delta( 4.0, t[2], $tolerance )
316
+ end
317
+
318
+ def test_to_p3d
319
+ vA = Vector3D[ 2.0, 2.0, 2.0]
320
+ vB = Vector3D[ 0.0, 2.0, 2.0]
321
+ vC = Vector3D[ 0.0, 0.0, 2.0]
322
+ vD = Vector3D[-2.0,-2.0,-2.0]
323
+ vE = Vector3D[ 0.0,-2.0,-2.0]
324
+ vF = Vector3D[ 0.0, 0.0,-2.0]
325
+
326
+ assert_in_delta( 2.0*sqrt(3.0) , vA.to_p3d.r , $tolerance )
327
+ assert_in_delta( acos( sqrt(1/3.0) ) , vA.to_p3d.theta, $tolerance )
328
+ assert_in_delta( 0.25*PI , vA.to_p3d.phi , $tolerance )
329
+ assert_in_delta( 2.0*sqrt(2.0) , vB.to_p3d.r , $tolerance )
330
+ assert_in_delta( 0.25*PI , vB.to_p3d.theta, $tolerance )
331
+ assert_in_delta( 0.50*PI , vB.to_p3d.phi , $tolerance )
332
+ assert_in_delta( 2.0 , vC.to_p3d.r , $tolerance )
333
+ assert_in_delta( 0.00*PI , vC.to_p3d.theta, $tolerance )
334
+ assert_in_delta( 0.00*PI , vC.to_p3d.phi , $tolerance )
335
+
336
+ assert_in_delta( 2.0*sqrt(3.0) , vD.to_p3d.r , $tolerance )
337
+ assert_in_delta( 2.0*sqrt(2.0) , vE.to_p3d.r , $tolerance )
338
+ assert_in_delta( 2.0 , vF.to_p3d.r , $tolerance )
339
+
340
+ assert_in_delta( acos(-sqrt(1/3.0) ) , vD.to_p3d.theta, $tolerance )
341
+ assert_in_delta( 0.75*PI , vE.to_p3d.theta, $tolerance )
342
+ assert_in_delta( 1.00*PI , vF.to_p3d.theta, $tolerance )
343
+
344
+ assert_in_delta( 1.25*PI , vD.to_p3d.phi , $tolerance )
345
+ assert_in_delta( 1.50*PI , vE.to_p3d.phi , $tolerance )
346
+ assert_in_delta( 0.00*PI , vF.to_p3d.phi , $tolerance )
347
+ end
348
+
349
+ def test_rotate_axis!
350
+ vA = Vector3D[ 2.0, 2.0, 2.0 ]
351
+ assert_raise( Vector3D::RangeError ){ vA.rotate_axis!( -1, 0.25*PI ) }
352
+ assert_raise( Vector3D::RangeError ){ vA.rotate_axis!( 3, 0.25*PI ) }
353
+
354
+ r8 = sqrt(8.0)
355
+ vA = Vector3D[ 2.0, 2.0, 2.0 ]
356
+
357
+ vA.rotate_axis!( 0, 0.25*PI )
358
+ assert_equal( Vector3D , vA.class )
359
+
360
+ vA = Vector3D[ 2.0, 2.0, 2.0 ]
361
+ vA.rotate_axis!( 0, 0.25*PI )
362
+ assert_in_delta( 2.0, vA[0], $tolerance )
363
+ assert_in_delta( 0.0, vA[1], $tolerance )
364
+ assert_in_delta( r8 , vA[2], $tolerance )
365
+
366
+ vA = Vector3D[ 2.0, 2.0, 2.0 ]
367
+ vA.rotate_axis!( 1, 0.25*PI )
368
+ assert_in_delta( r8 , vA[0], $tolerance )
369
+ assert_in_delta( 2.0, vA[1], $tolerance )
370
+ assert_in_delta( 0.0, vA[2], $tolerance )
371
+
372
+ vA = Vector3D[ 2.0, 2.0, 2.0 ]
373
+ vA.rotate_axis!( 2, 0.25*PI )
374
+ assert_in_delta( 0.0, vA[0], $tolerance )
375
+ assert_in_delta( r8 , vA[1], $tolerance )
376
+ assert_in_delta( 2.0, vA[2], $tolerance )
377
+
378
+ vA = Vector3D[ 2.0, 2.0, 2.0 ]
379
+ vA.rotate_axis!( 0, -0.25*PI )
380
+ assert_in_delta( 2.0, vA[0], $tolerance )
381
+ assert_in_delta( r8 , vA[1], $tolerance )
382
+ assert_in_delta( 0.0, vA[2], $tolerance )
383
+
384
+ vA = Vector3D[ 2.0, 2.0, 2.0 ]
385
+ vA.rotate_axis!( 1, -0.25*PI )
386
+ assert_in_delta( 0.0, vA[0], $tolerance )
387
+ assert_in_delta( 2.0, vA[1], $tolerance )
388
+ assert_in_delta( r8 , vA[2], $tolerance )
389
+
390
+ vA = Vector3D[ 2.0, 2.0, 2.0 ]
391
+ vA.rotate_axis!( 2, -0.25*PI )
392
+ assert_in_delta( r8 , vA[0], $tolerance )
393
+ assert_in_delta( 0.0, vA[1], $tolerance )
394
+ assert_in_delta( 2.0, vA[2], $tolerance )
395
+ end
396
+
397
+ def test_rotate_axis
398
+ vA = Vector3D[ 2.0, 2.0, 2.0 ]
399
+ assert_raise( Vector3D::RangeError ){ vA.rotate_axis( -1, 0.25*PI ) }
400
+ assert_raise( Vector3D::RangeError ){ vA.rotate_axis( 3, 0.25*PI ) }
401
+
402
+ r8 = sqrt(8.0)
403
+ assert_equal( Vector3D , vA.rotate_axis( 0, 0.25*PI ).class )
404
+ assert_equal( Vector3D , vA.rotate_axis( 1, 0.25*PI ).class )
405
+ assert_equal( Vector3D , vA.rotate_axis( 2, 0.25*PI ).class )
406
+
407
+ assert_in_delta( 2.0, vA.rotate_axis( 0, 0.25*PI )[0], $tolerance )
408
+ assert_in_delta( 0.0, vA.rotate_axis( 0, 0.25*PI )[1], $tolerance )
409
+ assert_in_delta( r8 , vA.rotate_axis( 0, 0.25*PI )[2], $tolerance )
410
+ assert_in_delta( r8 , vA.rotate_axis( 1, 0.25*PI )[0], $tolerance )
411
+ assert_in_delta( 2.0, vA.rotate_axis( 1, 0.25*PI )[1], $tolerance )
412
+ assert_in_delta( 0.0, vA.rotate_axis( 1, 0.25*PI )[2], $tolerance )
413
+ assert_in_delta( 0.0, vA.rotate_axis( 2, 0.25*PI )[0], $tolerance )
414
+ assert_in_delta( r8 , vA.rotate_axis( 2, 0.25*PI )[1], $tolerance )
415
+ assert_in_delta( 2.0, vA.rotate_axis( 2, 0.25*PI )[2], $tolerance )
416
+
417
+ assert_in_delta( 2.0, vA.rotate_axis( 0, -0.25*PI )[0], $tolerance )
418
+ assert_in_delta( r8 , vA.rotate_axis( 0, -0.25*PI )[1], $tolerance )
419
+ assert_in_delta( 0.0, vA.rotate_axis( 0, -0.25*PI )[2], $tolerance )
420
+ assert_in_delta( 0.0, vA.rotate_axis( 1, -0.25*PI )[0], $tolerance )
421
+ assert_in_delta( 2.0, vA.rotate_axis( 1, -0.25*PI )[1], $tolerance )
422
+ assert_in_delta( r8 , vA.rotate_axis( 1, -0.25*PI )[2], $tolerance )
423
+ assert_in_delta( r8 , vA.rotate_axis( 2, -0.25*PI )[0], $tolerance )
424
+ assert_in_delta( 0.0, vA.rotate_axis( 2, -0.25*PI )[1], $tolerance )
425
+ assert_in_delta( 2.0, vA.rotate_axis( 2, -0.25*PI )[2], $tolerance )
426
+ end
427
+
428
+ end
429
+