// Action_Principal::DoAction() Action::RetType Action_Principal::DoAction(int frameNum, ActionFrame& frm) { Matrix_3x3 Inertia; Vec3 Eval; frm.Frm().CalculateInertia( mask_, Inertia ); // NOTE: Diagonalize_Sort_Chirality places sorted eigenvectors in rows. Inertia.Diagonalize_Sort_Chirality( Eval, debug_ ); if (outfile_ != 0) { int fn = frameNum+1; outfile_->Printf("%i EIGENVALUES: %f %f %f\n%i EIGENVECTOR 0: %f %f %f\n%i EIGENVECTOR 1: %f %f %f\n%i EIGENVECTOR 2: %f %f %f\n", fn, Eval[0], Eval[1], Eval[2], fn, Inertia[0], Inertia[1], Inertia[2], fn, Inertia[3], Inertia[4], Inertia[5], fn, Inertia[6], Inertia[7], Inertia[8]); //Eval.Print("PRINCIPAL EIGENVALUES"); //Inertia.Print("PRINCIPAL EIGENVECTORS (Rows)"); } if (vecData_ != 0) { vecData_->AddMat3x3( Inertia ); valData_->AddVxyz( Eval ); } // Rotate - since Evec is already transposed (eigenvectors // are returned in rows) just do plain rotation to affect an // inverse rotation. if (doRotation_) { frm.ModifyFrm().Rotate( Inertia ); return Action::MODIFY_COORDS; } return Action::OK; }
void Action_Vector::Principal(Frame const& currentFrame) { Matrix_3x3 Inertia; Vec3 Eval; // Origin is center of atoms in mask_ Vec3 OXYZ = currentFrame.CalculateInertia( mask_, Inertia ); // NOTE: Diagonalize_Sort_Chirality places sorted eigenvectors in rows. Inertia.Diagonalize_Sort_Chirality( Eval, 0 ); // Eval.Print("PRINCIPAL EIGENVALUES"); // Inertia.Print("PRINCIPAL EIGENVECTORS (Rows)"); if ( mode_ == PRINCIPAL_X ) Vec_->AddVxyz( Inertia.Row1(), OXYZ ); // First row = first eigenvector else if ( mode_ == PRINCIPAL_Y ) Vec_->AddVxyz( Inertia.Row2(), OXYZ ); // Second row = second eigenvector else // PRINCIPAL_Z Vec_->AddVxyz( Inertia.Row3(), OXYZ ); // Third row = third eigenvector }