mageo 0.0.0 → 0.0.1

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