FlyoDoc_2011 Pisa 2011 by GmP --- 011
Public Member Functions | Protected Attributes

DevSector Class Reference

#include <devsector.h>

Inheritance diagram for DevSector:
DevCln Device

List of all members.

Public Member Functions

virtual int Posizione ()
virtual double CamEster ()
virtual double CamInter ()
virtual void Prgeom ()
virtual gvetLab2cDev (gvet &)
 dal laboratorio con rotazione e traslazione
virtual gvetDevc2Lab (gvet &)
 dal device al lab con traslazione e poi rotazione

Protected Attributes

double drinq
double rin
double rinq

Detailed Description

Cilindro: Volume cilindrico senza buco

Author:
Giuseppe Pierazzini

Definition at line 18 of file devsector.h.


Member Function Documentation

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;
}
gvet & DevSector::Devc2Lab ( gvet Xdev) [virtual]

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;


}
gvet & DevSector::Lab2cDev ( gvet Xin) [virtual]

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.


}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables