windos下安裝cgal 如果沒有其他需要(cmake默認設置),需要準備三個庫:gmp 、mpfr 、boost。如果需要其他設置的話,看需求增加其他庫,我需要eigen3,這裏以eigen3爲例如何增加新的模塊。如果你需要其他的類似。(感覺這種開源庫在windos下玩對於我這種菜鳥來說就是天坑,使用時候各種小問題)
1 cmake配置
根據上邊介紹,我們需要準備:
- cgal安裝包(現在版本是5.02,我原來工程是用的4.14,搬家到windos我就不用最新版了)
https://github.com/CGAL/cgal/releases
下載setup.exe 或者Source Code。兩個區別不大,就是沒有編譯好的gmp 和mpfr。如果你下載exe,那麼就不用再下載這兩個了。
gmp https://gmplib.org/
mpfr https://www.mpfr.org/
爲了截個圖安裝圖,我下載的5.02。這裏看個人,我不喜歡加一堆系統路徑,所有這種需要編譯的庫,一律沒有加系統路徑。
- boost 下載安裝就行,這裏有編譯好的版本,如果沒有合適的要自己編譯
https://sourceforge.net/projects/boost/files/boost-binaries/1.72.0/
- eigen3 下載編譯後的就可以
http://eigen.tuxfamily.org/index.php?title=Main_Page
2 編譯CGAL
-
按照上部應該是準備好了幾個東西 C:\local\boost_1_72_0
-
打開cmake-gui 並設置
-
vs 編譯一下(debug和release)
-
編譯完成你的靜態庫和動態庫就都好了
3 測試、使用
怎麼說吧,基本上windos下庫編譯完了都是讓你放到系統path裏。爲了方便找所以我只加了一個WorkDLL,把剛纔編譯好的放進去。(cgal debug和release 名稱不同,一塊放就行,如果是相同的庫,只放release)
- 使用(靜態鏈接),如果動態的話 target_link_libraries里加-l,在增加dll的路徑。
set(CGAL_DIR "D:/lib/CGAL/bulid")
find_package(CGAL REQUIRED)
include(${CGAL_USE_FILE})
target_link_libraries(
${PROJECT_NAME}
${CGAL_LIBS}
)
- 測試函數(自相交檢測)
bool CgalSelfIntersection(const char *filename,
QList<quint32> &self_intersected_list,
QList<quint32> &self_intersected_delete_list) {
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Surface_mesh<K::Point_3> Mesh;
typedef boost::graph_traits<Mesh>::face_descriptor face_descriptor;
namespace PMP = CGAL::Polygon_mesh_processing;
using namespace std;
ifstream input(filename);
Mesh mesh;
if (!input) {
qWarning() << "off文件打開錯誤";
return 0;
}
std::vector<K::Point_3> points;
std::vector<std::vector<std::size_t> > polygons;
if(!input || !CGAL::read_OFF(input, points, polygons) || points.empty()) {
qWarning() << "Cannot open file ";
return 0;
}
CGAL::Polygon_mesh_processing::orient_polygon_soup(points, polygons);
CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(points, polygons, mesh);
input.close();
bool intersecting = PMP::does_self_intersect(mesh,
PMP::parameters::vertex_point_map(get(CGAL::vertex_point, mesh)));
qDebug() << (intersecting ?
"存在自相交" : "不存在自相交");
QVector<pair<face_descriptor, face_descriptor> > intersected_tris;
PMP::self_intersections(mesh, back_inserter(intersected_tris));
qDebug() << intersected_tris.size() << "對三角形相交";
QVector<pair<face_descriptor, face_descriptor>>::iterator iter;
for (iter = intersected_tris.begin(); iter != intersected_tris.end(); iter++) {
self_intersected_list << iter->first << iter->second;
}
self_intersected_delete_list = self_intersected_list;
return 1;
}
4 如何打包
上邊cmkae裏是靜態鏈接,生成的exe需要cgal的dll,在cgal編譯的bin裏把需要的dll跟自己生成的exe一起打包就好。