void ImRON2ParmEllipse ( REAL & A, REAL & B, REAL & C, const Pt2dr & aV0, const Pt2dr & aV1 ) { ElMatrix<REAL> aMat(2,2); SetCol(aMat,0,aV0); SetCol(aMat,1,aV1); aMat = gaussj(aMat); aMat = aMat.transpose() * aMat; ElMatrix<REAL> aVecP(2,2); ElMatrix<REAL> aValP(2,2); jacobi_diag(aMat,aValP,aVecP); aValP(0,0) = sqrt(aValP(0,0)); aValP(1,1) = sqrt(aValP(1,1)); ElMatrix<REAL> aABC = aVecP * aValP * aVecP.transpose(); A = aABC(0,0); B = aABC(1,0); C = aABC(1,1); }
void cResOptInterFaisceaux::Init(const ElMatrix<double> & aMat) { ElMatrix<double> aVecP(3,3),aValP(1,3); std::vector<int> aInd = jacobi(aMat,aValP,aVecP); mVal1 = aValP(aInd[0],0); mVal2 = aValP(aInd[1],0); mVal3 = aValP(aInd[2],0); aVecP.GetCol(aInd[0],mVec1); aVecP.GetCol(aInd[1],mVec2); aVecP.GetCol(aInd[2],mVec3); }
bool EllipseEq2ParamPhys ( REAL & V1, REAL & V2, REAL & teta, REAL A, REAL B, REAL C ) { ElMatrix<REAL> aMat(2,2); aMat(0,0) = A; aMat(1,0) = B; aMat(0,1) = B; aMat(1,1) = C; ElMatrix<REAL> aVecP(2,2); ElMatrix<REAL> aValP(2,2); jacobi_diag(aMat,aValP,aVecP); if ((aValP(0,0) <=0) || (aValP(1,1) <= 0)) return false; V1 = 1 / aValP(0,0); V2 = 1 / aValP(1,1); teta = angle(Pt2dr(aVecP(0,0),aVecP(0,1))); if (V1 < V2) { ElSwap(V1,V2); teta += PI/2; if (teta> PI) teta -= PI; } return true; }