carotidaBifurcacion Class Reference

#include <carotidaBifurcacion.h>

List of all members.

Public Member Functions

void PrintSelf (ostream &os, vtkIndent indent)
virtual void SetInput (vtkPolyData *input)
vtkPolyData * GetInput ()
virtual void SetInput2 (vtkImageData *input)
vtkImageData * GetInput2 ()
void SetMaxPropRadio (double value)
double GetMaxPropRadio ()
void SetHumbral (double value)
double GetHumbral ()
void SetMaxPropMasa (double value)
double GetMaxPropMasa ()
void SetMinPropMasa (double value)
double GetMinPropMasa ()

Static Public Member Functions

static carotidaBifurcacionNew ()

Protected Member Functions

 carotidaBifurcacion ()
 ~carotidaBifurcacion ()
void Execute ()

Private Member Functions

 carotidaBifurcacion (const carotidaBifurcacion &)
void operator= (const carotidaBifurcacion &)
void searc (int i, int j, int k)
void find_components ()
unsigned short maximo ()
void blanquear ()
double angulo (double i1, double j1, double k1, double i2, double j2, double k2)
void direcciones (vtkPolyData *points, int iter, double radio, double puntocortea[3], double puntocortes[3])
void corte (double punto1[3], double punto2[3], double punto3[3], double centro[3], double radio)
void avanzar (vtkIdType iter)
int proporcion (vtkImageData *data)
void redondear (vtkImageData *data)
void limpiar (vtkPoints *profile, vtkPoints *profile2, vtkPoints *profile3, vtkPoints *profile4)
int igual (double puntoactual[3], double puntoactualdis[3], double puntoantguar[3], double puntoantguardis[3])

Private Attributes

vtkImageData * dataprov
unsigned char label
unsigned long vector [50][4]
vtkExtractVOI * extrac
vtkImageThreshold * thresh
vtkImageCast * cast
vtkImageSeedConnectivity * connect
vtkIdType iter
vtkPoints * points
vtkCellArray * lineas
vtkDoubleArray * salidas
double humbral
double maxpropradio
double maxpropmasa
double minpropmasa
vtkPoints * points2
vtkPoints * points3
vtkPoints * points4
int buenos2

Detailed Description

Definition at line 23 of file carotidaBifurcacion.h.


Constructor & Destructor Documentation

carotidaBifurcacion::carotidaBifurcacion (  )  [protected]

Definition at line 24 of file carotidaBifurcacion.cxx.

References cast, connect, dataprov, extrac, humbral, maxpropmasa, maxpropradio, minpropmasa, New(), and thresh.

00024                                          {
00025         
00026         this->NumberOfRequiredInputs = 2;
00027 
00028         this->humbral=0.45 ;
00029         this->maxpropradio=5;
00030         this->maxpropmasa=10;
00031         this->minpropmasa=0.001;
00032         
00033         this->extrac = vtkExtractVOI::New();
00034         this->extrac->SetSampleRate(1, 1, 1);
00035         
00036         this->thresh = vtkImageThreshold::New();
00037         this->thresh->SetInput(this->extrac->GetOutput());
00038         this->thresh->SetInValue(255);
00039         this->thresh->SetOutValue(0);
00040         this->thresh->ReleaseDataFlagOff();
00041 
00042         this->cast = vtkImageCast::New();
00043         this->cast->SetInput(this->thresh->GetOutput());
00044         this->cast->SetOutputScalarTypeToUnsignedChar();
00045 
00046         this->connect = vtkImageSeedConnectivity::New();
00047         this->connect->SetInput(this->cast->GetOutput());
00048         this->connect->SetInputConnectValue(255);
00049         this->connect->SetOutputConnectedValue(255);
00050         this->connect->SetOutputUnconnectedValue(0);
00051 
00052         this->dataprov=vtkImageData::New();
00053         this->dataprov->SetScalarTypeToUnsignedChar();
00054 
00055         
00056                         
00057 
00058 }

Here is the call graph for this function:

carotidaBifurcacion::~carotidaBifurcacion (  )  [inline, protected]

Definition at line 51 of file carotidaBifurcacion.h.

00051 {};

carotidaBifurcacion::carotidaBifurcacion ( const carotidaBifurcacion  )  [private]

Member Function Documentation

double carotidaBifurcacion::angulo ( double  i1,
double  j1,
double  k1,
double  i2,
double  j2,
double  k2 
) [private]

Definition at line 376 of file carotidaBifurcacion.cxx.

Referenced by avanzar().

00377 {
00378         double m1=sqrt((i1*i1)+(j1*j1)+(k1*k1));
00379         double m2=sqrt((i2*i2)+(j2*j2)+(k2*k2));
00380         double res=(acos(((i1*i2)+(j1*j2)+(k1*k2))/(m1*m2))*180)/3.1415;
00381 
00382         if(res<0){
00383                 res=-res;
00384         }
00385 
00386         if(res>=0 && res<180){
00387                 res=res;
00388         }
00389         else{
00390                 res=360-res;
00391         }
00392         
00393         return res;
00394 }

Here is the caller graph for this function:

void carotidaBifurcacion::avanzar ( vtkIdType  iter  )  [private]

Definition at line 817 of file carotidaBifurcacion.cxx.

References angulo(), blanquear(), buenos2, cast, connect, dataprov, direcciones(), extrac, find_components(), GetInput(), GetInput2(), humbral, label, maximo(), maxpropmasa, maxpropradio, New(), points2, points3, points4, proporcion(), redondear(), thresh, and vector.

Referenced by Execute().

00818 {
00819 
00820 
00821         double espprin[3];
00822         int extprin[6];
00823         double puntoactual[3];
00824         double puntoactualdis[3];
00825         int puntoactualarr[3];
00826         double radioactual;
00827         double dirant[3];
00828         double dirsig[3];
00829         
00830         
00831         
00832         double vector2[50][3];
00833         double angulos[50];
00834 
00835         unsigned long vectortemp[4];
00836         double vector2temp[3];
00837         double angulostemp;
00838 
00839         double maxmasa;
00840                 
00841         int extint[6];
00842         int extintreal[6];
00843         int prop;
00844 
00845         int i, j;
00846         int radiotrabajo;
00847 
00848         
00849                                 
00850         
00851         this->GetInput2()->GetExtent(extprin);
00852         this->GetInput2()->GetSpacing(espprin);
00853 
00854         vtkIdType totalpuntos=this->GetInput()->GetNumberOfPoints();
00855 
00856         if(iter<totalpuntos){
00857 
00858                 vtkDoubleArray *radio = (vtkDoubleArray *)this->GetInput()->GetPointData()->GetScalars("radio");
00859                 //vtkDoubleArray *dir = (vtkDoubleArray *)this->GetInput()->GetPointData()->GetVectors("norm");
00860                 this->GetInput()->GetPoint(iter, puntoactual);
00861                 radioactual=radio->GetValue(iter);
00862                 radiotrabajo=1;
00863 
00864                 for(this->label=0, prop=100;radiotrabajo<radioactual*this->maxpropradio && (this->label<2 || prop>this->maxpropmasa);radiotrabajo++){
00865 
00866                         puntoactualarr[0]= (int) ( (puntoactual[0]/espprin[0])+extprin[0] );
00867                         puntoactualarr[1]= (int) ( (puntoactual[1]/espprin[1])+extprin[2] );
00868                         puntoactualarr[2]= (int) ( (puntoactual[2]/espprin[2])            );
00869 
00870                         extint[0]=puntoactualarr[0]-radiotrabajo;
00871                         extint[1]=puntoactualarr[0]+radiotrabajo;
00872                         extint[2]=puntoactualarr[1]-radiotrabajo;
00873                         extint[3]=puntoactualarr[1]+radiotrabajo;
00874                         extint[4]=puntoactualarr[2]-radiotrabajo;
00875                         extint[5]=puntoactualarr[2]+radiotrabajo;
00876 
00877                         extrac->SetVOI(extint);
00878                         extrac->UpdateWholeExtent();
00879                         extrac->Update();
00880                         extrac->GetOutput()->GetExtent(extintreal);
00881                         
00882                         if(puntoactualarr[0]>=extintreal[0] && puntoactualarr[0]<=extintreal[1] && puntoactualarr[1]>=extintreal[2] && puntoactualarr[1]<=extintreal[3] && puntoactualarr[2]>=extintreal[4] && puntoactualarr[2]<=extintreal[5]  ){
00883 
00884                                 
00885                                 
00886                                 
00887                         this->thresh->ThresholdByUpper(this->maximo()*this->humbral);
00888                         this->thresh->UpdateWholeExtent();
00889                         this->thresh->Update();
00890 
00891                         prop=this->proporcion(this->thresh->GetOutput());
00892                         this->redondear(this->thresh->GetOutput());
00893 
00894 
00895                         this->cast->UpdateWholeExtent();
00896                         this->cast->Update();
00897 
00898 
00899                         this->connect->RemoveAllSeeds();
00900                         this->connect->AddSeed(puntoactualarr[0],puntoactualarr[1],puntoactualarr[2]);
00901                         this->connect->UpdateWholeExtent();
00902                         this->connect->Update();
00903 
00904                         this->dataprov->Delete();
00905 
00906                         this->dataprov=vtkImageData::New();
00907                         this->dataprov->SetScalarTypeToUnsignedChar();
00908 
00909                         this->dataprov->SetExtent(this->connect->GetOutput()->GetExtent());
00910                 
00911                         this->blanquear();
00912 
00913                         this->find_components();
00914                         
00915                                 
00916 
00917                                 
00918                                 
00919                         }
00920                 }
00921 
00922 
00923                 this->direcciones(this->GetInput(), this->iter, radiotrabajo-1, dirant, dirsig);
00924 
00925                         
00926 
00927                 dirant[0]=dirant[0]-puntoactual[0];
00928                 dirant[1]=dirant[1]-puntoactual[1];
00929                 dirant[2]=dirant[2]-puntoactual[2];
00930                 dirsig[0]=dirsig[0]-puntoactual[0];
00931                 dirsig[1]=dirsig[1]-puntoactual[1];
00932                 dirsig[2]=dirsig[2]-puntoactual[2];
00933 
00934 
00935 
00936 
00937                         
00938                         
00939                         maxmasa=0;
00940                         if(this->label>2){
00941                                 for(i=0;i<this->label;i++){
00942                                         vector2[i][0]=((double)this->vector[i][1]/(double)this->vector[i][0])-(double)puntoactualarr[0];
00943                                         vector2[i][1]=((double)this->vector[i][2]/(double)this->vector[i][0])-(double)puntoactualarr[1];
00944                                         vector2[i][2]=((double)this->vector[i][3]/(double)this->vector[i][0])-(double)puntoactualarr[2];
00945                                         double tmp_EED_A = this->angulo(dirsig[0], dirsig[1], dirsig[2], vector2[i][0], vector2[i][1], vector2[i][2]);
00946                                         double tmp_EED_B = this->angulo(dirant[0], dirant[1], dirant[2], vector2[i][0], vector2[i][1], vector2[i][2]);
00947 //                                      angulos[i] =min( tmp_EED_A , tmp_EED_B );
00948                                         angulos[i] = tmp_EED_A ;
00949                                         if (tmp_EED_B<angulos[i] ) 
00950                                         {
00951                                                 angulos[i]=tmp_EED_B;
00952                                         }
00953                                         if(maxmasa<this->vector[i][0]){
00954                                                 maxmasa=this->vector[i][0];
00955                                         }
00956                                         
00957                                 }
00958 
00959                                 for(i=0;i<this->label;i++){
00960                                         for(j=i;j<this->label;j++){
00961                                                 if(angulos[j]>angulos[i]){
00962                                                         vectortemp[0]=this->vector[i][0];
00963                                                         vectortemp[1]=this->vector[i][1];
00964                                                         vectortemp[2]=this->vector[i][2];
00965                                                         vectortemp[3]=this->vector[i][3];
00966                                                         vector2temp[0]=vector2[i][0];
00967                                                         vector2temp[1]=vector2[i][1];
00968                                                         vector2temp[2]=vector2[i][2];
00969                                                         angulostemp=angulos[i];
00970 
00971                                                         this->vector[i][0]=this->vector[j][0];
00972                                                         this->vector[i][1]=this->vector[j][1];
00973                                                         this->vector[i][2]=this->vector[j][2];
00974                                                         this->vector[i][3]=this->vector[j][3];
00975                                                         vector2[i][0]=vector2[j][0];
00976                                                         vector2[i][1]=vector2[j][1];
00977                                                         vector2[i][2]=vector2[j][2];
00978                                                         angulos[i]=angulos[j];
00979 
00980                                                         this->vector[j][0]=vectortemp[0];
00981                                                         this->vector[j][1]=vectortemp[1];
00982                                                         this->vector[j][2]=vectortemp[2];
00983                                                         this->vector[j][3]=vectortemp[3];
00984                                                         vector2[j][0]=vector2temp[0];
00985                                                         vector2[j][1]=vector2temp[1];
00986                                                         vector2[j][2]=vector2temp[2];
00987                                                         angulos[j]=angulostemp;
00988                                                 }
00989                                         }
00990                                         
00991                                 }
00992 
00993 
00994                                 for(i=this->label-2;i<this->label;i++){
00995                                         this->vector[i][0]=0;
00996                                 }
00997 
00998 
00999 
01000                                 for(i=0;i<this->label;i++){
01001                                         for(j=i;j<this->label;j++){
01002                                                 if(this->vector[j][0]>this->vector[i][0]){
01003                                                         vectortemp[0]=this->vector[i][0];
01004                                                         vectortemp[1]=this->vector[i][1];
01005                                                         vectortemp[2]=this->vector[i][2];
01006                                                         vectortemp[3]=this->vector[i][3];
01007                                                         vector2temp[0]=vector2[i][0];
01008                                                         vector2temp[1]=vector2[i][1];
01009                                                         vector2temp[2]=vector2[i][2];
01010                                                         angulostemp=angulos[i];
01011 
01012                                                         this->vector[i][0]=this->vector[j][0];
01013                                                         this->vector[i][1]=this->vector[j][1];
01014                                                         this->vector[i][2]=this->vector[j][2];
01015                                                         this->vector[i][3]=this->vector[j][3];
01016                                                         vector2[i][0]=vector2[j][0];
01017                                                         vector2[i][1]=vector2[j][1];
01018                                                         vector2[i][2]=vector2[j][2];
01019                                                         angulos[i]=angulos[j];
01020 
01021                                                         this->vector[j][0]=vectortemp[0];
01022                                                         this->vector[j][1]=vectortemp[1];
01023                                                         this->vector[j][2]=vectortemp[2];
01024                                                         this->vector[j][3]=vectortemp[3];
01025                                                         vector2[j][0]=vector2temp[0];
01026                                                         vector2[j][1]=vector2temp[1];
01027                                                         vector2[j][2]=vector2temp[2];
01028                                                         angulos[j]=angulostemp;
01029                                                 }
01030                                         }
01031                                         
01032                                 }
01033 
01034                                 
01035                                 for(i=0;i<this->label;i++){
01036                                         if(maxmasa*this->minpropmasa<this->vector[i][0]){
01037                                                 puntoactualdis[0]=(puntoactualarr[0]+vector2[i][0]-extprin[0])*espprin[0];
01038                                                 puntoactualdis[1]=(puntoactualarr[1]+vector2[i][1]-extprin[2])*espprin[1];
01039                                                 puntoactualdis[2]=(puntoactualarr[2]+vector2[i][2])*espprin[2];
01040 
01041                                                 points2->InsertPoint(buenos2,puntoactual);
01042                                                 points3->InsertPoint(buenos2,puntoactualdis);
01043                                                 points4->InsertPoint(buenos2,puntoactual[0]+(radioactual/radiotrabajo)*(puntoactualdis[0]-puntoactual[0]), puntoactual[1]+(radioactual/radiotrabajo)*(puntoactualdis[1]-puntoactual[1]), puntoactual[2]+(radioactual/radiotrabajo)*(puntoactualdis[2]-puntoactual[2]));
01044                                                 buenos2++;
01045                                         }
01046                                         
01047                                 }
01048                                         
01049                         }
01050         
01051         }
01052 
01053 
01054 }

Here is the call graph for this function:

Here is the caller graph for this function:

void carotidaBifurcacion::blanquear (  )  [private]

Definition at line 351 of file carotidaBifurcacion.cxx.

References dataprov.

Referenced by avanzar().

00352 {
00353         int ext[6];
00354         int i, j, k;
00355         
00356         this->dataprov->GetExtent(ext);
00357 
00358         unsigned char *ptr;
00359 
00360 
00361 
00362         for(i=ext[0];i<=ext[1];i++){
00363                         for(j=ext[2];j<=ext[3];j++){
00364                                 for(k=ext[4];k<=ext[5];k++){
00365                                         ptr=(unsigned char *)   this->dataprov->GetScalarPointer(i,j,k);
00366                                         *ptr=0;
00367                                 }
00368                         }
00369                 }
00370 }

Here is the caller graph for this function:

void carotidaBifurcacion::corte ( double  punto1[3],
double  punto2[3],
double  punto3[3],
double  centro[3],
double  radio 
) [private]

Definition at line 398 of file carotidaBifurcacion.cxx.

Referenced by direcciones().

00399 {
00400         
00401         double m1, m2, m3;
00402         double b1, b2, b3;
00403         double c0, c1, c2;
00404         double* roots;
00405         double root;
00406         
00407 
00408         m1=punto2[0]-punto1[0];
00409         m2=punto2[1]-punto1[1];
00410         m3=punto2[2]-punto1[2];
00411 
00412         b1=punto1[0]-centro[0];
00413         b2=punto1[1]-centro[1];
00414         b3=punto1[2]-centro[2];
00415 
00416         c0=m1*m1+m2*m2+m3*m3;
00417         c1=2*m1*b1+2*m2*b2+2*m3*b3;
00418         c2=b1*b1+b2*b2+b3*b3-radio*radio;
00419 
00420         roots=vtkMath::SolveQuadratic  (c0, c1, c2);
00421 
00422         if(roots[1]>=0 && roots[1]<=1){
00423                 root=roots[1];
00424         }
00425         else{
00426                 root=roots[2];
00427         }
00428 
00429         punto3[0]=punto1[0]+root*(punto2[0]-punto1[0]);
00430         punto3[1]=punto1[1]+root*(punto2[1]-punto1[1]);
00431         punto3[2]=punto1[2]+root*(punto2[2]-punto1[2]);
00432                 
00433 }

Here is the caller graph for this function:

void carotidaBifurcacion::direcciones ( vtkPolyData *  points,
int  iter,
double  radio,
double  puntocortea[3],
double  puntocortes[3] 
) [private]

Definition at line 439 of file carotidaBifurcacion.cxx.

References corte().

Referenced by avanzar().

00440 {
00441         double puntoactual[3];
00442         double puntoant[3];
00443         double puntosig[3];
00444         double puntoant2[3];
00445         double puntosig2[3];
00446         double dist;
00447         int i,j;
00448         
00449         vtkIdType totalpuntos=profile->GetNumberOfPoints();
00450 
00451         if(iter<totalpuntos){
00452 
00453                 profile->GetPoint(iter, puntoactual);
00454         
00455                 if(iter==0){
00456                         profile->GetPoint(iter+1, puntosig);
00457                         profile->GetPoint(iter, puntosig2);
00458                         i=1;
00459 
00460                         dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntosig ));
00461 
00462                         while(dist< radio){
00463                         
00464                                 profile->GetPoint(iter+1+i, puntosig);
00465                                 profile->GetPoint(iter+i, puntosig2);
00466                                 dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntosig ));
00467                                 i++;
00468 
00469                         }
00470 
00471                         this->corte(puntosig, puntosig2, puntocortes, puntoactual,  radio );
00472 
00473                         puntocortea[0]=2*puntoactual[0]-puntocortes[0];
00474                         puntocortea[1]=2*puntoactual[1]-puntocortes[1];
00475                         puntocortea[2]=2*puntoactual[2]-puntocortes[2];
00476                         
00477                 }
00478                 else if(iter==totalpuntos-1){
00479                         profile->GetPoint(iter-1, puntoant);
00480                         profile->GetPoint(iter, puntoant2);
00481                         j=1;
00482 
00483                         dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntoant ));
00484 
00485                         while(dist< radio){
00486                         
00487                                 profile->GetPoint(iter-1-j, puntoant);
00488                                 profile->GetPoint(iter-j, puntoant2);
00489                                 dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntoant ));
00490                                 j++;
00491 
00492                         }
00493 
00494                         this->corte(puntoant, puntoant2, puntocortea, puntoactual,  radio );
00495 
00496                         puntocortes[0]=2*puntoactual[0]-puntocortea[0];
00497                         puntocortes[1]=2*puntoactual[1]-puntocortea[1];
00498                         puntocortes[2]=2*puntoactual[2]-puntocortea[2];
00499                 }
00500                 else{
00501                         profile->GetPoint(iter+1, puntosig);
00502                         profile->GetPoint(iter, puntosig2);
00503                         i=1;
00504 
00505                         dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntosig ));
00506 
00507                         while(dist< radio && iter+1+i<totalpuntos){
00508                         
00509                                 profile->GetPoint(iter+1+i, puntosig);
00510                                 profile->GetPoint(iter+i, puntosig2);
00511                                 dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntosig ));
00512                                 i++;
00513 
00514                         }
00515 
00516                         profile->GetPoint(iter-1, puntoant);
00517                         profile->GetPoint(iter, puntoant2);
00518                         j=1;
00519 
00520                         dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntoant ));
00521 
00522                         while(dist< radio && iter-1-j>=0){
00523                         
00524                                 profile->GetPoint(iter-1-j, puntoant);
00525                                 profile->GetPoint(iter-j, puntoant2);
00526                                 dist=sqrt(vtkMath::Distance2BetweenPoints(puntoactual, puntoant ));
00527                                 j++;
00528                         }
00529 
00530 
00531                         if(iter+1+i<totalpuntos){
00532                                 this->corte(puntosig, puntosig2, puntocortes, puntoactual,  radio );                            
00533                         }
00534 
00535                         if(iter-1-j>=0){
00536                                 this->corte(puntoant, puntoant2, puntocortea, puntoactual,  radio );    
00537                         }
00538 
00539                         if(iter+1+i>=totalpuntos){
00540                                 puntocortes[0]=2*puntoactual[0]-puntocortea[0];
00541                                 puntocortes[1]=2*puntoactual[1]-puntocortea[1];
00542                                 puntocortes[2]=2*puntoactual[2]-puntocortea[2];
00543                         }
00544                         
00545                         if(iter-1-j<0){
00546                                 puntocortea[0]=2*puntoactual[0]-puntocortes[0];
00547                                 puntocortea[1]=2*puntoactual[1]-puntocortes[1];
00548                                 puntocortea[2]=2*puntoactual[2]-puntocortes[2];
00549                         }
00550                 }
00551         }
00552         
00553 }

Here is the call graph for this function:

Here is the caller graph for this function:

void carotidaBifurcacion::Execute (  )  [protected]

Definition at line 80 of file carotidaBifurcacion.cxx.

References avanzar(), buenos2, GetInput(), iter, limpiar(), New(), points, points2, points3, and points4.

00081 {
00082         vtkIdType totalpuntos=this->GetInput()->GetNumberOfPoints();
00083         this->points = vtkPoints::New();
00084         this->points2 = vtkPoints::New();
00085         this->points3 = vtkPoints::New();
00086         this->points4 = vtkPoints::New();
00087         this->buenos2=0;
00088         this->iter=0;
00089         /*this->lineas = vtkCellArray::New();
00090         this->salidas= vtkDoubleArray::New();
00091         this->salidas->SetNumberOfComponents(3);*/
00092 
00093         for(this->iter=0;this->iter<totalpuntos;this->iter++){
00094                 this->avanzar(this->iter);
00095         }
00096 
00097         this->limpiar(points, points2, points3, points4 );
00098    
00099         this->GetOutput()->SetPoints (this->points);
00100         /*this->GetOutput()->SetLines(this->lineas);
00101         this->GetOutput()->GetPointData()->SetVectors(this->salidas);*/
00102 }

Here is the call graph for this function:

void carotidaBifurcacion::find_components (  )  [private]

Definition at line 277 of file carotidaBifurcacion.cxx.

References connect, dataprov, label, searc(), and vector.

Referenced by avanzar().

00278 {
00279         int ext[6];
00280         int i, j, k, radio;
00281         int i2, j2, k2;
00282 
00283         
00284         unsigned char *ptr;
00285         unsigned char *ptr2;
00286 
00287         this->connect->GetOutput()->GetExtent(ext);
00288 
00289 
00290         radio=(ext[1]-ext[0])/2;
00291 
00292         this->label=0;
00293                 
00294 
00295 
00296         for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
00297                         for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
00298                                 for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
00299                                         ptr=(unsigned char *)   this->connect->GetOutput()->GetScalarPointer(i,j,k);
00300                                         ptr2=(unsigned char *)  this->dataprov->GetScalarPointer(i,j,k);
00301 
00302                                         if(*ptr==255 && *ptr2==0 && (radio*radio)>(i2*i2)+(j2*j2)+(k2*k2) && ((radio-2)*(radio-2))<(i2*i2)+(j2*j2)+(k2*k2)  ){
00303                                                 this->label=this->label+1;
00304                                                 this->vector[this->label-1][0]=0;
00305                                                 this->vector[this->label-1][1]=0;
00306                                                 this->vector[this->label-1][2]=0;
00307                                                 this->vector[this->label-1][3]=0;
00308                                                 this->searc(i, j, k);
00309                                                 
00310                                         }
00311                                 }
00312                         }
00313                 }
00314         
00315 }

Here is the call graph for this function:

Here is the caller graph for this function:

double carotidaBifurcacion::GetHumbral (  ) 

Definition at line 183 of file carotidaBifurcacion.cxx.

References humbral.

00184 {
00185         return this->humbral;
00186 }

vtkPolyData * carotidaBifurcacion::GetInput (  ) 

Definition at line 112 of file carotidaBifurcacion.cxx.

Referenced by avanzar(), and Execute().

00112                                           {
00113         if (this->NumberOfInputs < 1){
00114                 return NULL;
00115         }
00116   
00117         return (vtkPolyData *)(this->Inputs[0]);
00118 }

Here is the caller graph for this function:

vtkImageData * carotidaBifurcacion::GetInput2 (  ) 

Definition at line 128 of file carotidaBifurcacion.cxx.

Referenced by avanzar(), and SetInput2().

00129 {
00130         if (this->NumberOfInputs < 2){
00131                 return NULL;
00132     }
00133   
00134         return (vtkImageData *)(this->Inputs[1]);
00135 }

Here is the caller graph for this function:

double carotidaBifurcacion::GetMaxPropMasa (  ) 

Definition at line 200 of file carotidaBifurcacion.cxx.

References maxpropmasa.

00201 {
00202         return this->maxpropmasa;
00203 }

double carotidaBifurcacion::GetMaxPropRadio (  ) 

Definition at line 165 of file carotidaBifurcacion.cxx.

References maxpropradio.

00166 {
00167         return this->maxpropradio;
00168 }

double carotidaBifurcacion::GetMinPropMasa (  ) 

Definition at line 217 of file carotidaBifurcacion.cxx.

References minpropmasa.

00218 {
00219         return this->minpropmasa;
00220 }

int carotidaBifurcacion::igual ( double  puntoactual[3],
double  puntoactualdis[3],
double  puntoantguar[3],
double  puntoantguardis[3] 
) [private]

Definition at line 555 of file carotidaBifurcacion.cxx.

Referenced by limpiar().

00556 {
00557         int res=0;
00558         double mat[3][3];
00559         double matinv[3][3];
00560                                 
00561         double t[3];
00562         double b[3];
00563 
00564         double disact;
00565         double disant;
00566         double discru;
00567 
00568                                                                 
00569 
00570         disact=sqrt(vtkMath::Distance2BetweenPoints (puntoactual,puntoactualdis));
00571         disant=sqrt(vtkMath::Distance2BetweenPoints (puntoantguar,puntoantguardis));
00572         discru=sqrt(vtkMath::Distance2BetweenPoints (puntoactual,puntoantguar));
00573 
00574                                                         
00575         if(discru<disact+disant){
00576                 mat[0][0]=puntoantguardis[0]-puntoantguar[0];
00577                 mat[0][1]=-(puntoactualdis[0]-puntoactual[0]);
00578                 mat[0][2]=0;
00579                                                                                 
00580                 mat[1][0]=puntoantguardis[1]-puntoantguar[1];
00581                 mat[1][1]=-(puntoactualdis[1]-puntoactual[1]);
00582                 mat[1][2]=0;
00583 
00584                 mat[2][0]=0;
00585                 mat[2][1]=0;
00586                 mat[2][2]=1;
00587 
00588                 b[0]=puntoactual[0]-puntoantguar[0];
00589                 b[1]=puntoactual[1]-puntoantguar[1];
00590                 b[2]=0;
00591 
00592                                                                         
00593                 vtkMath::Invert3x3(mat,matinv);
00594                 vtkMath::Multiply3x3 (matinv, b, t);
00595 
00596 
00597                                                                 
00598                 if(t[0]>0 && t[1]>0 ){
00599                         res=1;
00600                 }
00601 
00602                                                                         
00603         }
00604 
00605         return res;
00606 }

Here is the caller graph for this function:

void carotidaBifurcacion::limpiar ( vtkPoints *  profile,
vtkPoints *  profile2,
vtkPoints *  profile3,
vtkPoints *  profile4 
) [private]

Definition at line 671 of file carotidaBifurcacion.cxx.

References igual().

Referenced by Execute().

00672 {
00673         int i,j,k,l,m, n, p;
00674         double puntoactual[3];
00675         double puntoactualdis[3];
00676         double puntoantguar[3];
00677         double puntoantguardis[3];
00678         double promedio[3];
00679         int cant;
00680         int total[100][10];
00681         int pairs[100][2];
00682         int flag;
00683         
00684         vtkIdType totalpuntos=profile2->GetNumberOfPoints();
00685 
00686         k=0;
00687 
00688         for(i=0;i<totalpuntos;i++){
00689                 flag=0;
00690                 profile2->GetPoint(i, puntoactual);
00691                 profile3->GetPoint(i, puntoactualdis);
00692                         
00693                 for(j=i+1;j<totalpuntos;j++){
00694                         profile2->GetPoint(j, puntoantguar);
00695                         profile3->GetPoint(j, puntoantguardis);
00696                         if(puntoactual[0]!=puntoantguar[0] && puntoactual[1]!=puntoantguar[1] && puntoactual[2]!=puntoantguar[2] && 1==this->igual(puntoactual, puntoactualdis, puntoantguar, puntoantguardis)){
00697                                 pairs[k][0]=i;
00698                                 pairs[k][1]=j;
00699                                 k++;
00700                                 flag=1;
00701                         }
00702 
00703                 }
00704                 for(n=0;n<k;n++){
00705                         if(pairs[n][1]==i){
00706                                 flag=1;
00707                         }
00708 
00709                 }
00710                 if(flag==0){
00711                         pairs[k][0]=i;
00712                         pairs[k][1]=-1;
00713                         k++;
00714                 }
00715         }
00716 
00717         for(i=0;i<10;i++){
00718                 for(j=0;j<100;j++){
00719                         total[j][i]=-1;
00720                 }
00721         }
00722 
00723 
00724         l=0;
00725 
00726         for(i=0;i<k;i++){
00727                 m=0;
00728                 if(pairs[i][0]!=-1){
00729                         total[l][m]=pairs[i][0];
00730                         m++;
00731                 }
00732                 if(pairs[i][1]!=-1){
00733                         total[l][m]=pairs[i][1];
00734                         m++;
00735                 }
00736                 if(pairs[i][0]!=-1 || pairs[i][1]!=-1){
00737                         pairs[i][0]=-1;
00738                         pairs[i][1]=-1;
00739                         l++;
00740                         
00741                 
00742                         for(j=i+1;j<k;j++){
00743 
00744                                 for(n=0;n<m;n++){
00745                                 
00746                                         if(total[l-1][n]==pairs[j][0]){
00747                                                 flag=0;
00748                                                 for(p=0;p<m;p++){
00749                                                         if(total[l-1][p]==pairs[j][1]){
00750                                                                 flag=1;
00751                                                         }
00752                                                 }
00753                                                 if(flag==0){
00754                                                         total[l-1][m]=pairs[j][1];
00755                                                         m++;
00756                                                 }
00757                                                 pairs[j][0]=-1;
00758                                                 pairs[j][1]=-1;
00759                                                         
00760 
00761                                         }
00762                                         else if(total[l-1][n]==pairs[j][1]){
00763                                                 flag=0;
00764                                                 for(p=0;p<m;p++){
00765                                                         if(total[l-1][p]==pairs[j][0]){
00766                                                                 flag=1;
00767                                                         }
00768                                                 }
00769                                                 if(flag==0){
00770                                                         total[l-1][m]=pairs[j][0];
00771                                                         m++;
00772                                                 }
00773                                                 pairs[j][0]=-1;
00774                                                 pairs[j][1]=-1;
00775                                         }
00776                                         
00777                                 }
00778                         }
00779                 }
00780         
00781         }
00782 
00783         for(i=0;i<l;i++){
00784                 promedio[0]=0;
00785                 promedio[1]=0;
00786                 promedio[2]=0;
00787                 cant=0;
00788                 flag=0;
00789                 m=0;
00790 
00791                 while(flag==0){
00792                         if(total[i][m]!=-1){
00793                                 profile4->GetPoint(total[i][m], puntoactual);
00794                                 promedio[0]+=puntoactual[0];
00795                                 promedio[1]+=puntoactual[1];
00796                                 promedio[2]+=puntoactual[2];
00797                                 cant++;
00798                         }
00799                         else{
00800                                 flag=1;
00801                         }
00802                         m++;
00803                 }
00804                 promedio[0]=promedio[0]/cant;
00805                 promedio[1]=promedio[1]/cant;
00806                 promedio[2]=promedio[2]/cant;
00807                 
00808                 profile->InsertPoint(i,promedio);
00809 
00810 
00811         }
00812 
00813 
00814 }

Here is the call graph for this function:

Here is the caller graph for this function:

unsigned short carotidaBifurcacion::maximo (  )  [private]

Definition at line 321 of file carotidaBifurcacion.cxx.

References extrac.

Referenced by avanzar().

00322 {
00323         int ext[6];
00324         int i, j, k;
00325         unsigned short max=0;
00326 
00327         this->extrac->GetOutput()->GetExtent(ext);
00328 
00329         unsigned short *ptr;
00330         
00331 
00332         for(i=ext[0];i<=ext[1];i++){
00333                         for(j=ext[2];j<=ext[3];j++){
00334                                 for(k=ext[4];k<=ext[5];k++){
00335                                         ptr=(unsigned short *)this->extrac->GetOutput()->GetScalarPointer(i,j,k);
00336                                         if(*ptr>max){
00337                                                 max=*ptr;
00338                                                 
00339                                         }
00340                                 }
00341                         }
00342                 }
00343 
00344                 return max;
00345 }

Here is the caller graph for this function:

static carotidaBifurcacion* carotidaBifurcacion::New (  )  [static]

Referenced by avanzar(), carotidaBifurcacion(), and Execute().

Here is the caller graph for this function:

void carotidaBifurcacion::operator= ( const carotidaBifurcacion  )  [private]
void carotidaBifurcacion::PrintSelf ( ostream &  os,
vtkIndent  indent 
)

Definition at line 144 of file carotidaBifurcacion.cxx.

00145 {
00146         this->Superclass::PrintSelf(os,indent);
00147 }

int carotidaBifurcacion::proporcion ( vtkImageData *  data  )  [private]

Definition at line 610 of file carotidaBifurcacion.cxx.

Referenced by avanzar().

00611 {
00612         int ext[6];
00613         int i, j, k;
00614         int max=0;
00615         int total=0;
00616 
00617         data->GetExtent(ext);
00618 
00619         unsigned short *ptr;
00620         
00621         for(i=ext[0];i<=ext[1];i++){
00622                         for(j=ext[2];j<=ext[3];j++){
00623                                 for(k=ext[4];k<=ext[5];k++){
00624                                         ptr=(unsigned short *)data->GetScalarPointer(i,j,k);
00625                                         if(*ptr!=0){
00626                                                 max++;
00627                                                 
00628                                         }
00629                                         total++;
00630                                 }
00631                         }
00632                 }
00633 
00634                 return (max*100)/total;
00635 }

Here is the caller graph for this function:

void carotidaBifurcacion::redondear ( vtkImageData *  data  )  [private]

Definition at line 641 of file carotidaBifurcacion.cxx.

Referenced by avanzar().

00642 {
00643         int ext[6];
00644         int i, j, k, radio;
00645         int i2, j2, k2;
00646 
00647         data->GetExtent(ext);
00648 
00649         unsigned char *ptr;
00650 
00651         radio=(ext[1]-ext[0])/2;
00652 
00653         double tmpsqrt;
00654         for(i=ext[0], i2=-radio;i<=ext[1];i++, i2++){
00655                         for(j=ext[2], j2=-radio;j<=ext[3];j++, j2++){
00656                                 for(k=ext[4], k2=-radio;k<=ext[5];k++, k2++){
00657                                         ptr=(unsigned char *)   data->GetScalarPointer(i,j,k);
00658                                     tmpsqrt = (i2*i2)+(j2*j2)+(k2*k2) ;                                 
00659                                         if( radio<sqrt(tmpsqrt) ){
00660                                                 *ptr=0;
00661                                                 
00662                                         }
00663                                 }
00664                         }
00665                 }
00666 }

Here is the caller graph for this function:

void carotidaBifurcacion::searc ( int  i,
int  j,
int  k 
) [private]

Definition at line 228 of file carotidaBifurcacion.cxx.

References connect, dataprov, label, and vector.

Referenced by find_components().

00229 {
00230 
00231         unsigned char *ptr;
00232         unsigned char *ptr2;
00233         
00234         int radio;
00235 
00236         int i2, j2, k2;
00237         int i3, j3, k3;
00238                 
00239         ptr=(unsigned char *)   this->connect->GetOutput()->GetScalarPointer(i,j,k);
00240         ptr2=(unsigned char *)  this->dataprov->GetScalarPointer(i,j,k);
00241 
00242         int ext[6];
00243         
00244         this->connect->GetOutput()->GetExtent(ext);
00245 
00246         radio=(ext[1]-ext[0])/2;
00247 
00248         i2=i-ext[0]-radio;
00249         j2=j-ext[2]-radio;
00250         k2=k-ext[4]-radio;
00251 
00252 
00253         *ptr2=this->label;
00254         this->vector[this->label-1][0]+=1;
00255         this->vector[this->label-1][1]+=i;
00256         this->vector[this->label-1][2]+=j;
00257         this->vector[this->label-1][3]+=k;
00258 
00259 
00260         for(i3=-1;i3<=1;i3++){
00261                         for(j3=-1;j3<=1;j3++){
00262                                 for(k3=-1;k3<=1;k3++){
00263                                         if(i+i3>=ext[0] && i+i3<=ext[1] && j+j3>=ext[2] && j+j3<=ext[3] && k+k3>=ext[4] &&  k+k3<=ext[5] ){
00264                                                 ptr=(unsigned char *)   this->connect->GetOutput()->GetScalarPointer(i+i3,j+j3,k+k3);
00265                                                 ptr2=(unsigned char *)  this->dataprov->GetScalarPointer(i+i3,j+j3,k+k3);
00266                                                 if(*ptr==255 && *ptr2==0 && (radio*radio)>((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3)) && ((radio-2)*(radio-2))<((i2+i3)*(i2+i3))+((j2+j3)*(j2+j3))+((k2+k3)*(k2+k3))){
00267                                                         this->searc(i+i3, j+j3, k+k3);
00268                                                 }
00269                                         }
00270                                 }
00271                         }
00272                 }
00273 }

Here is the caller graph for this function:

void carotidaBifurcacion::SetHumbral ( double  value  ) 

Definition at line 174 of file carotidaBifurcacion.cxx.

References humbral.

Referenced by TreeExtraction_MH_JFC::Execute().

00175 {
00176         this->humbral=value;
00177 }

Here is the caller graph for this function:

void carotidaBifurcacion::SetInput ( vtkPolyData *  input  )  [virtual]

Definition at line 61 of file carotidaBifurcacion.cxx.

Referenced by TreeExtraction_MH_JFC::Execute().

00062 {
00063         this->vtkProcessObject::SetNthInput(0, input);
00064 }

Here is the caller graph for this function:

void carotidaBifurcacion::SetInput2 ( vtkImageData *  input  )  [virtual]

Definition at line 69 of file carotidaBifurcacion.cxx.

References extrac, and GetInput2().

Referenced by TreeExtraction_MH_JFC::Execute().

00070 {
00071         this->vtkProcessObject::SetNthInput(1, input);
00072         this->extrac->SetInput(this->GetInput2());
00073   
00074 }

Here is the call graph for this function:

Here is the caller graph for this function:

void carotidaBifurcacion::SetMaxPropMasa ( double  value  ) 

Definition at line 191 of file carotidaBifurcacion.cxx.

References maxpropmasa.

Referenced by TreeExtraction_MH_JFC::Execute().

00192 {
00193         this->maxpropmasa=value;
00194 }

Here is the caller graph for this function:

void carotidaBifurcacion::SetMaxPropRadio ( double  value  ) 

Definition at line 157 of file carotidaBifurcacion.cxx.

References maxpropradio.

Referenced by TreeExtraction_MH_JFC::Execute().

00158 {
00159         this->maxpropradio=value;
00160 }

Here is the caller graph for this function:

void carotidaBifurcacion::SetMinPropMasa ( double  value  ) 

Definition at line 208 of file carotidaBifurcacion.cxx.

References minpropmasa.

Referenced by TreeExtraction_MH_JFC::Execute().

00209 {
00210         this->minpropmasa=value;
00211 }

Here is the caller graph for this function:


Member Data Documentation

Definition at line 117 of file carotidaBifurcacion.h.

Referenced by avanzar(), and Execute().

vtkImageCast* carotidaBifurcacion::cast [private]

Definition at line 93 of file carotidaBifurcacion.h.

Referenced by avanzar(), and carotidaBifurcacion().

vtkImageSeedConnectivity* carotidaBifurcacion::connect [private]

Definition at line 94 of file carotidaBifurcacion.h.

Referenced by avanzar(), carotidaBifurcacion(), find_components(), and searc().

vtkImageData* carotidaBifurcacion::dataprov [private]

Definition at line 88 of file carotidaBifurcacion.h.

Referenced by avanzar(), blanquear(), carotidaBifurcacion(), find_components(), and searc().

vtkExtractVOI* carotidaBifurcacion::extrac [private]

Definition at line 91 of file carotidaBifurcacion.h.

Referenced by avanzar(), carotidaBifurcacion(), maximo(), and SetInput2().

double carotidaBifurcacion::humbral [private]

Definition at line 104 of file carotidaBifurcacion.h.

Referenced by avanzar(), carotidaBifurcacion(), GetHumbral(), and SetHumbral().

vtkIdType carotidaBifurcacion::iter [private]

Definition at line 95 of file carotidaBifurcacion.h.

Referenced by Execute().

unsigned char carotidaBifurcacion::label [private]

Definition at line 89 of file carotidaBifurcacion.h.

Referenced by avanzar(), find_components(), and searc().

vtkCellArray* carotidaBifurcacion::lineas [private]

Definition at line 99 of file carotidaBifurcacion.h.

Definition at line 107 of file carotidaBifurcacion.h.

Referenced by carotidaBifurcacion(), GetMinPropMasa(), and SetMinPropMasa().

vtkPoints* carotidaBifurcacion::points [private]

Definition at line 97 of file carotidaBifurcacion.h.

Referenced by Execute().

vtkPoints* carotidaBifurcacion::points2 [private]

Definition at line 110 of file carotidaBifurcacion.h.

Referenced by avanzar(), and Execute().

vtkPoints* carotidaBifurcacion::points3 [private]

Definition at line 112 of file carotidaBifurcacion.h.

Referenced by avanzar(), and Execute().

vtkPoints* carotidaBifurcacion::points4 [private]

Definition at line 113 of file carotidaBifurcacion.h.

Referenced by avanzar(), and Execute().

vtkDoubleArray* carotidaBifurcacion::salidas [private]

Definition at line 102 of file carotidaBifurcacion.h.

vtkImageThreshold* carotidaBifurcacion::thresh [private]

Definition at line 92 of file carotidaBifurcacion.h.

Referenced by avanzar(), and carotidaBifurcacion().

unsigned long carotidaBifurcacion::vector[50][4] [private]

Definition at line 90 of file carotidaBifurcacion.h.

Referenced by avanzar(), find_components(), and searc().


The documentation for this class was generated from the following files:

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1