18#include "rxdock/Coord.h"
20#include <nlohmann/json.hpp>
22using json = nlohmann::json;
40 inline Plane() : m_vnorm(0.0, 0.0, 0.0), m_d(0.0) {}
43 inline Plane(
const Vector &v,
double d) : m_vnorm(v), m_d(d) {
52 m_vnorm = v1.Cross(v2);
53 m_d = -m_vnorm.Dot(c0);
60 friend void to_json(json &j,
const Plane &plane) {
61 j = json{{
"vec-nor", plane.m_vnorm}, {
"dis", plane.m_d}};
64 friend void from_json(
const json &j,
Plane &plane) {
65 j.at(
"vec-nor").get_to(plane.m_vnorm);
66 j.at(
"dis").get_to(plane.m_d);
78 friend std::ostream &operator<<(std::ostream &s,
const Plane &plane) {
79 return s << plane.m_vnorm.xyz(0) <<
"x + " << plane.m_vnorm.xyz(1) <<
"y + "
80 << plane.m_vnorm.xyz(2) <<
"z + " << plane.m_d <<
" = 0";
86 inline double D()
const {
return m_d; }
87 inline Vector VNorm()
const {
return m_vnorm; }
92 inline void Normalise() {
97 double l = m_vnorm.Length();
98 int iSign = (m_d < 0.0) ? 1
100 : (m_vnorm.xyz(2) < 0.0) ? -1
101 : (m_vnorm.xyz(2) > 0.0) ? 1
102 : (m_vnorm.xyz(1) < 0.0) ? -1
120inline double DistanceFromPointToPlane(
const Coord &c0,
const Plane &p) {
122 return c0.Dot(p.VNorm()) + p.D();
126inline double AngleBetweenPlanes(
const Plane &p0,
const Plane &p1) {
127 return Angle(p0.VNorm(), p1.VNorm());
131inline double CosAngleBetweenPlanes(
const Plane &p0,
const Plane &p1) {
132 return Dot(p0.VNorm(), p1.VNorm());