-/*
-# ---------------------------------------------------------------------
-#
-# 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;
-}
-*/