void radTg3dRelax::Push_backCenterPointAndField(radTFieldKey* pFieldKey, radTVectPairOfVect3d* pVectPairOfVect3d, radTrans* pBaseTrans, radTg3d* g3dSrcPtr, radTApplication* pAppl) {// Attention: this assumes no more than one transformation with mult. no more than 1 !!! TVector3d CP = CentrPoint; radTrans* pTrans = (g3dListOfTransform.empty())? 0 : (radTrans*)((*(g3dListOfTransform.begin())).Handler_g.rep); radTrans TotTrans; if(pTrans != 0) { if(pBaseTrans != 0) { TrProduct(pBaseTrans, pTrans, TotTrans); pTrans = &TotTrans; } } else { if(pBaseTrans != 0) pTrans = pBaseTrans; } if(pTrans != 0) CP = pTrans->TrPoint(CP); radTPairOfVect3d Pair(CP); if(pFieldKey->J_) return; else if(pFieldKey->M_) Pair.V2 = (pTrans == 0)? Magn : pTrans->TrVectField(Magn); else { radTCompCriterium CompCriterium; TVector3d ZeroVect(0.,0.,0.); radTField Field(*pFieldKey, CompCriterium, CP, ZeroVect, ZeroVect, ZeroVect, ZeroVect, 0.); g3dSrcPtr->B_genComp(&Field); Pair.V2 = (pFieldKey->B_)? Field.B : ((pFieldKey->H_)? Field.H : ((pFieldKey->A_)? Field.A : ZeroVect)); } pVectPairOfVect3d->push_back(Pair); }
void srTShapedOptElem::SetupNativeTransformation() {//ATTENTION: from fere on, "optical" frame is assumed, i.e: //x-hor., y-vert., z-longitudinal //the transformation found here orients the optical element with respect to incident beam //const double Pi = 3.141592653589793; //double RelTol = 1.E-10; //TVector3d N0Loc(0.,0.,1.), Zero(0.,0.,0.); //TVector3d eVert(0.,1.,0.), eHor(1.,0.,0.), eLong(0.,1.,0.); TVector3d Zero(0.,0.,0.); gmTrans *pTotalTrans = new gmTrans(); SetupPreOrient(*pTotalTrans); //virtual //pTotalTrans->SetupRotation(Zero, eVert, Pi); int arAxRot[] = {m_axRot1, m_axRot2, m_axRot3}; double arAngRot[] = {m_angRot1, m_angRot2, m_angRot3}; for(int i=0; i<3; i++) { int axRot = arAxRot[i]; double angRot = arAngRot[i]; if((axRot <= 0) || (angRot == 0)) continue; TVector3d vAxRot(0.,0.,0.); bool axIsCorrect = false; if(axRot == 1) { vAxRot.x = 1.; axIsCorrect = true; } else if(axRot == 2) { vAxRot.y = 1.; axIsCorrect = true; } else if(axRot == 3) { vAxRot.z = 1.; axIsCorrect = true; } if(!axIsCorrect) continue; gmTrans prevTrf(*pTotalTrans), nextRot; nextRot.SetupRotation(Zero, vAxRot, angRot); TrProduct(&nextRot, &prevTrf, *pTotalTrans); } double horSizeLoc, vertSizeLoc; GetElemDimsInLocFrame(horSizeLoc, vertSizeLoc); //FindElemExtentsAlongOptAxes(*pTotalTrans, horSizeLoc, vertSizeLoc, m_extAlongOptAxIn, m_extAlongOptAxOut); //virtual //if(ofstLong != 0.) //{ // TVector3d vOfstTrf(0., 0., ofstLong); //Check this: can be frame-dependent! // gmTrans prevTrf(*pTotalTrans), ofstTrf; // ofstTrf.SetupTranslation(vOfstTrf); // TrProduct(&ofstTrf, &prevTrf, *pTotalTrans); //} if((TransvCenPoint.x != 0.) || (TransvCenPoint.y != 0.)) { TVector3d vOfstTrf(TransvCenPoint.x, TransvCenPoint.y, 0.); //Check this: can be frame-dependent! gmTrans prevTrf(*pTotalTrans), ofstTrf; ofstTrf.SetupTranslation(vOfstTrf); TrProduct(&ofstTrf, &prevTrf, *pTotalTrans); } TransHndl = srTransHndl(pTotalTrans); }