Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 1c8f9603 authored by INGELS Florian's avatar INGELS Florian
Browse files

Implementation of geometric distance OK, still some refactoring / doc to do

parent 7bb07de3
No related branches found
No related tags found
No related merge requests found
......@@ -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('#-------------------#')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment