diff --git a/src/geomtree/affine_transform.py b/src/geomtree/affine_transform.py index c4bcd205de0398d6efb5fdfc0a4c4b865ff4b1ca..a956a340da068dd8f107fa21916bde9d1d84ea18 100644 --- a/src/geomtree/affine_transform.py +++ b/src/geomtree/affine_transform.py @@ -95,12 +95,12 @@ class AffineTransform(object): from visu_core.vtk.actor import vtk_actor from visu_core.vtk.polydata import face_scalar_property_polydata - #TODO : doc + correct scale (in visu_core) + #TODO : doc qr = np.sqrt(chi2.ppf(alpha, 3)) T = self.linear u,s,_ = svd(T @ T.T) tensor = u @ np.diag(np.sqrt(s)) @ u.T - actors = [ellipsoid_primitive(self.translation,tensor, opacity=opacity, scale=2*qr, color=color)] + actors = [ellipsoid_primitive(self.translation,tensor, opacity=opacity, scale=qr, color=color)] if axis==True: actors+=[affine_frame_primitive(origin=self.translation, axes=qr * self.linear.T, lw=5)] if box==True: @@ -229,6 +229,7 @@ def geometric_distance(tf1,tf2,alpha=0.95,epsilon=1e-6,view=True): #wip # Algo from "On the distance between two ellipsoids" by A. Lin and S.-P. Han import sys + import time def coeff(tf, c1, c2, alpha): T = inv(tf.linear) @@ -261,11 +262,14 @@ def geometric_distance(tf1,tf2,alpha=0.95,epsilon=1e-6,view=True): #wip ### Main step i=1 while True: - t1 = max([i for i in np.roots(coeff(tf1, c1, c2,alpha)) if 0 <= i <= 1]) - t2 = min([i for i in np.roots(coeff(tf2, c1, c2,alpha)) if 0 <= i <= 1]) + s1 = [i for i in np.roots(coeff(tf1, c1, c2,alpha)) if 0 <= i <= 1] + s2 = [i for i in np.roots(coeff(tf2, c1, c2,alpha)) if 0 <= i <= 1] + + t1 = max(s1) if len(s1)>0 else 1 + t2 = min(s2) if len(s2)>0 else 0 if t2<t1: - print('\n') + #print('\n') return 0 if view: @@ -292,7 +296,7 @@ def geometric_distance(tf1,tf2,alpha=0.95,epsilon=1e-6,view=True): #wip theta2 = angle(xbar - ybar, quadratic(tf2, ybar)) if theta1<epsilon and theta2<epsilon: - print('\n') + #print('\n') return norm(xbar-ybar) gamma1 = 1 / norm(inv( @@ -314,5 +318,40 @@ def geometric_distance(tf1,tf2,alpha=0.95,epsilon=1e-6,view=True): #wip actors += tfb1.get_actor(color='b', alpha=chi2.cdf(1, 3)) + tfb2.get_actor(color='b', alpha=chi2.cdf(1,3)) + pcb.get_actor(color='b', glyph='sphere', scale=0.05) + [segment_primitive(c1, c2, color='#808080', lw=1)] display(actors) - sys.stdout.write('\r Iteration : %i | Angles: %i, %i' % (i,theta1,theta2)) - i+=1 \ No newline at end of file + #sys.stdout.write('\rIteration : %i | Angles: %.6f, %.6f' % (i,theta1,theta2)) + i+=1 + +# from geomtree import * +# from visu_core.vtk.actor import vtk_display_actors as display +# +# tf1 = random_transform() +# tf2 = random_transform() +# +# #display(tf1.get_actor()+tf2.get_actor()) +# +# print(geometric_distance(tf1,tf2,alpha=0.95,epsilon=1e-6,view=False)) +# print('#-------------------#') +# +# tf1 = AffineTransform() +# tf1.set_parameters(translation= np.array([2.86820768,3.89143435,4.33672974]),linear=np.array([[-0.55153873,-0.16148895,-0.00088868],[-0.3521366,0.21171356,-0.01869735],[ 0.16406091, -0.08847516, -0.04311911]])) +# +# tf2 = AffineTransform() +# tf2.set_parameters(translation=np.array([3.76642489, 3.60659314, 5.1294022 ]),linear=np.array([[-0.60064044, -0.02037255, 0.02495534],[-0.02739907, -0.03648569, -0.40604146],[ 0.05979144, -0.22137366, 0.06462512]])) +# +# display(tf1.get_actor()+tf2.get_actor()) +# +# print(geometric_distance(tf1,tf2,alpha=0.95,epsilon=1e-6,view=False)) +# print('#-------------------#') +# +# tf1 = AffineTransform() +# tf2 = AffineTransform() +# tf2.set_parameters(np.array([1, 5, 8]), np.diag([1, 2, 3])) +# +# display(tf1.get_actor()+tf2.get_actor()) +# +# print(geometric_distance(tf1,tf2,alpha=0.95,epsilon=1e-6,view=True)) +# print('#-------------------#') + + + +