我正在尝试为正在使用CGAL的nD Delaunay三角剖分算法的项目在N个维度上实现Schlomer's Max Min Dist sets。我可以编译并运行示例代码,但是当将三角剖分合并到集合的类中时,在插入一些点后出现内存访问错误。据我所知,除了三角剖分生活在类实例的内存空间而不是主要的内存之外,我与示例代码的区别不大。我使用的是Dynamic_Dimension_tag而不是编译时固定的三角剖分,但是我对示例代码进行了调整以做到相同,这很好。我将在下面对标头和源进行采样,详细说明我用于加分的方法。另一组经验丰富的眼睛将不胜感激。
标题:
#include <boost/container/vector.hpp>
#include <CGAL\Epick_d.h>
#include <CGAL\Delaunay_triangulation.h>
#include <iostream>
using namespace boost::container;
typedef CGAL::Triangulation<CGAL::Epick_d<CGAL::Dynamic_dimension_tag>> T;
class DllExport MaxMinDist
{
public:
MaxMinDist(int);
const vector<T::Point>& points() const;
int createPointsFromData(const vector<double>&);
int dimension(void) const;
int size(void) const;
private:
T dt_;
vector<T::Point> points_;
double localMinDist(const T::Point&);
double globalMinDist(void);
double averageMinDist(void);
void iterateGlobalFPO(void);
void iterateLocalFPO(void);
double toroidalDistanceOnAxis(double, double);
double toroidalSquaredDistance(const T::Point&, const T::Point&);
};
来源:
int MaxMinDist::createPointsFromData(const vector<double>& data)
{
// data supplied doesn't match the dimension
if (data.size() % dimension() != 0) return -1;
// break up the data into points
points_.reserve(data.size() % dimension());
for (auto iter = data.begin(); iter != data.end(); iter += dimension()) {
T::Point p(iter, iter + dimension());
points_.push_back(p);
}
// add the points to the triangulation
T::Vertex_handle hint;
int i = 0;
for (auto pt_iter = points_.begin(); pt_iter != points_.end(); ++pt_iter) {
std::cout << "Processing: " << *pt_iter << ", " << ++i << " of " << int(points_.size()) << std::endl;
if (T::Vertex_handle() != hint) {
hint = dt_.insert(*pt_iter, hint);
}
else {
hint = dt_.insert(*pt_iter);
}
}
return 0;
引发异常的函数是NT_Convertor,它在CGAL命名空间的NT_Convertor.h中定义。
NT_Convertor
template < class NT1, class NT2 >
struct NT_converter
: public CGAL::unary_function< NT1, NT2 >
{
NT2
operator()(const NT1 &a) const
{
return NT2(a); <-- source of exception
}
};
好的,进一步发展。
检查堆栈帧时,我注意到具有例外功能的库为“ C:\ Program Files \ Autodesk \ Maya2018 \ bin \ libgmp-10.dll”。主项目是Autodesk Maya的插件。不幸的是,同一个库是CGAL安装的一部分。 CGAL在链接文件夹中有其自己的DLL副本。我从项目中将MaxMinDistSet类移到了一个新的单独项目中,只是一个本身的库,尤其是没有OpenMaya的包含或链接。测试该单独的项目是否成功。我能够将测试夹具中的所有点添加到Triangulation中。因此,问题似乎出在CGAL的libgmp-10.dll和Maya的libgmp-10.dll之间。
接下来的问题是,可以构建CGAL来静态嵌入其库的版本,还是有一种更正确的方法来解决冲突?