图形学 桶表与边表

  • Post author:
  • Post category:其他


在我学习计算机图形学桶表与边表相关的知识的时候,书上的说法是:为了确认在哪条边上出现了新边就需要构造一个边表。这句话在第一次学习的时候很容易产生一个误解:我们不是要构建一个本身就存在的多边形相关的链表吗?哪里有新的边了?其实,书上所谓的新边,是指从第一条扫描线(都是从上到下)开始,依次记入与之相交的边按x/y(min)放入链表,重复的边(之前的扫描线已经放入自己的链表的边)不放入。最后所有链表中元素的个数应该等于多边形边的条数。所以这儿的新边并不是我们额外再添几条边,而是从零开始建立多边形。另外在这儿我们不能仅仅局限于书上面说的那个y=1到y=12的多边形,很多多边形并不是都是整数顶点并且这么有规律的摆放在像素坐标系上的。要深入学会桶表与边表,首先要知道我们在扫描转换的时候的坐标系,实际上是像素点构成的坐标系,每个单位点都对应一个像素点,而扫描线就是从以此构成的坐标系中每条y=Z(Z为任意整数)直线。我们要讨论的,就是把多边形以合适的方式放入坐标系后,从与这个多边形相交的第一条扫描线(从下到上,顶点相交的也算)开始写边表。

有了以上的认识后我们开始来正式的认识桶表与边表。要注意桶表与边表是一个整体的表,类似于有效边表,而非两个表。假如多边形所对应的扫描线是y=1到y=10,那么从y=1的有效边开始,把所有y=1的有效边放入y=1对应的链表,然后放y=2一直到y=10,中途如果有扫描线的有效边之前的扫描线已经放入则不能再放。知道放入所有边或者扫描线到最后一条则结束。我们手写的时候,首先画一个表以此写出多边形覆盖的扫描线,然后y=1开始用箭头引出之前没有出现过的有效边的链表即可。

最后桶表于边表中链表的内容,记住即可。有4个部分,第一部分按书上的理解很容易出错。第一部分中x|y(min)指的不是x除以y,也不是x整除y,这儿书上没说清楚,这儿的x|y(min)指的就是在对应的有效边中与之相交的最低扫描线与这条边相交的点的x值。第二部分是ymax,就是对应有效边与之相交的最高的扫描线。第三部分k/1是指对应有效边的斜率的倒数。第四部分是next指针,上一个链表连接下一个链表,最后一个单元指针为空。在找到所有不重复的有效边后,按照x|ymin从小到大的顺序构建(x|ymin相等则按照1/k从小到大的顺序构建)链表即可。如果一条扫描线没有任何不重复的有效边,不写就行了。理解了以上内容,便可以写桶表与边表了。是不是和数据结构构建多边形的算法类似?因为本质上都是树相关的算法,只不过图形学这方面很多没有说清楚。



版权声明:本文为weixin_44724323原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。