]> Creatis software - creaVtk.git/commitdiff
New functionality, obtain the angles of the vector from a heart image.
authorctorres <carlos.torres@creatis.insa-lyon.fr>
Wed, 20 Nov 2013 14:29:09 +0000 (15:29 +0100)
committerctorres <carlos.torres@creatis.insa-lyon.fr>
Wed, 20 Nov 2013 14:29:09 +0000 (15:29 +0100)
lib/creaVtk/creaVtkHeartAngles.cpp [new file with mode: 0644]
lib/creaVtk/creaVtkHeartAngles.cpp~ [new file with mode: 0644]
lib/creaVtk/creaVtkHeartAngles.h [new file with mode: 0644]
lib/creaVtk/creaVtkHeartAngles.h~ [new file with mode: 0644]

diff --git a/lib/creaVtk/creaVtkHeartAngles.cpp b/lib/creaVtk/creaVtkHeartAngles.cpp
new file mode 100644 (file)
index 0000000..a51007a
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+# ---------------------------------------------------------------------
+#
+# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+#                        pour la Sante)
+# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+# Previous Authors : Laurent Guigues, Jean-Pierre Roux
+# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+#
+#  This software is governed by the CeCILL-B license under French law and
+#  abiding by the rules of distribution of free software. You can  use,
+#  modify and/ or redistribute the software under the terms of the CeCILL-B
+#  license as circulated by CEA, CNRS and INRIA at the following URL
+#  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+#  or in the file LICENSE.txt.
+#
+#  As a counterpart to the access to the source code and  rights to copy,
+#  modify and redistribute granted by the license, users are provided only
+#  with a limited warranty  and the software's author,  the holder of the
+#  economic rights,  and the successive licensors  have only  limited
+#  liability.
+#
+#  The fact that you are presently reading this means that you have had
+#  knowledge of the CeCILL-B license and that you accept its terms.
+# ------------------------------------------------------------------------
+*/
+
+#include "creaVtkHeartAngles.h"
+#include <math.h>
+#include <iostream>
+
+creaVtkHeartAngles::creaVtkHeartAngles()
+{
+}
+
+creaVtkHeartAngles::~creaVtkHeartAngles()
+{
+}
+
+double creaVtkHeartAngles::alpha (double P0a, double P0b,double P0c, double vx, double vy, double vz, double vxp, double vyp, double vzp)
+{
+       double a=P0a,b=P0b,c=P0c;
+       double x=vx,y=vy,z=vz;
+       double xp=vxp,yp=vyp,zp=vzp;
+       double alpha;
+
+//Calcular el ángulo que forman las rectas, sabiendo sus vectores directores.
+       double cosAlpha = ( ( (x-a)*(xp-a) )+( (y-b)*(yp-b) )+( (z-c)*(zp-c) ) )/sqrt((( (pow(x,2.0)-pow(a,2.0)) + (pow(y,2.0)-pow(b,2.0)) + (pow(z,2.0)-pow(c,2.0)) )*( (pow(xp,2.0)-pow(a,2.0)) + (pow(yp,2.0)-pow(b,2.0)) + (pow(zp,2.0)-pow(c,2.0)) ) ));
+       
+       alpha = (180 * acos(fabs(cosAlpha)))/M_PI;
+       //std::cout << "Angulo Alpha: " << alpha << std::endl; 
+       double ent = floor(alpha);
+       double al = alpha - ent;
+       double min = al * 60;
+       //std::cout << "minutos: " << min << std::endl;
+       std::cout << "Grados: "<< ent <<" minutos: " << floor(min) << std::endl;
+       return alpha;
+}
+
+double creaVtkHeartAngles::beta (double P0a, double P0b,double P0c, double P3x, double P3y, double P3z, double P4x, double P4y, double P4z)
+{
+       double a=P0a,b=P0b,c=P0c;
+       double x=P3x,y=P3y,z=P3z;
+       double xp=P4x,yp=P4y,zp=P4z;
+       double beta;
+
+//Calcular el ángulo que forman las rectas, sabiendo sus vectores directores.
+       double cosBeta = ( ( (x-a)*(xp-a) )+( (y-b)*(yp-b) )+( (z-c)*(zp-c) ) )/sqrt((( (pow(x,2.0)-pow(a,2.0)) + (pow(y,2.0)-pow(b,2.0)) + (pow(z,2.0)-pow(c,2.0)) )*( (pow(xp,2.0)-pow(a,2.0)) + (pow(yp,2.0)-pow(b,2.0)) + (pow(zp,2.0)-pow(c,2.0)) ) ));
+       
+       beta = (180 * acos(fabs(cosBeta)))/M_PI;
+       //std::cout << "Angulo Beta: " << beta << std::endl; 
+       double ent = floor(beta);
+       double al = beta - ent;
+       double min = al * 60;
+       //std::cout << "minutos: " << min << std::endl;
+       std::cout << "Grados: "<< ent <<" minutos: " << floor(min) << std::endl;
+       return beta;
+}
+
+double * creaVtkHeartAngles::vectorProjection (double plX, double plY, double plZ, double nX, double nY, double nZ, double vX, double vY, double vZ)
+{
+       //punto del plano
+       double plx=plX, ply=plY, plz=plZ;
+       //normalPlano
+       double nx=nX, ny=nY, nz=nZ;
+       //vector V
+       double vx=vX, vy=vY, vz=vZ;
+
+       //distancia del punto al plano
+       double dist;
+       //vector proyectado     
+       double vpx, vpy, vpz;
+       double proj [3];
+       
+       dist = ply - vy;
+       //std::cout << dist << std
+       vpx = vx - (dist * nx);
+       vpy = vy - (dist * ny);
+       vpz = vz - (dist * nz);
+       
+       proj[0]=vpx;
+       proj[1]=vpy;
+       proj[2]=vpz;
+
+       return proj;
+}
+
+double *creaVtkHeartAngles::intersectionPlaneLine(double plx1, double ply1, double plz1, double plx2, double ply2, double plz2, double plx3, double ply3, double plz3, double px1, double py1, double pz1,double px2, double py2, double pz2)
+{
+       double puntoCorte[3];
+
+       double Plx1 = plx1, Ply1 = ply1, Plz1 = plz1, Plx2 = plx2, Ply2 = ply2, Plz2 = plz2, Plx3 = plx3, Ply3 = ply3, Plz3 = plz3;
+       double Px1 = px1, Py1 = py1, Pz1 = pz1, Px2 = px2, Py2 = py2, Pz2 = pz2;
+
+       //Calculo del plano
+
+       double aX = ((Ply2-Ply1)*(Plz3-Plz1)-(Ply3-Ply1)*(Plz2-Plz1));
+       double a = (Plx1)*((Ply2-Ply1)*(Plz3-Plz1)-(Ply3-Ply1)*(Plz2-Plz1));
+
+       double bX = ((Plx2-Plx1)*(Plz3-Plz1)-(Plx3-Plx1)*(Plz2-Plz1));
+       double b = (Ply1)*((Plx2-Plx1)*(Plz3-Plz1)-(Plx3-Plx1)*(Plz2-Plz1));
+
+       double cX = ((Plx2-Plx1)*(Ply3-Ply1)-(Plx3-Plx1)*(Ply2-Ply1));
+       double c = (Plz1)*((Plx2-Plx1)*(Ply3-Ply1)-(Plx3-Plx1)*(Ply2-Ply1));
+
+       double r = a + b + c;
+       std::cout << "ecuacion: " << aX << "," << a << "," << bX << "," << b << "," << cX << "," << c << std::endl;
+       std::cout << "r: " << r << std::endl;
+
+       //Calculo del vector director
+       
+       double vdirx = Px2 - Px1;
+       double vdiry = Py2 - Py1;
+       double vdirz = Pz2 - Pz1;
+       
+       std::cout << "vdirx: " << vdirx << " vdiry: " << vdiry << " vdirz: " << vdirz << std::endl;     
+
+       //Se igualan las formulas del plano y la recta
+       //x=Px1+vdirx, y=Py1+vdiry, z=Pz1+vdirz
+       
+       double eRes = aX*Px1 + bX*Py1 + cX*Pz1;
+       double eResT = aX*vdirx + bX*vdiry + cX*vdirz;
+       std::cout << "eRes: " << eRes << " eResT: " << eResT << std::endl;
+       //Calculo del punto solucion
+       if(eResT == 0){
+               std::cout << "Soluciones infinitas... " << std::endl;
+       }
+       else {
+               double t = (((-1)*eRes)-r)/eResT;
+
+               double Px = Px1 + (t * vdirx);
+               double Py = Py1 + (t * vdiry);
+               double Pz = Pz1 + (t * vdirz);  
+
+               std::cout << "px: " << Px << " py: " << Py << " pz: " << Pz << std::endl;       
+       
+               puntoCorte[0] = Px;
+               puntoCorte[1] = Py;
+               puntoCorte[2] = Pz;
+       }
+       return puntoCorte;
+}
+
+//---------------------------------------------
+//Method template
+//---------------------------------------------
+/*
+void creaVtkHeartAngles::FunctionName(int& parameterA)
+{
+  parameterA = 2 * parameterA;
+  return;
+}
+*/
diff --git a/lib/creaVtk/creaVtkHeartAngles.cpp~ b/lib/creaVtk/creaVtkHeartAngles.cpp~
new file mode 100644 (file)
index 0000000..a51007a
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+# ---------------------------------------------------------------------
+#
+# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+#                        pour la Sante)
+# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+# Previous Authors : Laurent Guigues, Jean-Pierre Roux
+# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+#
+#  This software is governed by the CeCILL-B license under French law and
+#  abiding by the rules of distribution of free software. You can  use,
+#  modify and/ or redistribute the software under the terms of the CeCILL-B
+#  license as circulated by CEA, CNRS and INRIA at the following URL
+#  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+#  or in the file LICENSE.txt.
+#
+#  As a counterpart to the access to the source code and  rights to copy,
+#  modify and redistribute granted by the license, users are provided only
+#  with a limited warranty  and the software's author,  the holder of the
+#  economic rights,  and the successive licensors  have only  limited
+#  liability.
+#
+#  The fact that you are presently reading this means that you have had
+#  knowledge of the CeCILL-B license and that you accept its terms.
+# ------------------------------------------------------------------------
+*/
+
+#include "creaVtkHeartAngles.h"
+#include <math.h>
+#include <iostream>
+
+creaVtkHeartAngles::creaVtkHeartAngles()
+{
+}
+
+creaVtkHeartAngles::~creaVtkHeartAngles()
+{
+}
+
+double creaVtkHeartAngles::alpha (double P0a, double P0b,double P0c, double vx, double vy, double vz, double vxp, double vyp, double vzp)
+{
+       double a=P0a,b=P0b,c=P0c;
+       double x=vx,y=vy,z=vz;
+       double xp=vxp,yp=vyp,zp=vzp;
+       double alpha;
+
+//Calcular el ángulo que forman las rectas, sabiendo sus vectores directores.
+       double cosAlpha = ( ( (x-a)*(xp-a) )+( (y-b)*(yp-b) )+( (z-c)*(zp-c) ) )/sqrt((( (pow(x,2.0)-pow(a,2.0)) + (pow(y,2.0)-pow(b,2.0)) + (pow(z,2.0)-pow(c,2.0)) )*( (pow(xp,2.0)-pow(a,2.0)) + (pow(yp,2.0)-pow(b,2.0)) + (pow(zp,2.0)-pow(c,2.0)) ) ));
+       
+       alpha = (180 * acos(fabs(cosAlpha)))/M_PI;
+       //std::cout << "Angulo Alpha: " << alpha << std::endl; 
+       double ent = floor(alpha);
+       double al = alpha - ent;
+       double min = al * 60;
+       //std::cout << "minutos: " << min << std::endl;
+       std::cout << "Grados: "<< ent <<" minutos: " << floor(min) << std::endl;
+       return alpha;
+}
+
+double creaVtkHeartAngles::beta (double P0a, double P0b,double P0c, double P3x, double P3y, double P3z, double P4x, double P4y, double P4z)
+{
+       double a=P0a,b=P0b,c=P0c;
+       double x=P3x,y=P3y,z=P3z;
+       double xp=P4x,yp=P4y,zp=P4z;
+       double beta;
+
+//Calcular el ángulo que forman las rectas, sabiendo sus vectores directores.
+       double cosBeta = ( ( (x-a)*(xp-a) )+( (y-b)*(yp-b) )+( (z-c)*(zp-c) ) )/sqrt((( (pow(x,2.0)-pow(a,2.0)) + (pow(y,2.0)-pow(b,2.0)) + (pow(z,2.0)-pow(c,2.0)) )*( (pow(xp,2.0)-pow(a,2.0)) + (pow(yp,2.0)-pow(b,2.0)) + (pow(zp,2.0)-pow(c,2.0)) ) ));
+       
+       beta = (180 * acos(fabs(cosBeta)))/M_PI;
+       //std::cout << "Angulo Beta: " << beta << std::endl; 
+       double ent = floor(beta);
+       double al = beta - ent;
+       double min = al * 60;
+       //std::cout << "minutos: " << min << std::endl;
+       std::cout << "Grados: "<< ent <<" minutos: " << floor(min) << std::endl;
+       return beta;
+}
+
+double * creaVtkHeartAngles::vectorProjection (double plX, double plY, double plZ, double nX, double nY, double nZ, double vX, double vY, double vZ)
+{
+       //punto del plano
+       double plx=plX, ply=plY, plz=plZ;
+       //normalPlano
+       double nx=nX, ny=nY, nz=nZ;
+       //vector V
+       double vx=vX, vy=vY, vz=vZ;
+
+       //distancia del punto al plano
+       double dist;
+       //vector proyectado     
+       double vpx, vpy, vpz;
+       double proj [3];
+       
+       dist = ply - vy;
+       //std::cout << dist << std
+       vpx = vx - (dist * nx);
+       vpy = vy - (dist * ny);
+       vpz = vz - (dist * nz);
+       
+       proj[0]=vpx;
+       proj[1]=vpy;
+       proj[2]=vpz;
+
+       return proj;
+}
+
+double *creaVtkHeartAngles::intersectionPlaneLine(double plx1, double ply1, double plz1, double plx2, double ply2, double plz2, double plx3, double ply3, double plz3, double px1, double py1, double pz1,double px2, double py2, double pz2)
+{
+       double puntoCorte[3];
+
+       double Plx1 = plx1, Ply1 = ply1, Plz1 = plz1, Plx2 = plx2, Ply2 = ply2, Plz2 = plz2, Plx3 = plx3, Ply3 = ply3, Plz3 = plz3;
+       double Px1 = px1, Py1 = py1, Pz1 = pz1, Px2 = px2, Py2 = py2, Pz2 = pz2;
+
+       //Calculo del plano
+
+       double aX = ((Ply2-Ply1)*(Plz3-Plz1)-(Ply3-Ply1)*(Plz2-Plz1));
+       double a = (Plx1)*((Ply2-Ply1)*(Plz3-Plz1)-(Ply3-Ply1)*(Plz2-Plz1));
+
+       double bX = ((Plx2-Plx1)*(Plz3-Plz1)-(Plx3-Plx1)*(Plz2-Plz1));
+       double b = (Ply1)*((Plx2-Plx1)*(Plz3-Plz1)-(Plx3-Plx1)*(Plz2-Plz1));
+
+       double cX = ((Plx2-Plx1)*(Ply3-Ply1)-(Plx3-Plx1)*(Ply2-Ply1));
+       double c = (Plz1)*((Plx2-Plx1)*(Ply3-Ply1)-(Plx3-Plx1)*(Ply2-Ply1));
+
+       double r = a + b + c;
+       std::cout << "ecuacion: " << aX << "," << a << "," << bX << "," << b << "," << cX << "," << c << std::endl;
+       std::cout << "r: " << r << std::endl;
+
+       //Calculo del vector director
+       
+       double vdirx = Px2 - Px1;
+       double vdiry = Py2 - Py1;
+       double vdirz = Pz2 - Pz1;
+       
+       std::cout << "vdirx: " << vdirx << " vdiry: " << vdiry << " vdirz: " << vdirz << std::endl;     
+
+       //Se igualan las formulas del plano y la recta
+       //x=Px1+vdirx, y=Py1+vdiry, z=Pz1+vdirz
+       
+       double eRes = aX*Px1 + bX*Py1 + cX*Pz1;
+       double eResT = aX*vdirx + bX*vdiry + cX*vdirz;
+       std::cout << "eRes: " << eRes << " eResT: " << eResT << std::endl;
+       //Calculo del punto solucion
+       if(eResT == 0){
+               std::cout << "Soluciones infinitas... " << std::endl;
+       }
+       else {
+               double t = (((-1)*eRes)-r)/eResT;
+
+               double Px = Px1 + (t * vdirx);
+               double Py = Py1 + (t * vdiry);
+               double Pz = Pz1 + (t * vdirz);  
+
+               std::cout << "px: " << Px << " py: " << Py << " pz: " << Pz << std::endl;       
+       
+               puntoCorte[0] = Px;
+               puntoCorte[1] = Py;
+               puntoCorte[2] = Pz;
+       }
+       return puntoCorte;
+}
+
+//---------------------------------------------
+//Method template
+//---------------------------------------------
+/*
+void creaVtkHeartAngles::FunctionName(int& parameterA)
+{
+  parameterA = 2 * parameterA;
+  return;
+}
+*/
diff --git a/lib/creaVtk/creaVtkHeartAngles.h b/lib/creaVtk/creaVtkHeartAngles.h
new file mode 100644 (file)
index 0000000..f04c512
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+# ---------------------------------------------------------------------
+#
+# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+#                        pour la Sante)
+# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+# Previous Authors : Laurent Guigues, Jean-Pierre Roux
+# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+#
+#  This software is governed by the CeCILL-B license under French law and
+#  abiding by the rules of distribution of free software. You can  use,
+#  modify and/ or redistribute the software under the terms of the CeCILL-B
+#  license as circulated by CEA, CNRS and INRIA at the following URL
+#  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+#  or in the file LICENSE.txt.
+#
+#  As a counterpart to the access to the source code and  rights to copy,
+#  modify and redistribute granted by the license, users are provided only
+#  with a limited warranty  and the software's author,  the holder of the
+#  economic rights,  and the successive licensors  have only  limited
+#  liability.
+#
+#  The fact that you are presently reading this means that you have had
+#  knowledge of the CeCILL-B license and that you accept its terms.
+# ------------------------------------------------------------------------
+*/
+
+#ifndef _CREAVTKHEARTANGLES_H_
+#define _CREAVTKHEARTANGLES_H_
+
+
+class creaVtkHeartAngles
+{
+
+public :
+  creaVtkHeartAngles();
+  ~creaVtkHeartAngles();
+       //Parametros: Punto P0, vector V, Vector V'(proyection de V)
+       double alpha (double P0a, double P0b,double P0c, double vx, double vy, double vz, double vxp, double vyp, double vzp);
+       //Parametros: Punto P0, Punto P3, Punto P4 (proyection de V)
+       double beta (double P0a, double P0b,double P0c, double P3x, double P3y, double P3z, double P4x, double P4y, double P4z);
+       //Parametros: punto del plano, normalPlano, vector V.
+       double * vectorProjection (double plx, double ply, double plz, double nx, double ny, double nz, double vx, double vy, double vz);
+       //Parametros: Tres puntos del plano, dos puntos de la recta.
+       double *intersectionPlaneLine(double plx1, double ply1, double plz1, double plx2, double ply2, double plz2, double plx3, double ply3, double plz3, double px1, double py1, double pz1,double px2, double py2, double pz2);
+
+protected:
+
+private:
+
+};
+
+//-end of _CREAVTKHEARTANGLES_H_------------------------------------------------------
+#endif
diff --git a/lib/creaVtk/creaVtkHeartAngles.h~ b/lib/creaVtk/creaVtkHeartAngles.h~
new file mode 100644 (file)
index 0000000..14634a3
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+# ---------------------------------------------------------------------
+#
+# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+#                        pour la Sante)
+# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+# Previous Authors : Laurent Guigues, Jean-Pierre Roux
+# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+#
+#  This software is governed by the CeCILL-B license under French law and
+#  abiding by the rules of distribution of free software. You can  use,
+#  modify and/ or redistribute the software under the terms of the CeCILL-B
+#  license as circulated by CEA, CNRS and INRIA at the following URL
+#  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+#  or in the file LICENSE.txt.
+#
+#  As a counterpart to the access to the source code and  rights to copy,
+#  modify and redistribute granted by the license, users are provided only
+#  with a limited warranty  and the software's author,  the holder of the
+#  economic rights,  and the successive licensors  have only  limited
+#  liability.
+#
+#  The fact that you are presently reading this means that you have had
+#  knowledge of the CeCILL-B license and that you accept its terms.
+# ------------------------------------------------------------------------
+*/
+
+#ifndef _CREAVTKHEARTANGLES_H_
+#define _CREAVTKHEARTANGLES_H_
+
+//---------------------------------------------
+// Class Name: creaVtkHeartAngles
+// [classdescription]
+//---------------------------------------------
+
+class creaVtkHeartAngles
+{
+
+//---------------------------------------------
+//Methods and attributes exposed to other classes
+//---------------------------------------------
+public :
+  creaVtkHeartAngles();
+  ~creaVtkHeartAngles();
+
+//--Method template----------------------------
+//  void FunctionName(int& parameterA);
+
+
+//---------------------------------------------
+//Methods and attributes exposed only to classes
+//that are derived from this class
+//---------------------------------------------
+protected:
+
+//---------------------------------------------
+//Methods and attributes only visible by this class
+//---------------------------------------------
+private:
+
+};
+
+//-end of _CREAVTKHEARTANGLES_H_------------------------------------------------------
+#endif