Skip to content

Commit 5e01a2b

Browse files
authored
Merge pull request #13 from rchristie/distance
Add magnitude/distance squared functions
2 parents b00bd4a + 4b90562 commit 5e01a2b

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

src/cmlibs/maths/vectorops.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ def magnitude(v):
1313
return sqrt(sum(c * c for c in v))
1414

1515

16+
def magnitude_squared(v):
17+
"""
18+
return: Squared scalar magnitude of vector v, avoiding sqrt().
19+
"""
20+
return sum(c * c for c in v)
21+
22+
1623
def set_magnitude(v, mag):
1724
"""
1825
return: Vector v with magnitude set to mag.
@@ -29,6 +36,32 @@ def sub(u, v):
2936
return [u_i - v_i for u_i, v_i in zip(u, v)]
3037

3138

39+
def distance(u, v):
40+
"""
41+
:param u: Vector.
42+
:param v: Vector.
43+
:return: Scalar Euclidean distance between two points.
44+
"""
45+
value = 0.0
46+
for u_i, v_i in zip(u, v):
47+
w = u_i - v_i
48+
value += w * w
49+
return sqrt(value)
50+
51+
52+
def distance_squared(u, v):
53+
"""
54+
:param u: Vector.
55+
:param v: Vector.
56+
:return: Scalar squared Euclidean distance between points, avoiding sqrt().
57+
"""
58+
value = 0.0
59+
for u_i, v_i in zip(u, v):
60+
w = u_i - v_i
61+
value += w * w
62+
return value
63+
64+
3265
def mult(v, s):
3366
"""
3467
Calculate s * v

tests/test_vectorops.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import unittest
2+
from math import sqrt
3+
4+
from cmlibs.maths.vectorops import distance, distance_squared, magnitude, magnitude_squared
5+
6+
7+
class VectorOpsTestCase(unittest.TestCase):
8+
9+
def test_magnitude(self):
10+
v = [1.0, 2.0, -3.0]
11+
expected_magnitude_squared = 14.0
12+
expected_magnitude = sqrt(expected_magnitude_squared)
13+
14+
TOL = 1.0E-14
15+
self.assertAlmostEqual(magnitude(v), expected_magnitude, delta=TOL)
16+
self.assertAlmostEqual(magnitude_squared(v), expected_magnitude_squared, delta=TOL)
17+
18+
def test_distance(self):
19+
u = [0.5, -0.1, 0.8]
20+
v = [1.5, -2.1, 3.8]
21+
expected_distance_squared = 14.0
22+
expected_distance = sqrt(expected_distance_squared)
23+
24+
TOL = 1.0E-14
25+
self.assertAlmostEqual(distance(u, v), expected_distance, delta=TOL)
26+
self.assertAlmostEqual(distance_squared(u, v), expected_distance_squared, delta=TOL)
27+
28+
29+
if __name__ == "__main__":
30+
unittest.main()

0 commit comments

Comments
 (0)