v / vlib / math / vec / vec3_test.v
156 lines · 136 sloc · 3.44 KB · a8a5e80f416a09fa60279eea521351a54451bb40
Raw
1import math { tolerance, veryclose }
2import math.vec
3
4fn test_vec3_int() {
5 mut v1 := vec.vec3(0, 0, 0)
6 mut v2 := vec.vec3(0, 0, 0)
7 assert v1 == v2
8 v1.one()
9 v2.one()
10 assert v1.x == 1
11 assert v1.y == 1
12 assert v1.z == 1
13 assert v1 == v2
14
15 v3 := v1 + v2
16 assert typeof(v3).name == 'vec.Vec3[int]'
17 assert v3.x == 2
18 assert v3.y == 2
19 assert v3.z == 2
20}
21
22fn test_vec3_f32() {
23 mut v1 := vec.vec3(f32(0), 0, 0)
24 mut v2 := vec.vec3(f32(0), 0, 0)
25 assert v1 == v2
26 v1.one()
27 v2.one()
28 assert v1.x == 1
29 assert v1.y == 1
30 assert v1.z == 1
31 assert v1 == v2
32
33 v3 := v1 + v2
34 assert typeof(v3).name == 'vec.Vec3[f32]'
35 assert v3.x == 2
36 assert v3.y == 2
37 assert v3.z == 2
38}
39
40fn test_vec3_f64() {
41 mut v1 := vec.vec3(0.0, 0, 0)
42 mut v2 := vec.vec3(0.0, 0, 0)
43 assert v1 == v2
44 v1.one()
45 v2.one()
46 assert v1.x == 1
47 assert v1.y == 1
48 assert v1.z == 1
49 assert v1 == v2
50
51 v3 := v1 + v2
52 assert typeof(v3).name == 'vec.Vec3[f64]'
53 assert v3.x == 2
54 assert v3.y == 2
55 assert v3.z == 2
56}
57
58fn test_vec3_f64_utils_1() {
59 mut v1 := vec.vec3(2.0, 3.0, 1.5)
60 mut v2 := vec.vec3(1.0, 4.0, 1.5)
61
62 mut zv := vec.vec3(5.0, 5.0, 5.0)
63 zv.zero()
64
65 v3 := v1 + v2
66 assert v3.x == 3
67 assert v3.y == 7
68 assert v3.z == 3
69
70 v1l := vec.vec3(6.0, 2.0, -3.0)
71 assert v1l.magnitude() == 7
72
73 mut ctv1 := vec.vec3(0.000001, 0.000001, 0.000001)
74 ctv1.clean_tolerance(0.00001)
75 assert ctv1 == zv
76}
77
78fn test_vec3_f64_utils_2() {
79 mut v1 := vec.vec3(4.0, 4.0, 8.0)
80 assert v1.unit().magnitude() == 1
81 v2 := v1.mul_scalar(0.5)
82 assert v2.x == 2
83 assert v2.y == 2
84 assert v2.z == 4
85 assert v2.unit().magnitude() == 1
86
87 invv2 := v2.inv()
88 assert invv2.x == 0.5
89 assert invv2.y == 0.5
90 assert invv2.z == 0.25
91}
92
93// sample tests for vec3 projection
94fn test_vec3_project_onto_basic() {
95 v := vec.vec3(5.0, 6.0, 0.0) // magnitude ~7.81 vector
96 u := vec.vec3(3.0, 4.0, 0.0) // magnitude 5 vector
97 // hand-computed:
98 // v·u = 5*3 + 6*4 + 0*0 = 39
99 // |u|^2 = 3^2 + 4^2 +0^2 = 25
100 // scale = 39/25 = 1.56
101 // proj = scale * u = (1.56*3, 1.56*4, 1.56*0) = (4.68, 6.24, 0)
102 proj := v.project(u)
103 assert veryclose(proj.x, 4.68)
104 assert veryclose(proj.y, 6.24)
105 assert veryclose(proj.z, 0.0)
106}
107
108// Test for Vec3 projection onto zero vector
109//
110fn test_vec3_project_onto_zero() {
111 v := vec.vec3(0.0, 0.0, 0.0)
112 u := vec.vec3(3.0, 4.0, 0.0)
113 proj := v.project(u)
114 assert proj.x == 0.0
115 assert proj.y == 0.0
116 assert proj.z == 0.0
117}
118
119// Test for vec3 projection at an angle
120//
121fn test_vec3_project_onto_angle() {
122 v := vec.vec3(1.0, 1.0, 0.0) // magnitude sqrt(2) vector
123 u := vec.vec3(1.0, 0.0, 0.0) // magnitude 1 vector
124 // hand-computed:
125 // v·u = 1*1 + 1*0 + 0*0 = 1
126 // |u|^2 = 1^2 + 0^2 +0^2 = 1
127 // scale = 1/1 = 1
128 // proj = scale * u = (1*1, 1*0, 1*0) = (1, 0, 0)
129 proj := v.project(u)
130 assert veryclose(proj.x, 1.0)
131 assert veryclose(proj.y, 0.0)
132 assert veryclose(proj.z, 0.0)
133}
134
135// Test for perpendicularity
136// 'u' and 'v' are already perpendicular so it must return v
137fn test_vec3_perpendicularity_angle() {
138 u := vec.vec3(1.0, 0.0, 0.0)
139 v := vec.vec3(0.0, 3.0, 2.0)
140
141 per := v.perpendicular(u)
142 assert tolerance(per.x, v.x, vec.vec_epsilon)
143 assert tolerance(per.y, v.y, vec.vec_epsilon)
144 assert tolerance(per.z, v.z, vec.vec_epsilon)
145}
146
147// 'u' and 'v' are collinear so the result must be the null vector
148fn test_vec3_collinear() {
149 u := vec.vec3(1.0, 0.0, 0.0)
150 v := vec.vec3(3.0, 0.0, 0.0)
151
152 per := v.perpendicular(u)
153 assert tolerance(per.x, 0.0, vec.vec_epsilon)
154 assert tolerance(per.y, 0.0, vec.vec_epsilon)
155 assert tolerance(per.z, 0.0, vec.vec_epsilon)
156}
157