本文整理汇总了C++中OBUnitCell::GetFractionalMatrix方法的典型用法代码示例。如果您正苦于以下问题:C++ OBUnitCell::GetFractionalMatrix方法的具体用法?C++ OBUnitCell::GetFractionalMatrix怎么用?C++ OBUnitCell::GetFractionalMatrix使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类OBUnitCell
的用法示例。
在下文中一共展示了OBUnitCell::GetFractionalMatrix方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: WriteMolecule
bool FreeFormFractionalFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv)
{
OBMol* pmol = dynamic_cast<OBMol*>(pOb);
if(pmol==NULL)
return false;
//Define some references so we can use the old parameter names
ostream &ofs = *pConv->GetOutStream();
OBMol &mol = *pmol;
char buffer[BUFF_SIZE];
OBUnitCell *uc = NULL;
ofs << mol.GetTitle() << endl;
if (!mol.HasData(OBGenericDataType::UnitCell))
ofs << " 1.00000 1.00000 1.00000 90.00000 90.00000 90.00000\n";
else
{
uc = (OBUnitCell*)mol.GetData(OBGenericDataType::UnitCell);
snprintf(buffer, BUFF_SIZE,
"%10.5f%10.5f%10.5f%10.5f%10.5f%10.5f",
uc->GetA(), uc->GetB(), uc->GetC(),
uc->GetAlpha() , uc->GetBeta(), uc->GetGamma());
ofs << buffer << "\n";
}
vector3 v;
FOR_ATOMS_OF_MOL(atom, mol)
{
v = atom->GetVector();
if (uc != NULL)
v *= uc->GetFractionalMatrix();
snprintf(buffer, BUFF_SIZE, "%s %10.5f%10.5f%10.5f",
etab.GetSymbol(atom->GetAtomicNum()),
v.x(),
v.y(),
v.z());
ofs << buffer << endl;
}
示例2: fillUnitCell
void UnitCellExtension::fillUnitCell()
{
/* Change coords back to inverse space, apply the space group transforms
* then change coords back to real space
*/
if (!m_molecule) {
return;
}
OBUnitCell *uc = m_molecule->OBUnitCell();
if (uc == NULL)
return;
const SpaceGroup *sg = uc->GetSpaceGroup(); // the actual space group and transformations for this unit cell
if (!sg) {
QMessageBox::warning(qobject_cast<QWidget*>(parent()),
tr("Avogadro"),
tr("This unit cell does not have an associated spacegroup."));
return;
}
// We operate on a copy of the Avogadro molecule
// For each atom, we loop through:
// * convert the coords back to inverse space
// * apply the transformations
// * create new (duplicate) atoms
OBMol mol = m_molecule->OBMol();
vector3 uniqueV, newV;
list<vector3> transformedVectors; // list of symmetry-defined copies of the atom
list<vector3>::iterator transformIterator, duplicateIterator;
vector3 updatedCoordinate;
bool foundDuplicate;
OBAtom *addAtom;
QList<OBAtom*> atoms; // keep the current list of unique atoms -- don't double-create
list<vector3> coordinates; // all coordinates to prevent duplicates
FOR_ATOMS_OF_MOL(atom, mol)
atoms.push_back(&(*atom));
foreach(OBAtom *atom, atoms) {
uniqueV = atom->GetVector();
// Assert: won't crash because we already ensure uc != NULL
#ifdef OPENBABEL_IS_NEWER_THAN_2_2_99
uniqueV = uc->CartesianToFractional(uniqueV);
#else
uniqueV *= uc->GetFractionalMatrix();
#endif
uniqueV = transformedFractionalCoordinate(uniqueV);
coordinates.push_back(uniqueV);
transformedVectors = sg->Transform(uniqueV);
for (transformIterator = transformedVectors.begin();
transformIterator != transformedVectors.end(); ++transformIterator) {
// coordinates are in reciprocal space -- check if it's in the unit cell
// if not, transform it in place
updatedCoordinate = transformedFractionalCoordinate(*transformIterator);
foundDuplicate = false;
// Check if the transformed coordinate is a duplicate of an atom
for (duplicateIterator = coordinates.begin();
duplicateIterator != coordinates.end(); ++duplicateIterator) {
if (duplicateIterator->distSq(updatedCoordinate) < 1.0e-4) {
foundDuplicate = true;
break;
}
}
if (foundDuplicate)
continue;
addAtom = mol.NewAtom();
addAtom->Duplicate(atom);
#ifdef OPENBABEL_IS_NEWER_THAN_2_2_99
addAtom->SetVector(uc->FractionalToCartesian(updatedCoordinate));
#else
addAtom->SetVector(uc->GetOrthoMatrix() * updatedCoordinate);
#endif
} // end loop of transformed atoms
// Put the original atom into the proper space in the unit cell too
#ifdef OPENBABEL_IS_NEWER_THAN_2_2_99
atom->SetVector(uc->FractionalToCartesian(uniqueV));
#else
atom->SetVector(uc->GetOrthoMatrix() * uniqueV);
#endif
} // end loop of atoms