mirror of https://github.com/CGAL/cgal
153 lines
4.0 KiB
C++
153 lines
4.0 KiB
C++
/* Copyright 2004
|
|
Stanford University
|
|
|
|
This file is part of the DSR PDB Library.
|
|
|
|
The DSR PDB Library is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU Lesser General Public License as published by
|
|
the Free Software Foundation; either version 2.1 of the License, or (at your
|
|
option) any later version.
|
|
|
|
The DSR PDB Library 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 Lesser General Public
|
|
License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
along with the DSR PDB Library; see the file LICENSE.LGPL. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
#ifndef CGAL_DSR_PDB_POINT_H
|
|
#define CGAL_DSR_PDB_POINT_H
|
|
#include <CGAL/PDB/basic.h>
|
|
#include <iostream>
|
|
|
|
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
|
#include <CGAL/squared_distance_3.h>
|
|
|
|
CGAL_PDB_BEGIN_NAMESPACE
|
|
// An alternative point class.
|
|
typedef CGAL::Exact_predicates_inexact_constructions_kernel::Point_3 Point;
|
|
typedef CGAL::Exact_predicates_inexact_constructions_kernel::Vector_3 Vector;
|
|
|
|
struct Squared_distance{
|
|
double operator()(const Point &a, const Point &b) const {
|
|
return CGAL::squared_distance(a,b);
|
|
}
|
|
};
|
|
|
|
//! Functor to compute the squared norm of a Vector
|
|
struct Squared_norm{
|
|
double operator()(const Vector &v) const {
|
|
return v.x()*v.x()+v.y()*v.y()+ v.z()*v.z();
|
|
}
|
|
};
|
|
|
|
//! Functor to compute the cross product of two vectors
|
|
struct Cross_product{
|
|
Vector operator()(const Vector &a, const Vector &b) const {
|
|
double x = a.y() * b.z() - b.y() * a.z();
|
|
double y = a.z() * b.x() - b.z() * a.x();
|
|
double z = a.x() * b.y() - b.x() * a.y();
|
|
|
|
return Vector(x,y,z);
|
|
}
|
|
};
|
|
|
|
/*!
|
|
This class represents a point in spherical coordinates.
|
|
*/
|
|
struct Spherical_point{
|
|
//! Construct a spherical point from coordinates.
|
|
Spherical_point(double r, double theta, double phi) {
|
|
phi_=phi;
|
|
theta_=theta;
|
|
r_=r;
|
|
}
|
|
|
|
//! Construct a point from a vector.
|
|
Spherical_point(const Vector &v) {
|
|
double xy2=v.x()*v.x()+v.y()*v.y();
|
|
double sd= std::sqrt(xy2+v.z()*v.z());
|
|
r_=sd;
|
|
theta_= std::atan2(v.y(), v.x());
|
|
double xy=std::sqrt(xy2);
|
|
phi_= std::atan2(v.z(), xy);
|
|
}
|
|
|
|
Spherical_point(){}
|
|
|
|
//! The r component.
|
|
double r() const {
|
|
return r_;
|
|
}
|
|
|
|
|
|
//! The polar angle.
|
|
double phi() const {
|
|
return phi_;
|
|
}
|
|
|
|
//! The azimuthal angle in the x-y plane.
|
|
double theta() const {
|
|
return theta_;
|
|
}
|
|
|
|
private:
|
|
double phi_, theta_, r_;
|
|
|
|
};
|
|
|
|
|
|
//! Construct a spherical point with a certain axis.
|
|
/*! \note This class is poorly designed having two completely
|
|
separate usages just sharing internal code.
|
|
*/
|
|
struct Construct_spherical_point{
|
|
Construct_spherical_point(const Vector &xaxis,
|
|
const Vector &zaxis){
|
|
make_axis(xaxis, zaxis);
|
|
base_=Point(0,0,0);
|
|
}
|
|
|
|
Construct_spherical_point(const Point &p,
|
|
const Point &pop,
|
|
const Point &popop){
|
|
base_=p;
|
|
make_axis(p-pop, popop-pop);
|
|
}
|
|
|
|
//! Construct the spherical coordinates of a vector.
|
|
Spherical_point operator()(const Vector &v) const {
|
|
double vz= v*z_;
|
|
double vx= v*x_;
|
|
double vy= v*y_;
|
|
return Spherical_point(vx, vy, vz);
|
|
};
|
|
|
|
//! Construct the spherical coordinates of a point relative to the base passed in the constructor.
|
|
Spherical_point operator()(const Point &p) const {
|
|
return operator()(p-base_);
|
|
}
|
|
|
|
private:
|
|
void make_axis(const Vector &xaxis,
|
|
const Vector &zaxis){
|
|
Squared_norm sn;
|
|
z_= zaxis/sn(zaxis);
|
|
Vector xmz= xaxis- (xaxis*z_)*z_;
|
|
x_= xmz/sn(xmz);
|
|
Cross_product cp;
|
|
y_= cp(z_, x_);
|
|
}
|
|
|
|
Vector z_;
|
|
Vector x_;
|
|
Vector y_;
|
|
Point base_;
|
|
};
|
|
|
|
CGAL_PDB_END_NAMESPACE
|
|
#endif
|