libnest2d-頭文件分析-libnest2d.hpp-幾何類型-策略類型-參數配置

libnest2d 庫的主頭文件,定義了一個用于 二維不規則形狀自動排樣(Nesting) 的C++接口。以下是詳細解析:


1. 頭文件結構

(1) 防止重復包含
#ifndef LIBNEST2D_HPP
#define LIBNEST2D_HPP
// ...
#endif // LIBNEST2D_HPP
  • 確保頭文件只被編譯一次。
(2) 依賴引入
#include <boost/mpl/assert.hpp>
#include <boost/type_traits.hpp>
#include "../libnest2d/backends/clipper/geometries.hpp"
#include <libnest2d/optimizers/nlopt/subplex.hpp>
#include <libnest2d/nester.hpp>
// ... 其他策略頭文件
  • Boost:用于元編程和類型檢查(如 is_integral)。
  • Clipper后端:默認幾何處理庫(多邊形布爾運算)。
  • 優化器:NLopt庫的子模塊(遺傳算法、Subplex局部優化)。
  • 核心模塊:排樣算法(nester.hpp)、放置策略(如 bottomleftplacer)、選擇策略(如 firstfit)。

2. 核心類型定義

(1) 幾何類型
using Point = PointImpl;           // 點類型
using Coord = TCoord<PointImpl>;   // 坐標類型(如int/double)
using Box = _Box<PointImpl>;       // 矩形框
using Item = _Item<PolygonImpl>;   // 待排樣的多邊形項
using Rectangle = _Rectangle<PolygonImpl>; // 矩形項
  • 基于模板的幾何抽象,支持不同后端(如Clipper)。
(2) 策略類型
using NfpPlacer = placers::_NofitPolyPlacer<PolygonImpl, Box>; // 基于NFP的放置
using BottomLeftPlacer = placers::_BottomLeftPlacer<PolygonImpl>; // 左下角放置
using FirstFitSelection = selections::_FirstFitSelection<PolygonImpl>; // 首次適應選擇
  • Placer:決定如何放置形狀(如靠左、靠下或基于NFP)。
  • Selector:決定選擇哪些形狀優先排樣。

3. 靜態庫支持(LIBNEST2D_STATIC

#ifdef LIBNEST2D_STATIC
extern template class _Nester<NfpPlacer, FirstFitSelection>;
// ... 顯式實例化聲明
#endif
  • 顯式實例化模板以減少編譯時間(靜態庫場景)。

4. 配置與控制結構

(1) 排樣配置 NestConfig
template<class Placer = NfpPlacer, class Selector = FirstFitSelection>
struct NestConfig {typename Placer::Config placer_config;  // 放置策略配置typename Selector::Config selector_config; // 選擇策略配置
};
  • 允許用戶自定義策略參數(如遺傳算法的種群大小)。
(2) 排樣控制 NestControl
struct NestControl {ProgressFunction progressfn;  // 進度回調StopCondition stopcond;       // 終止條件
};
  • 實時監控排樣進度(如GUI更新)。
  • 支持提前終止(如超時或用戶中斷)。

5. 核心排樣函數 nest()

(1) 迭代器版本
template<class Placer, class Selector, class Iterator>
std::size_t nest(Iterator from, Iterator to, const typename Placer::BinType& bin, ...);
  • 輸入:形狀迭代器范圍、容器邊界、最小間距、配置。
  • 輸出:使用的容器數量(Bin數量)。
(2) 容器版本
template<class Placer, class Selector, class Container>
std::size_t nest(Container&& cont, const typename Placer::BinType& bin, ...);
  • 包裝迭代器版本,直接接受容器(如 std::vector<Item>)。
(3) 單位轉換工具
template<class T = double>
enable_if_t<std::is_arithmetic<T>::value, TCoord<PointImpl>> mm(T val = T(1));
  • 將毫米值轉換為內部坐標單位(如 mm(10.5))。

6. 設計亮點

(1) 策略模式
  • PlacerSelector 可自由組合(如 NfpPlacer + DJDHeuristic)。
  • 用戶可通過 NestConfig 調整策略參數。
(2) 泛型編程
  • 基于模板的幾何類型(PolygonImpl)和算法,支持不同后端。
  • 使用SFINAE(如 enable_if_t)約束模板類型。
(3) 性能控制
  • 支持顯式模板實例化(靜態庫優化)。
  • 進度回調與終止條件實現異步控制。

7. 使用示例

std::vector<libnest2d::Item> items = { /* 初始化多邊形... */ };
libnest2d::Box bin(100, 100); // 100x100的容器// 基本排樣(默認NfpPlacer + FirstFit)
auto bin_count = libnest2d::nest(items.begin(), items.end(), bin);// 自定義配置(遺傳算法優化)
libnest2d::NestConfig<libnest2d::NfpPlacer, libnest2d::DJDHeuristic> cfg;
cfg.placer_config.optimizer = libnest2d::opt::GeneticOptimizer{};
bin_count = libnest2d::nest(items, bin, 0, cfg);

總結

該頭文件是 libnest2d 的入口,提供:

  1. 幾何類型:點、多邊形、矩形等。
  2. 策略接口:放置算法(Placer)與選擇邏輯(Selector)。
  3. 用戶控制:配置參數、進度監控、終止條件。
  4. 泛型設計:支持多種后端和優化算法。

適用于 工業排樣、板材切割、PCB布局 等需要高效二維空間優化的場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91356.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91356.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Docker】部署Docker可視化管理面板Dpanel

一、DPanel 介紹 1.1 DPanel 簡介 DPanel 是一款專為 Docker 設計的可視化管理面板&#xff0c;旨在降低容器、鏡像及相關資源的管理門檻。通過簡潔直觀的圖形化界面&#xff0c;即使是對 Docker 不熟悉的用戶&#xff0c;也能輕松上手&#xff0c;實現容器化應用的高效部署與管…

GCC/G++ + Makefile/make 使用

一、gcc\g編譯器 什么是gcc和g&#xff0c;它們的區別又是什么&#xff1f; gcc編譯器是專門用來編譯C語言的&#xff0c;而g編譯器既可以編譯C語言又可以用來編譯C&#xff0c;但是主要還是用來編譯C。 我們都知道代碼形成可執行程序都是需要經過預處理、編譯、匯編和鏈接這四…

重復文件查找工具:DataSecurity Plus 全面提升企業文件管理效率

企業日常運營經常會出現這樣的場景&#xff1a;員工在文件傳輸、共享與備份過程中&#xff0c;因操作不當或系統設置問題&#xff0c;出現文件重復存儲&#xff1b;跨部門協作時&#xff0c;相同的項目資料可能被多次保存&#xff1b;隨著數據遷移與系統升級&#xff0c;重復文…

【軟件架構】資源池架構設計中的三種主流模式

在資源池架構設計中&#xff0c;三種主流模式——集中式、分布式和混合式資源池——各有其獨特的優勢、劣勢和適用場景。理解它們的區別對于設計高效、可靠和可擴展的系統至關重要。 下面是對這三種模式的詳細分析和比較&#xff1a;集中式資源池 核心概念&#xff1a; 將所有計…

Java 類加載沖突

在某次線上部署過程中&#xff0c;我們遇到了一個十分詭異的問題&#xff1a;同樣的應用&#xff0c;在 ext3 文件系統下運行正常&#xff0c;但部署到 ext4 文件系統下卻出現了如下異常&#xff1a;The methods class, com.ctc.wstx.io.StreamBootstrapper, is available from…

VMware安裝 統信UOS桌面專業版

前言 近年來&#xff0c;隨著Linux發行版在開發者、企業環境中的應用逐漸增多&#xff0c;國產操作系統統信UOS&#xff08;基于Debian&#xff09;因其良好的圖形化界面和本地化支持&#xff0c;成為不少用戶體驗Linux生態的選擇之一。本文將以VMware Workstation Pro 17為例…

SAP Datasphere 02 - 建模

創建連接創建到 HANA Cloud 實例的連接查看 HANA Cloud實例連接 Endpoint創建連接選擇連接類型配置連接信息&#xff0c;授權方式&#xff0c;用戶名密碼等配置連接名稱驗證連接導入數據源表創建目錄 Hotel &#xff0c;放置建模對象點擊新建目錄&#xff0c;導入遠程表選擇數據…

isasssim robotiq夾爪踩坑

1. usd導出urdf失敗在isasssim的仿真中的 robotiq 2f夾爪&#xff0c;首先目前4.5asset里面的usd不能直接轉urdf&#xff0c;因為模型中存在 “閉環連接”&#xff0c;即某個部件&#xff08;或關節&#xff09;同時與兩個及以上的父部件相連&#xff0c;形成類似 “三角形” 的…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | Pokedex(寶可夢圖鑒)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— Pokedex組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 結合 PokeAPI 來創建一個炫酷的寶可夢圖鑒應用。通過這個…

【Practical Business English Oral Scene Interpretation】在職主持會議-安排任務+結束會議

文章目錄Introduction1. 討論代辦事項2. 分配工作任務3. 說明截止日期4. 說明截止日期5. 感謝參會者Introduction Note that each row of the table represents the content of the conversation in order. 1. 討論代辦事項 AlexBarryNoteLet’s review the to-dos from the…

ansible簡單playbook劇本例子

1. 創建主機清單vim inventory.ini192.168.100.181[web:vars] ansible_userroot ansible_passwordAdmin123456[web] 192.168.100.1822. 創建一個簡單的劇本vim playbook.yaml- name: My first playhosts: webtasks:- name: Ping my hostsansible.builtin.ping:- name: Print me…

愛心煙花浪漫立方體輪播圖 - 用代碼表達愛意

項目介紹 這是一個專為表白和營造浪漫氛圍而設計的3D立方體輪播圖結合了現代Web技術與浪漫元素&#xff0c;通過立方體的旋轉展示珍貴的照片&#xff0c;同時配有愛心飄動、流星劃過、煙花綻放和雪花飛舞等浪漫特效&#xff0c;為你的表白增添獨特的科技浪漫。 效果展示截圖原…

基于人工智能的無人機網絡系統

目錄 1.環境感知與目標檢測 2.無人機定位與導航&#xff08;SLAM與路徑規劃&#xff09; 3.無人機網絡通信與資源優化 4.無人機集群協同控制&#xff08;一致性與編隊&#xff09; 5.無人機任務分配與調度&#xff08;組合優化&#xff09; 6.MATLAB仿真測試 基于人工智能…

nginx安裝配置Lua模塊的支持

一、先來看幾個概念問題1.1 為什么需要&#xff1f;nginx官方自帶了非常多的核心模塊&#xff0c;再加上第三方的模塊能夠滿足我們大部分的業務需要&#xff0c;但是業務的需求、業務的場景變化需要添加一些額外的功能&#xff0c;如果自己去開發一個nginx模塊相對來說比較笨重…

智慧礦山低光照識別準確率↑32%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析&#xff0c;核心技術參數與架構引用自《陌訊技術白皮書》&#xff0c;禁止未經授權的轉載與商用。一、行業痛點&#xff1a;智慧礦山的視覺識別困境礦山場景的視覺監控一直面臨多重技術挑戰&#xff1a;井下巷道長期處于低光照環境&#xff08;光照…

AI賦能操作系統:通往智能運維的未來

一、具備AI能力的操作系統未來的操作系統如果具備了AI能力&#xff0c;那將徹底改變我們管理和保護服務器的方式。一旦AI能力被充分集成并啟用&#xff0c;自動優化、安全檢測和漏洞修復的潛力將變得無比巨大且切實可行。想象一下未來的服務器管理&#xff1a;不再需要人工夜以…

sqli-labs:Less-13關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入類型&#xff1a;字符串型&#xff08;單引號、括號包裹&#xff09;、POST請求提示&#xff1a;參數…

微軟發布Microsoft Sentinel數據湖國際版

在網絡安全威脅持續升級的背景下&#xff0c;微軟宣布推出Microsoft Sentinel數據湖&#xff08;國際版&#xff09;&#xff0c;以突破性架構重塑企業安全運營能力。該產品目前已進入公開預覽階段&#xff0c;標志著安全信息與事件管理&#xff08;SIEM&#xff09;領域正式邁…

力扣面試150題--只出現一次的數字II

Day 92 題目描述思路 初次思路&#xff1a;想不出來 哈哈哈指揮hash 就不放出來丟人了 題解思路&#xff1a;這個做法是每次確定一個位是否為答案為1 的位 具體是這樣的&#xff1a;由于除了答案外每個數字都會出現3次&#xff0c;那么我們不考慮答案的情況&#xff0c;那么一個…

cacti的RCE

一、環境搭建 1、安裝docker curl -fsSL https://get.docker.com | sh 驗證docker是否正確安裝 docker version 驗證docker compose是否可用 docker compose version 2、在GitHub上拉取 vulhub 首先先裝一個proxychains網絡代理工具&#xff0c;如果直接拉取的話速度會…