From 90c71e060662977373f6cd7254e6e492f85d3935 Mon Sep 17 00:00:00 2001 From: ctorres Date: Wed, 20 Nov 2013 15:29:09 +0100 Subject: [PATCH] New functionality, obtain the angles of the vector from a heart image. --- lib/creaVtk/creaVtkHeartAngles.cpp | 173 ++++++++++++++++++++++++++++ lib/creaVtk/creaVtkHeartAngles.cpp~ | 173 ++++++++++++++++++++++++++++ lib/creaVtk/creaVtkHeartAngles.h | 54 +++++++++ lib/creaVtk/creaVtkHeartAngles.h~ | 64 ++++++++++ 4 files changed, 464 insertions(+) create mode 100644 lib/creaVtk/creaVtkHeartAngles.cpp create mode 100644 lib/creaVtk/creaVtkHeartAngles.cpp~ create mode 100644 lib/creaVtk/creaVtkHeartAngles.h create mode 100644 lib/creaVtk/creaVtkHeartAngles.h~ diff --git a/lib/creaVtk/creaVtkHeartAngles.cpp b/lib/creaVtk/creaVtkHeartAngles.cpp new file mode 100644 index 0000000..a51007a --- /dev/null +++ b/lib/creaVtk/creaVtkHeartAngles.cpp @@ -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 +#include + +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 index 0000000..a51007a --- /dev/null +++ b/lib/creaVtk/creaVtkHeartAngles.cpp~ @@ -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 +#include + +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 index 0000000..f04c512 --- /dev/null +++ b/lib/creaVtk/creaVtkHeartAngles.h @@ -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 index 0000000..14634a3 --- /dev/null +++ b/lib/creaVtk/creaVtkHeartAngles.h~ @@ -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 -- 2.45.0