Skip to content

Commit a8a5e80

Browse files
authored
math.vec: add tests for vec2,3,4 perpendicular (#25840)
1 parent c3e0637 commit a8a5e80

File tree

6 files changed

+74
-4
lines changed

6 files changed

+74
-4
lines changed

vlib/math/vec/vec2.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ pub fn (v Vec2[T]) perp_ccw() Vec2[T] {
258258
return Vec2[T]{-v.y, v.x}
259259
}
260260

261-
// perpendicular returns the `u` projected perpendicular vector to this vector.
261+
// perpendicular returns the `v` projected perpendicular vector to the 'u' vector.
262262
pub fn (v Vec2[T]) perpendicular(u Vec2[T]) Vec2[T] {
263263
return v - v.project(u)
264264
}

vlib/math/vec/vec2_test.v

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,3 +299,24 @@ fn test_vec2_project_negative_components() {
299299
assert tolerance(proj.x, 4.68, vec.vec_epsilon)
300300
assert tolerance(proj.y, -6.24, vec.vec_epsilon)
301301
}
302+
303+
// Test for perpendicularity
304+
// 'u' and 'v' are already perpendicular so it must return v
305+
fn test_vec2_perpendicularity_angle() {
306+
u := vec.vec2(1.0, 0.0)
307+
v := vec.vec2(0.0, 3.0)
308+
309+
per := v.perpendicular(u)
310+
assert tolerance(per.x, v.x, vec.vec_epsilon)
311+
assert tolerance(per.y, v.y, vec.vec_epsilon)
312+
}
313+
314+
// 'u' and 'v' are collinear so it must return the null vector
315+
fn test_vec2_collinear() {
316+
u := vec.vec2(1.0, 0.0)
317+
v := vec.vec2(3.0, 0.0)
318+
319+
per := v.perpendicular(u)
320+
assert tolerance(per.x, 0.0, vec.vec_epsilon)
321+
assert tolerance(per.y, 0.0, vec.vec_epsilon)
322+
}

vlib/math/vec/vec3.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ pub fn (v Vec3[T]) unit() Vec3[T] {
253253
return Vec3[T]{v.x * invm, v.y * invm, v.z * invm}
254254
}
255255

256-
// perpendicular returns the `u` projected perpendicular vector to this vector.
256+
// perpendicular returns the `v` projected perpendicular vector to the 'u' vector.
257257
@[inline]
258258
pub fn (v Vec3[T]) perpendicular(u Vec3[T]) Vec3[T] {
259259
return v - v.project(u)

vlib/math/vec/vec3_test.v

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import math { veryclose }
1+
import math { tolerance, veryclose }
22
import math.vec
33

44
fn test_vec3_int() {
@@ -131,3 +131,26 @@ fn test_vec3_project_onto_angle() {
131131
assert veryclose(proj.y, 0.0)
132132
assert veryclose(proj.z, 0.0)
133133
}
134+
135+
// Test for perpendicularity
136+
// 'u' and 'v' are already perpendicular so it must return v
137+
fn 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
148+
fn 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+
}

vlib/math/vec/vec4.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ pub fn (v Vec4[T]) unit() Vec4[T] {
270270
}
271271
}
272272

273-
// perpendicular returns the `u` projected perpendicular vector to this vector.
273+
// perpendicular returns the `v` projected perpendicular vector to the 'u' vector.
274274
pub fn (v Vec4[T]) perpendicular(u Vec4[T]) Vec4[T] {
275275
return v - v.project(u)
276276
}

vlib/math/vec/vec4_test.v

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import math { tolerance }
12
import math.vec
23

34
fn test_vec4_int() {
@@ -123,3 +124,28 @@ fn test_vec4_project_onto_zero() {
123124
assert proj.z == 0.0
124125
assert proj.w == 0.0
125126
}
127+
128+
// Test for perpendicularity
129+
// 'u' and 'v' are already perpendicular so it must return v
130+
fn test_vec4_perpendicularity_angle() {
131+
u := vec.vec4(1.0, 0.0, 0.0, 0.0)
132+
v := vec.vec4(0.0, 3.0, 2.0, 0.0)
133+
134+
per := v.perpendicular(u)
135+
assert tolerance(per.x, v.x, vec.vec_epsilon)
136+
assert tolerance(per.y, v.y, vec.vec_epsilon)
137+
assert tolerance(per.z, v.z, vec.vec_epsilon)
138+
assert tolerance(per.w, v.w, vec.vec_epsilon)
139+
}
140+
141+
// 'u' and 'v' are collinear so it must return the null vector
142+
fn test_vec4_collinear() {
143+
u := vec.vec4(1.0, 0.0, 0.0, 0.0)
144+
v := vec.vec4(3.0, 0.0, 0.0, 0.0)
145+
146+
per := v.perpendicular(u)
147+
assert tolerance(per.x, 0.0, vec.vec_epsilon)
148+
assert tolerance(per.y, 0.0, vec.vec_epsilon)
149+
assert tolerance(per.z, 0.0, vec.vec_epsilon)
150+
assert tolerance(per.w, 0.0, vec.vec_epsilon)
151+
}

0 commit comments

Comments
 (0)