@@ -60,3 +60,36 @@ def test_triangulation_find_opposing_vertices_raises_if_simplex_is_invalid():
6060
6161 with pytest .raises (ValueError ):
6262 tri .get_opposing_vertices ((2 , 3 , 5 ))
63+
64+
65+ def test_circumsphere ():
66+ """ Test that circumsphere works correctly for a random center and random points on a sphere """
67+ from adaptive .learner .triangulation import circumsphere , fast_norm
68+ from numpy import allclose
69+ from numpy .random import normal , uniform
70+ center_diff_err = "Calculated center [%s] differs from true center [%s]\n "
71+
72+ def generate_random_sphere_points (dim , radius = 0 ):
73+ """ Refer to https://math.stackexchange.com/a/1585996 """
74+
75+ vec = [None ] * (dim + 1 )
76+ center = uniform (- 100 , 100 , dim )
77+ radius = uniform (1.0 , 100.0 ) if radius == 0 else radius
78+ for i in range (dim + 1 ):
79+ points = normal (0 , size = dim )
80+ x = fast_norm (points )
81+ points = points / x * radius
82+ vec [i ] = tuple (points + center )
83+
84+ return radius , center , vec
85+
86+ for dim in range (2 , 10 ):
87+ radius , center , points = generate_random_sphere_points (dim )
88+ circ_center , circ_radius = circumsphere (points )
89+ err_msg = ""
90+ if not allclose (circ_center , center ):
91+ err_msg += center_diff_err % ("," .join ([str (x ) for x in circ_center ]), "," .join ([str (x ) for x in center ]))
92+ if not allclose (radius , circ_radius ):
93+ err_msg += "Calculated radius %s differs from true radius %s" % (circ_radius , radius )
94+ if err_msg :
95+ raise AssertionError (err_msg )
0 commit comments