1. CGAL庫簡介
CGAL(Computational Geometry Algorithms Library)是一個開源的計算幾何算法庫,主要用于處理幾何問題和相關算法的實現。它提供了豐富的幾何數據結構和高效算法,覆蓋點、線、多邊形、曲面等基本幾何對象的表示與操作,以及凸包、三角剖分、網格生成、路徑規劃等經典幾何算法。該庫以C++為核心實現,同時支持Python、Java等語言擴展,能夠在Windows、Linux、macOS等多平臺運行。其應用領域廣泛,涉及計算機圖形學、地理信息系統、機器人學、計算機輔助設計等多個行業,尤其在需要高精度幾何計算和復雜算法的場景中表現突出。CGAL遵循GPL和LGPL開源協議,開發者可以自由使用和修改代碼,但由于其涉及較高階的幾何理論,學習和應用時可能需要一定的專業知識儲備。
2. 下載CGAL庫
在GitHub下載以下兩個文件https://github.com/CGAL/cgal/releases
- 下載:CGAL-5.6-win64-auxiliary-libraries-gmp-mpfr.zip、cgal-5.6.zip
將CGAL-5.6.zip解壓到D:\CGAL-5.6
文件夾下,將GMP and MPFR libraries解壓后的auxiliary文件夾復制到D:\CGAL-5.6\CGAL-5.6\auxiliary
文件夾中。
3. 安裝Boost
Boost下載地址:https://sourceforge.net/projects/boost/files/boost-binaries/
VS2022下載這個:boost_1_82_0-msvc-14.3-64.exe
下載完安裝到目錄:D:\cgal-5.6\boost_1_82_0
4. 設置系統環境變量
變量名 | 變量值 |
---|---|
BOOST_INCLUDEDIR | D:\cgal-5.6\boost_1_82_0 |
BOOST_LIBRARYDIR | D:\cgal-5.6\boost_1_82_0\lib64-msvc-14.3 |
CGAL_DIR | D:\cgal-5.6\cgal-5.6 |
系統環境變量PATH
:增加D:\cgal-5.6\boost_1_82_0\lib64-msvc-14.3
5. 在 VS2022 中配置項目以使用 CGAL
包含目錄:在項目屬性頁(右鍵點擊項目 -> 屬性)中,選擇 “配置屬性” -> “C/C++” -> “常規” -> “附加包含目錄”,添加以下目錄:
D:\cgal-5.6\cgal-5.6\auxiliary\gmp\include
D:\cgal-5.6\CGAL-5.6\include
D:\cgal-5.6\boost_1_82_0
庫目錄:在 “配置屬性” -> “鏈接器” -> “常規” -> “附加庫目錄” 中,添加 CGAL 庫和 Boost 庫的目錄,例如:
D:\cgal-5.6\cgal-5.6\auxiliary\gmp\lib
D:\cgal-5.6\boost_1_82_0\lib64-msvc-14.3
附加依賴項:在 “配置屬性” -> “鏈接器” -> “輸入” -> “附加依賴項” 中,添加:
libgmp-10.lib
libmpfr-4.lib
6. 測試配置
在 VS2022 中創建一個新的 C++ 控制臺項目,編寫以下簡單的 CGAL 代碼進行測試:
#include <iostream>
#include <CGAL/Simple_cartesian.h>typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;int main()
{Point_2 p(1, 1), q(10, 10);std::cout << "p = " << p << std::endl;std::cout << "q = " << q.x() << " " << q.y() << std::endl;std::cout << "sqdist(p,q) = "<< CGAL::squared_distance(p, q) << std::endl;Segment_2 s(p, q);Point_2 m(5, 9);std::cout << "m = " << m << std::endl;std::cout << "sqdist(Segment_2(p,q), m) = "<< CGAL::squared_distance(s, m) << std::endl;std::cout << "p, q, and m ";switch (CGAL::orientation(p, q, m)) {case CGAL::COLLINEAR:std::cout << "are collinear\n";break;case CGAL::LEFT_TURN:std::cout << "make a left turn\n";break;case CGAL::RIGHT_TURN:std::cout << "make a right turn\n";break;}std::cout << " midpoint(p,q) = " << CGAL::midpoint(p, q) << std::endl;return 0;
}