跟月影学可视化
月影
前奇虎 360 奇舞团团长,可视化 UI 框架 SpriteJS 核心开发者,《JavaScript 王者归来》作者
30206 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 54 讲
跟月影学可视化
15
15
1.0x
00:00/00:00
登录|注册

08 | 如何利用三角剖分和向量操作描述并处理多边形?

实现通用的isPointInPath方法
Canvas2D如何判断点在多边形内部
WebGL填充多边形的方法
Canvas2D填充多边形的具体方法
区分凸多边形和凹多边形
绘图时要尽量构建简单多边形
简单多边形和复杂多边形的区分
多边形定义
2D图形和3D图形都是由多边形构成的
如何判断点在多边形内部?
不同的图形系统如何填充多边形?
图形学中的多边形是什么?
图形系统中的多边形是由多边形构成的
如何利用三角剖分和向量操作描述并处理多边形?
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是月影。
在图形系统中,我们最终看到的丰富多彩的图像,都是由多边形构成的。换句话说,不论是 2D 图形还是 3D 图形,经过投影变换后,在屏幕上输出的都是多边形。因此,理解多边形的基本性质,了解用数学语言描述并且处理多边形的方法,是我们在可视化中必须要掌握的内容。
那今天,我们就来说说,不同的图形系统是如何用数学语言描述并处理多边形。首先,我们来说说图形学中的多边形是什么。

图形学中的多边形是什么?

多边形可以定义为由三条或三条以上的线段首尾连接构成的平面图形,其中,每条线段的端点就是多边形的顶点,线段就是多边形的边。
多边形又可以分为简单多边形复杂多边形。我们该怎么区分它们呢?如果一个多边形的每条边除了相邻的边以外,不和其他边相交,那它就是简单多边形,否则就是复杂多边形。一般来说,我们在绘图时,要尽量构建简单多边形,因为简单多边形的图形性质比较简单,绘制起来比较方便。
而简单多边形又分为凸多边形和凹多边形,我们主要是看简单多边形的内角来区分的。如果一个多边形中的每个内角都不超过 180°,那它就是凸多边形,否则就是凹多边形。
在图形系统中绘制多边形的时候,最常用的功能是填充多边形,也就是用一种颜色将多边形的内部填满。除此之外,在可视化中用户经常要用鼠标与多边形进行交互,这就要涉及多边形的边界判定。所以今天,我们就来重点讨论多边形的填充和边界判定。首先,我们来看多边形的填充。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了图形学中描述和处理多边形的方法,重点讨论了多边形的填充和边界判定。首先解释了多边形的定义和分类,包括简单多边形和复杂多边形,以及凸多边形和凹多边形的区分。详细介绍了在不同的图形系统中采用不同方法来填充多边形,特别是针对WebGL,介绍了利用三角剖分来快速填充多边形的方法。讨论了如何判断点在多边形内部的问题,以及不同图形系统中的判定方法。最后,提出了实现通用的isPointInPath方法,通过点与几何图形的数学关系来判断点是否在图形内部,并给出了相应的代码示例。整体而言,本文通过技术性的讲解和实例演示,帮助读者快速了解了多边形描述和处理的数学方法,以及不同图形系统中的多边形填充技术。文章内容涵盖了图形学中的基本操作和实际应用,对于对图形学感兴趣的读者具有一定的参考价值。文章内容涵盖了图形学中的基本操作和实际应用,对于对图形学感兴趣的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《跟月影学可视化》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • gltjk
    在之前代码的基础上封装了 Canvas 类和自己的 Vector2D 类,同时增加简单的 WebGL 类(其中封装了用 Tesser2 三角剖分实现的画多边形方法),然后试了试小试牛刀里要求的椭圆、正五角星和菱形星星。因为文件比较多,不用 Codepen 了,改用 Github 放代码。 之后有时间再把判断点在多边形内部做出来,同时把之前 Codepen 的例子迁移过来。 话说感觉 WebGL 好深奥啊,可能我连门都没算入吧…… 在线预览:https://g.gltjk.com/learn-visualization/canvas-webgl-polygon/ 代码仓库:https://github.com/gltjk/learn-visualization

    作者回复: 赞👍能动手自己做非常棒,多实践可以快速学习成长。webgl上手不太容易,不过掌握了学习诀窍,打好基础,后面就越来越容易了,而且会觉得越来越有趣

    2020-07-09
    2
    10
  • Presbyter🎱
    老师,没脸的问一句。自己已经要疯了,很多数学概念已经不明白了。现在在恶补线性代数,然后在回来看文章。老师能麻烦一下,给出咱们这个课程所需要的数学知识嘛?我好一次性都看了,然后一点一点的在重新读咱们文章。麻烦老师了。

    作者回复: 在第9讲的最后我放了一张图,列出了所有的知识点,你可以看一下

    2020-07-14
    3
  • 孙华
    月影大佬 WebGL fill 的例子中 修改一下 gl.drawElements 的渲染模式,将 gl.TRIANGLES 改成 gl.LINE_STRIP。这样,我们就可以清晰地看出,经过 Earcut 处理的这个多边形被分割成了 8 个三角形。 但例子展示的结果中只有6个三角形和一个四边形。这是什么原因?

    作者回复: 因为LINE_STRIP是绘制连续线段,所以最终每个点只经过一次,就会出现四边形。不过这里只是大概地显示出三角形形状,所以没关系。如果要严格显示出各个三角形,需要改一下数据,把每个顶点和它的三角形的其他顶点对应的边数据重新存一下然后用LINES绘制

    2020-07-24
    2
  • 聂士伟
    具体实现的算法还需要先判断点是否在多边形外接框矩形内,可以加速

    作者回复: 是的,可以优化

    2021-09-19
    1
  • Geek_b52974
    简单根据老师给的延伸连结解释一下三角剖分 1. 任相邻的两个三角形一定是组成一个四边形,不会是五边形,六边形 2. 任一三角形的外包圆不可包含其他三角形的顶点 3. 跟 Voronoi diagram 是一体两面的概念,三角剖分中的三角形的边的中垂线相连会成为 Voronoi diagram 中的每个多边型,三角剖分中的顶点称为 Voronoi generators

    作者回复: ������

    2020-10-17
    2
    1
  • 嘻嘻
    话说浏览器的api判断是否在路径内应该也是用的数学方法吧(`・ω・´)ゞ

    作者回复: 具体实现方式要研究浏览器底层实现的源码。我觉得应该是的

    2020-10-11
    1
  • Mingzhang
    关于判断一个点是否在三角形内(包括边上)我曾经用代数方法做过:对每一条边而言其对应的顶点必然与要判定的点在同一侧,因此需要进行三组测试。判定函数如下: /** * Determine whether p3 and p4 are on the same side of the segment of p1-p2 * @param p1 * @param p2 * @param p3 * @param p4 * returns -1 (not on the same side) | 0 (at least one is on the segment) | 1 (on the same side) */ function onSameSide(p1=[0,0], p2=[0,0], p3=[0,0], p4=[0,0]) { let angle0 = Math.atan2(p2[1] - p1[1], p2[0] - p1[0]); let angle1 = Math.atan2(p3[1] - p1[1], p3[0] - p1[0]); let angle2 = Math.atan2(p4[1] - p1[1], p4[0] - p1[0]); let product = (angle1 - angle0) * (angle2 - angle0); if (product === 0) { return 0; } return product > 0 ? 1 : -1; }

    作者回复: 嗯,算atan很消耗性能

    2020-07-27
    2
    1
  • 王钰
    老师,判断 u1 是否在 a 上,是否可以用 |a - u1| > 0 判断,大于 0 时,u1 不在 a 上,等于 0 时在 a 上。

    作者回复: 不可以的,除非a和u1的长度相同

    2021-07-22
  • 谭鹏
    github上的代码 怎么打开都是大白屏

    作者回复: 因为qhres域名有问题,换成qhres2就可以了

    2021-07-05
  • kylin
    月影老师,您好,请问三角形向量a b c三个点A B C有没有对应关系,而且a b c 的方向在图上也没有,看不明白您说的如何判断一个点在三角形内

    作者回复: 有的,向量abc就是点p和ABC连接的线段表示向量

    2020-08-01
    2
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部