Рассмотрим два геометрических объекта в 3D:
- куб, выровненный с осями и определяемый положением его центра и его протяженностью (длина края)
- конус, не выровненный с осями и определяемый положением его вершины, расположением центра его основания и полууголом в вершине
Вот небольшой код для определения этих объектов в С++:
// Preprocessor
#include <iostream>
#include <cmath>
#include <array>
// 3D cube from the position of its center and the side extent
class cube
{
public:
cube(const std::array<double, 3>& pos, const double ext)
: _position(pos), _extent(ext)
{;}
double center(const unsigned int idim)
{return _position[idim];}
double min(const unsigned int idim)
{return _position[idim]-_extent/2;}
double max(const unsigned int idim)
{return _position[idim]+_extent/2;}
double extent()
{return _extent;}
double volume()
{return std::pow(_extent, 3);}
protected:
std::array<double, 3> _position;
double _extent;
};
// 3d cone from the position of its vertex, the base center, and the angle
class cone
{
public:
cone(const std::array<double, 3>& vert,
const std::array<double, 3>& bas,
const double ang)
: _vertex(vert), _base(bas), _angle(ang)
{;}
double vertex(const unsigned int idim)
{return _vertex[idim];}
double base(const unsigned int idim)
{return _base[idim];}
double angle()
{return _angle;}
double height()
{return std::sqrt(std::pow(_vertex[0]-_base[0], 2)+std::pow(
_vertex[1]-_base[1], 2)+std::pow(_vertex[2]-_base[2], 2));}
double radius()
{return std::tan(_angle)*height();}
double circle()
{return 4*std::atan(1)*std::pow(radius(), 2);}
double volume()
{return circle()*height()/3;}
protected:
std::array<double, 3> _vertex;
std::array<double, 3> _base;
double _angle;
};
Я хотел бы написать функцию, чтобы определить, пусто или нет пересечение куба и конуса:
// Detect whether the intersection between a 3d cube and a 3d cone is not null
bool intersection(const cube& x, const cone& y)
{
// Function that returns false if the intersection of x and y is empty
// and true otherwise
}
Вот иллюстрация проблемы (иллюстрация в 2D, но моя проблема в 3D):
Как это сделать эффективно (я ищу алгоритм, поэтому ответ может быть в C, С++ или Python)?
Примечание. Здесь пересечение определяется как: он содержит ненулевой объем 3D, который находится в кубе и в конусе (если куб находится внутри конуса, или если конус находится внутри куба, они пересекаются).