最近做的一个小算法,使用平行线填充一个多边形区域。用过 AutoCAD 的同学应该知道,可以选定一个区域,指定平行线的角度 α 和平行线之间的间距 spacing 就可以填充区域了。

image

图 1 AutoCAD 中的平行线填充效果

这里做的平行线填充实质就是如何计算多边形与各个平行直线的交点,最后将相关的交点连接之后就可以了。具体做的过程如下:

对于一个多边形区域,我们定义这个类为 Boundary,一个 Boundary 里面可以有多个 polygon,其中一个 outer polygon 和多个 inner polygon

给定的函数借口如果是 List> HatchParallel(Point origin, float angle, float spacing); 其中 origin 是参考点,假设平行线填充无线扩展,那其中的一条直线一定会通过这个参考点,angle 指直线的方向,spacing 指直线之间的距离;返回值的 List 为一条平行线与 boundary 相交时出现的一系列线段,List> 指一系列平行线与 boundary 相交出现的系列线段;

根据 angle 值,以 origin 为中心,顺时针旋转直线和 boundary,使平行线变成水平,见图 2;

image

图 2 顺时针旋转图形

计算旋转后的 boundary 的各个顶点的 Y 值最大值和最小值,由此得到从下到上各个平行线的 Y 值范围

minY≤Y≤maxY

对于其中的一条平行线,我们定义一个函数 List ChipLine(float y, Boundary boudary) 对于一个 boundary 可以看成 List polygonList。这里首先计算每个 polygon 和水平线之间的交点情况,接口为 List ChipLine(float y, Polygon polygon)

4.1 水平线和一个 polygon,其交线的一个情况可能是图 3 所示,其交点分别为 1~7。求交点的过程可以仅用多边形各个点的 Y 值与 origin 的 Y 值进行比较就得到了。相邻的两个点之间的距离可以构成一条线段,但是并不是每条线段都是需要保留的,比如 [5, 6] 就是一定要删去的,而 [3, 4] 可能需要保留也可能需要删除,其余的都是一定要保留的。

4.2 对于 [3, 4],假设我们是需要显示的,如图 4,那么对于 outer polygon,我们保留 3, 4 点,而对于 inner polygon,我们不保留 3, 4 点(这个后面会有解释)。

4.3 这里就先假设我们需要显示 [3, 4],并且多边形是 outer polygon,于是对于 List ChipLine(float y, Polygon polygon) 函数的返回结果为点列 {1, 2, 2, 3, 3, 4, 4, 5, 6, 7}。可以看到返回的是每条需要保留的线段的端点。

image

图 3 水平线与多边形的相交情况

image

图 4 显示与多边形边界重合的平行填充线

4.4 如何判断两个点是否需要保留,可以取两个相邻端点的中点,并判断中点与多边形的内外关系:

A、如果中点在多边形内部,则这2点连接的线段就一定在多边形内部,于是这2点就一定要保留;

B、如果中点在多边形外部,则这2点连接的线段就一定在多边形外部,则这2点就一定要删除;

C、如果中点在多边形的边上,则根据条件判断这2个点是不是需要保留,判断规则如下:

C1、如果我们需要显示与多边形的边重合的平行填充线

C11、当前多边形是outer多边形,则保留这2个点;

C12、当前多边形是inner多边形,则删除这2个点;

C2、如果我们不需要显示与多边形的边重合的平行填充线

C21、当前多边形是outer多边形,则删除这2个点;

C22、当前多边形是inner多边形,则保留这2个点;

对一个 boundary 中的全部多边形进行第 4 步骤后,将全部的点保留在一个 List 当中,随后对全部的点按照 X 轴进行排序,得到经过排序的点列 {p0, p1, p2, p3, …, p2n-1}。由第 4 步可知,得到的点列的数量一定是 2 的倍数。

将点列的相邻两个点提取出来,{p0, p1}、{ p2, p3}、…、{ p2n-2, p2n-1},并由此构成一个线段的列 List 并返回,由此完成了 List ChipLine(float y, Boundary boudary)

至于在第 4 步骤当中,为什么对 outer 多边形和 inner 多边形的边界边两点的保留还是删除采用不同的方式,可以见图 5。假设保留了 inner 多边形与水平线的交点,则第 5 步得到的点列为 {1, 2, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9},由此后面两个配对得到 List 的时候就没有线段 [2, 3] 了,所以应当对 inner polygon 和 outer polygon 采用不同的处理方式。

image

图 5 水平线与一个 boundary 的相交情况

贴一些自己做的效果图吧

image

图6

image

图 7 保留与边界重合的平行线

image

图 8 不保留与边界重合的平行线

Java平行线算法_多边形的平行线填充算法相关推荐

  1. 多边形偏移算法c语言,多边形的偏移填充算法

    多边形的偏移填充算法- 简书 www.jianshu.com/p/8c7e7c1afcb6 2017年9月10日 - 前言多边形偏移(polygon offset) 算法可能我们印象不深,不过用过au ...

  2. 洪水填充算法_Android图像处理之泛洪填充算法

    泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是windows paint的油漆桶功能.算法的原理很简单,就是 ...

  3. java常见的hash算法_常见的哈希算法和用途

    写在前面 哈希算法经常会被用到,比如我们Go里面的map,Java的HashMap,目前最流行的缓存Redis都大量用到了哈希算法.它们支持把很多类型的数据进行哈希计算,我们实际使用的时候并不用考虑哈 ...

  4. 多边形区域填充算法--扫描线种子填充算法

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow http://bl ...

  5. java 寻路算法_游戏中的寻路算法解析

    游戏角色的自动寻路,已经是游戏中一个历史比较悠久的领域,较为成熟也有很多种实现.这里摘录一句后面所提的参考资料中的描述:"业内AI开发者中有一句话:"寻路已不是问题."我 ...

  6. k均值算法 二分k均值算法_如何获得K均值算法面试问题

    k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...

  7. ios笔试题算法_微软笔试题-Dijkstra算法

    Dijkstra算法是典型的算法.Dijkstra算法是很有代表性的算法.Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临 ...

  8. 图像 异常检测算法_检测图像异常的算法

    图像 异常检测算法 Modern applications are generating enormous amounts of image data. And in the last years, ...

  9. 最小径集的算法_机器学习的利器——集成算法

    最近在打算法竞赛的时候用到了集成算法,效果还不错,索性就总结了一篇集成算法的文章,希望能帮到正在转行的数据分析师们. 集成算法核心思想 集成算法的核心思想是通过构建并结合多个学习器来完成学习任务,也就 ...

最新文章

  1. Selenium 下拉框处理
  2. 火星浏览器_「超详细Filecoin矿工手册」IPFS的应用以及意义 | 火星号精选
  3. redis解决“高并发定时秒杀”库存误差问题
  4. linearlayout设置最大高度_一句话掌握一消建筑高度计算方法,先收藏!
  5. [python爬虫] Selenium常见元素定位方法和操作的学习介绍(转载)
  6. vc2008使用技巧
  7. spring webflow : 上传单个文件实例
  8. c++语言中如果调用函数时,需要改变实参或者返回多个值,应该采取,C++综合练习题2...
  9. JavaScript进阶高级
  10. Linux sudo一些命令出现 command not found 的原因
  11. 九种食物摆脱便秘烦恼 - 生活至上,美容至尚!
  12. windows10上Eclipse运行MapReduce wordcount程序遇到的坑
  13. paip.提升安全性-------生成一个安全的验证码
  14. 干货十足:一大波好用的Windows软件帮你开路!
  15. Windows10系统下对于鲁大师一类捆绑流氓软件的解决方法
  16. 天啦噜!原来Android属性动画也不过如此
  17. Python自动生成ffmpeg转码HEVC (X265,H265) 命令
  18. 电阻应变式测力压力称重传感器工作原理
  19. 如何在VScode中实现markdown所见即所得的实时预览
  20. 宋婷科幻作品连载 | 算力:幻想几何学(一)

热门文章

  1. 人工智能创业项目,创业服务资源渠道
  2. 【强烈推荐】Python中JSON的基本使用(超详细)
  3. 管状合金电阻和片状合金电阻的区别_R007合金电阻 电动滑板车专用电阻 大毅现货供应...
  4. 购票API接口商品详情信息API
  5. Access数据库:它已经被别的用户以独占方式打开,操作必须使用一个可更新的查询,不能锁定文件
  6. 新入行的网工如何成长
  7. 如何开发一个人人爱的组件?
  8. Python摩尔庄园自动钓鱼(macOS)
  9. 【2】WEB安全学习----网站组成
  10. .NET5.0和Quartz.NET开发的极简任务调度平台