当前位置: 首页 > news >正文

多边形剪裁算法

多边形剪裁算法

用 box 剪裁任意多边形。

算法原理:

原多边形↓ 用 LEFT 裁剪
中间多边形↓ 用 RIGHT 裁剪
中间多边形↓ 用 BOTTOM 裁剪
中间多边形↓ 用 TOP 裁剪
最终结果每一步都保证输出多边形在当前剪裁边的内侧。
  • 处理 box 的 4 条边,对于每一条边:
    • 遍历多边形的所有点,获取当前点 prev 和前一个点 curr 和这条边的关系,根据下面表格做处理,判断有哪些点要加入生成的多边形:
      | prev | curr | 行为 |
      | ------- | ------- | -------------- |
      | inside | inside | 保留 curr |
      | outside | inside | 加交点 + curr |
      | inside | outside | 加交点 |
      | outside | outside | 全丢弃 |

对于下图类型的 polygon 会出现折返线,暂未解决。
img

实现代码:

enum Edge { LEFT, RIGHT, BOTTOM, TOP };
// 判断这个点和box 的位置关系
bool inside(const zaPoint& p, Edge e, const zaBox& box) {switch (e) {case LEFT:return p.x() > box.l();case RIGHT:return p.x() < box.r();case BOTTOM:return p.y() > box.b();case TOP:return p.y() < box.t();}return false;
}static zaPoint
intersect(const zaPoint& a, const zaPoint& b, Edge e,const zaBox& box) {// 使用 __int128 防止中间溢出__int128 dx = (__int128)b.x() - a.x();__int128 dy = (__int128)b.y() - a.y();if (e == LEFT || e == RIGHT) {zaIntx X = (e == LEFT) ? box.l() : box.r();__int128 t_num = (__int128)X - a.x();__int128 y = (__int128)a.y() + t_num * dy / dx;return {X, (zaIntx)y};} else {zaIntx Y = (e == BOTTOM) ? box.b() : box.t();__int128 t_num = (__int128)Y - a.y();__int128 x = (__int128)a.x() + t_num * dx / dy;return zaPoint(x, Y);}
}abDensity1::clipPolygonWithBox(const zaPointArray& poly, const zaBox& box) {auto clipEdge = [&](const zaPointArray& in, Edge e) {vector<zaPoint> out;int n = (int)in.getNumPoints();if (n == 0) return zaPointArray(0);out.reserve(n + 2);for (int i = 0; i < n; ++i) {const zaPoint& curr = in[i];const zaPoint& prev = in[(i + n - 1) % n];bool currIn = inside(curr, e, box);bool prevIn = inside(prev, e, box);if (currIn) {if (!prevIn) {out.push_back(intersect(prev, curr, e, box));}out.push_back(curr);} else if (prevIn) {out.push_back(intersect(prev, curr, e, box));}}zaPointArray res(out.size());res.set(out.data(), out.size());return res;};zaPointArray result = poly;result = clipEdge(result, LEFT);result = clipEdge(result, RIGHT);result = clipEdge(result, BOTTOM);result = clipEdge(result, TOP);return result;
}
http://www.jsqmd.com/news/290331/

相关文章:

  • 铸件毛坯余量如何精准测量分析?自动生成偏差色谱图产品推荐
  • 2026年深圳APP定制开发外包公司权威榜单发布
  • 量具测不准太慢?模具精度检查难题破解!思看3DeVOK MT+Polyworks方案推荐
  • 提升大数据处理效率,聚焦 ETL 核心策略
  • 2026必备!继续教育必看!TOP10一键生成论文工具深度测评
  • 大数据领域数据服务在旅游科技领域的应用探索
  • URC 分流是什么意思 + 为什么必须做 + ESP-IDF 可直接用的代码框架
  • ESP_ERR_OTA_VALIDATE_FAILED 的意思非常明确
  • 结论是:不是单一问题,你这边至少有 2 类崩溃,而且都和 ML307 的 AT/UART收发链路 + 异常数据处理 强相关
  • Golang 与 Kubernetes:实现自动化备份与恢复
  • Lua基础语法(下)
  • 结课设计.
  • 学长亲荐2026 MBA论文写作TOP10 AI论文网站
  • 科研AI模型复现难到崩溃?5个关键注意事项,一次复现成功!
  • 跨学科搞不定?AI+材料科学案例拆解,实验效率翻10倍!
  • 6.1.1.1 大材料方法论与实践指南-Spark/Flink 任务开发规范
  • Postgres常见命令
  • 训练时一套,线上跑一套?离线训练与在线服务数据一致性这坑,我替你踩过了
  • 08 判断语句
  • 文件或者文件夹存在但是删除提示项目文件不存在解决方法
  • AI Agent之一:不可能三角
  • 控油防脱洗发水怎么选?2026十大良心国货洗发水Top榜,成分功效全解析
  • 《实时渲染》第2章-图形渲染管线-2.4光栅化
  • 奇正沐古:B2B锂电行业权威靠谱的品牌营销战略咨询公司
  • 深入解析:Fastlane 结合 开心上架(Appuploader)命令行版本实现跨平台上传发布 iOS App 免 Mac 自动化上架实战全解析
  • 2026珠海儿童青少年专业配镜与近视防控指南
  • 3大技术路线对决!2026标杆款控油防脱洗发水测评,植萃专利款领跑
  • 在淘宝天猫,一大批商家正通过服务获得增长
  • FTP 图片上传 AOI图片
  • 《人月神话》阅读笔记第二篇