当前位置: 首页>>代码示例>>C++>>正文


C++ OBUnitCell::GetOrthoMatrix方法代码示例

本文整理汇总了C++中OBUnitCell::GetOrthoMatrix方法的典型用法代码示例。如果您正苦于以下问题:C++ OBUnitCell::GetOrthoMatrix方法的具体用法?C++ OBUnitCell::GetOrthoMatrix怎么用?C++ OBUnitCell::GetOrthoMatrix使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在OBUnitCell的用法示例。


在下文中一共展示了OBUnitCell::GetOrthoMatrix方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: 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
开发者ID:gabrielelanaro,项目名称:avogadro,代码行数:87,代码来源:unitcellextension.cpp


注:本文中的OBUnitCell::GetOrthoMatrix方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。