FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
#include <devsector.h>
Public Member Functions | |
virtual int | Posizione () |
virtual double | CamEster () |
virtual double | CamInter () |
virtual void | Prgeom () |
virtual gvet & | Lab2cDev (gvet &) |
dal laboratorio con rotazione e traslazione | |
virtual gvet & | Devc2Lab (gvet &) |
dal device al lab con traslazione e poi rotazione | |
Protected Attributes | |
double | drinq |
double | rin |
double | rinq |
Cilindro: Volume cilindrico senza buco
Definition at line 18 of file devsector.h.
double DevSector::CamEster | ( | ) | [virtual] |
prima verifico se colpisco il cilindro che circoscrive il settore sulle basi o sulla superficie
controllo dove colpisce la superficie cilindrica esterna e controllo i limiti.
verifichiamo inoltre se incontriamo comunque i piani laterali del settore
controllo se colpisce il lato curvo concavo interno del settore....
Reimplemented from DevCln.
Definition at line 66 of file devsector.cpp.
{ double nv,dxyq,b,c,dltq,fi,t=-1.; gvet Vn,Xpos; camm=-1.; // se mi allontano ritorno -1. if ( ( nv=V_dev.z ) >0.0&&Doutd.z>0.0 ) return -1.; // ***** controllo se colpisce la base if ( nv >0.0 && Douts.z>0.0 ) // piani z {t=Douts.z/nv; if ( t>camm ) camm=t;} else if ( nv<0.0 && Doutd.z>0.0 ) {t=-Doutd.z/nv; if ( t>camm ) camm=t;} // colpisco nei limiti giusti Xpos= X_dev+V_dev*camm; dxyq=Xpos.x *Xpos.x +Xpos.y*Xpos.y; fi= atan2 ( X_dev.y,X_dev.x ); if ( abs ( fi ) <= OpenSector && dxyq >=rinq && dxyq<=routq ) return camm; else camm=-1.0; if ( vxyq<=0.0 ) return camm; //per vxyq==0 corre lungo zeta e non colpisce nulla if ( ( c=drq-routq ) >0.0 ) // la particella è esterna e può colpire il cilindro lateralmente.... { b=V_dev.x*X_dev.x+V_dev.y*X_dev.y; if ( b<0.0 ) { if ( ( dltq=b*b-vxyq*c ) < 0.0 ) return camm; // non colpisce mai il cilindro... quindi esco con -1.0 t= - ( b + sqrt ( dltq ) ) /vxyq; // Scelgo la soluzione minore if ( t>0.0 ) // ma lo è per forza....verifico i limiti { Xpos= X_dev+V_dev*t; fi= atan2 ( X_dev.y,X_dev.x ); if ( abs ( fi ) <= OpenSector && fabs ( Xpos.z ) <= Lout.z ) {camm=t; return camm;} // esco contento } } } // la normale al piano è calcolata uscente dal settore. // se urta il piano laterale verifico i limiti. Vn.x=-sin ( OpenSector ); Vn.y= cos ( OpenSector ); Vn.z=0.0; if ( ( b=Vn%V_dev ) <0. ) t= - ( Vn%X_dev ) /b; else { Vn.x=sin ( OpenSector ); Vn.y=cos ( OpenSector ); Vn.z=0.0; if ( ( b=Vn%V_dev ) <0. ) t= - ( Vn%X_dev ) /b; } if ( t>0.0 ) // verifico i limiti....in raggi e zeta { Xpos= X_dev+V_dev*t; dxyq=Xpos.x *Xpos.x +Xpos.y*Xpos.y; if ( dxyq <=routq && dxyq >=rinq && fabs ( Xpos.z ) <= Lout.z ) {camm=t; return camm;} // ha colpito il lato ed esco contento.. } // e verifico i limiti in zeta e angolo (note vxyq>0.) // la posizione della particella può essere dentro o fuori il cerchio di raggio rin b=V_dev.x*X_dev.x+V_dev.y*X_dev.y; if( (c=drq-rinq) >0.0) return camm; // return camm=-1.0: punto di partenza più distante di rin dall'asse ... non posso colpire l'interno if ( ( dltq=b*b-vxyq*c ) <0.0 ) return camm; // se il punto è interno è sempre positivo.... t= - ( b - sqrt ( dltq ) ) /vxyq; // devo scegliere comunque la soluzione positiva if ( t>0.0 ) { Xpos= X_dev+V_dev*t; fi= atan2 ( X_dev.y,X_dev.x ); if ( abs ( fi ) > OpenSector ) return camm; if ( fabs ( Xpos.z ) > Lout.z ) return camm; camm=t; } return camm; }
double DevSector::CamInter | ( | ) | [virtual] |
i piani laterali... a +alfa e -alfa
verifico se colpisce la parte curva minore del settore, dall'interno del settore
Reimplemented from DevCln.
Definition at line 153 of file devsector.cpp.
{ double b,c,dltq,t=1.0e+11; gvet Vn,Xpos; camm=DevCln::CamInter(); Vn.x=-sin ( OpenSector ); Vn.y= cos ( OpenSector ); Vn.z=0.0; if ( ( b=Vn%V_dev ) >0. ) t= - ( Vn%X_dev ) /b; else { Vn.x=sin ( OpenSector ); Vn.y=cos ( OpenSector ); if ( ( b=Vn%V_dev ) >0. ) t= - ( Vn%X_dev ) /b; } if ( t<camm ) { Xpos= X_dev+V_dev*t; double dxyq=Xpos.x *Xpos.x +Xpos.y*Xpos.y; if ( dxyq <=routq && dxyq >=rinq && fabs ( Xpos.z ) <= Lout.z ) camm=t; // ha colpito un piano laterale } if ( vxyq>0.0 ) { b=V_dev.x*X_dev.x+V_dev.y*X_dev.y; if ( b<0. ) // revised 31.07.01 gmp { c=drq-rinq; if ( ( dltq=b*b-vxyq*c ) >=0.0 ) { t= - ( b + sqrt ( dltq ) ) /vxyq; // Scelgo la soluzione minore if ( t<camm ) { Xpos= X_dev+V_dev*t; double fi= atan2 ( X_dev.y,X_dev.x ); if ( abs ( fi ) > OpenSector ) return camm; if ( fabs ( Xpos.z ) > Lin.z ) return camm; camm=t; } } } } return camm; }
dal device al lab con traslazione e poi rotazione
attenzione qui prima si trasla poi si ruota ....a differenza della procedura base
Reimplemented from Device.
Definition at line 226 of file devsector.cpp.
{ // trasformazione di vettori dal Dev al lab con traslazione... // non calcola la norma... /* static gvet _Xlab; _Xlab=Nx*Xdev[0] + Ny*Xdev[1] + Nz*Xdev[2]; _Xlab=_Xlab+Centro; return _Xlab; */ static gvet _Xlab, _Xaux; _Xaux=Xdev+Centro; _Xlab=Nx*_Xaux[0] + Ny*_Xaux[1] + Nz*_Xaux[2]; return _Xlab; }
dal laboratorio con rotazione e traslazione
prima si ruota e poi si trasla.... necessario poichè il settore può essere ruotato attorno a z
Reimplemented from Device.
Definition at line 210 of file devsector.cpp.
{ // trasformazione di vettori al dev con rototraslazione... // la procedura qui è invertita rispetto al metodo di base... static gvet _Xdc,_Xdev; _Xdc.setvn (Xin%Nx,Xin%Ny,Xin%Nz ); _Xdev=_Xdc-Centro; return _Xdev; }
int DevSector::Posizione | ( | ) | [virtual] |
se qui se la particella è interno al cilindro ma....
Reimplemented from DevCln.
Definition at line 42 of file devsector.cpp.
{ if ( DevCln::Posizione() >0 ) return 1; // ritorn 1: il punto e' esterno al cilindro in cui è inscritto il settore // il centro del cilindro non è detto che sia sull'asse z! // verifico se il punto è interno al settore cilindrico. // Il vertice del settore corrisponde al centro coordinate del device. // L'asse x è mediano al settore. La semiapertura è // OpenSector= x rad. // verifico se il punto è interno al settore cilindrico // che suppongo avere un raggio maggiore rout già verificato // e un raggio minore rin che verifico ora if ( ( X_dev.x*X_dev.x+X_dev.y*X_dev.y ) <rinq ) return 1; double fi= atan2 ( X_dev.y,X_dev.x ); if ( abs ( fi ) > OpenSector ) return 1; return 0; // zero se interno, 1 se esterno. }