/********************************************************************** Cube - Primitive class to encapsulate volumetric data Copyright (C) 2008 Marcus D. Hanwell This file is part of the Avogadro molecular editor project. For more information, see Avogadro is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Avogadro is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **********************************************************************/ #ifndef CUBE_H #define CUBE_H #include #include namespace Avogadro { class Molecule; class CubePrivate; class A_EXPORT Cube : public Primitive { Q_OBJECT public: Cube(QObject *parent=0); ~Cube(); /** * @return The minimum point in the cube. */ Eigen::Vector3d min() const { return m_min; } /** * @return The maximum point in the cube. */ Eigen::Vector3d max() const { return m_max; } /** * @return The spacing of the grid. */ Eigen::Vector3d spacing() const { return m_spacing; } /** * @return The x, y and z dimensions of the cube. */ Eigen::Vector3i dimensions() const { return m_points; } /** * Set the limits of the cube. * @param min The minimum point in the cube. * @param max The maximum point in the cube. * @param points The number of (integer) points in the cube. */ bool setLimits(const Eigen::Vector3d &min, const Eigen::Vector3d &max, const Eigen::Vector3i &points); /** * Set the limits of the cube. * @param min The minimum point in the cube. * @param max The maximum point in the cube. * @param spacing The interval between points in the cube. */ bool setLimits(const Eigen::Vector3d &min, const Eigen::Vector3d &max, double spacing); /** * Set the limits of the cube. * @param min The minimum point in the cube. * @param dim The integer dimensions of the cube in x, y and z. * @param spacing The interval between points in the cube. */ bool setLimits(const Eigen::Vector3d &min, const Eigen::Vector3i &dim, double spacing); /** * Set the limits of the cube - copy the limits of an existing Cube. * @param cube Existing Cube to copy the limits from. */ bool setLimits(const Cube &cube); /** * Set the limits of the cube by the molecule supplied with padding. * @param mol The molecule to use when finding bounds. * @param spacing The interval between points in the cube. * @param padding The padding to use around the extents of the molecule. */ bool setLimits(const Molecule *mol, double spacing, double padding); /** * @return Vector containing all the data in a one-dimensional array. */ std::vector * data(); /** * Set the values in the cube to those passed in the vector. */ bool setData(const std::vector &values); /** * Adds the values in the cube to those passed in the vector. */ bool addData(const std::vector &values); /** * @return Index of the point closest to the position supplied. * @param pos Position to get closest index for. */ unsigned int closestIndex(const Eigen::Vector3d &pos) const; /** * @return Index vector of the point closest to the position supplied, in * the form of i, j, k. * @param pos Position to get closest index for. * @return The i, j, k index closest to the position supplied. */ Eigen::Vector3i indexVector(const Eigen::Vector3d &pos) const; /** * @param index Index to be translated to a position. * @return Position of the given index. */ Eigen::Vector3d position(unsigned int index) const; /** * This function is very quick as it just returns the value at the point. * @return Cube value at the integer point i, j, k. */ double value(int i, int j, int k) const; /** * This function is very quick as it just returns the value at the point. * @return Cube value at the integer point pos. */ double value(const Eigen::Vector3i &pos) const; /** * This function uses trilinear interpolation to find the value at points * between those specified in the cube. * @return Cube value at the specified position. * @warning This function is quite computationally expensive and should be * avoided where possible. */ float valuef(const Eigen::Vector3f &pos) const; /** * This function uses trilinear interpolation to find the value at points * between those specified in the cube. * @return Cube value at the specified position. * @warning This function is quite computationally expensive and should be * avoided where possible. */ double value(const Eigen::Vector3d &pos) const; /** * Sets the value at the specified point in the cube. * @param i x compenent of the position. * @param j y compenent of the position. * @param k z compenent of the position. * @param value Value at the specified position. */ bool setValue(int i, int j, int k, double value); /** * Sets the value at the specified index in the cube. * @param i 1-dimenional index of the point to set in the cube. */ bool setValue(unsigned int i, double value); /** * @return The minimum value at any point in the Cube. */ double minValue() const { return m_minValue; } /** * @return The minimum value at any point in the Cube. */ double maxValue() const { return m_maxValue; } void setName(QString name) { m_name = name; } QString name() const { return m_name; } friend class Molecule; private: std::vector m_data; Eigen::Vector3d m_min, m_max, m_spacing; Eigen::Vector3i m_points; double m_minValue, m_maxValue; QString m_name; Q_DECLARE_PRIVATE(Cube) }; inline bool Cube::setValue(unsigned int i, double value) { if (i < m_data.size()) { m_data[i] = value; if (value > m_maxValue) m_maxValue = value; if (value < m_minValue) m_minValue = value; return true; } else return false; } } // End namespace Avogadro #endif