【问题标题】:Filling a Polygon: Performance of Winding Rule vs Even Odd Rule填充多边形:缠绕规则与奇数规则的性能
【发布时间】:2010-10-03 22:36:14
【问题描述】:

对于复杂的多边形(即:自相交),在 Winding 或 Even-Odd 填充规则之间的选择会影响多边形的填充方式。

但是对于不相交的多边形,Winding 或 Even Odd 填充规则之间是否存在性能差异。我知道这将是特定于实现的,但哪种算法对非复杂多边形更有效。

一个后续问题是什么是这些算法的复杂性(即 O(what?) )。我想知道是否值得去掉多边形中的一些点(主要是重复的或在同一条线上的点)以提高性能。

PS:如果这很重要,我正在使用 xlib

PPS:我可以确认问题与硬件无关,因为使用不同的显卡不会改变性能

【问题讨论】:

  • 您是要确定给定的 (x, y) 点是在多边形内部还是外部,还是要有效地填充多边形?当然后者可以通过反复解决前者来完成,但比这更有效。
  • 正如我在标题中所说的那样。我对多边形填充感兴趣。
  • 我问是因为,正如 Aaron 在他的回答中指出的那样,最好的算法甚至不使用填充规则,因为对于凸多边形,选择的规则没有区别。询问使用哪种填充规则来填充凸多边形就像询问哪种手机最适合与您旁边的人交谈。
  • 我不是说我在填充凸多边形吧?我只说非自相交(即它可以是凸的或凹的)。我也在使用 XFillPolygon,它需要将填充算法指定为图形上下文的一部分

标签: performance algorithm xlib raster


【解决方案1】:

今天,X 的大多数实现都使用显卡的 2D 硬件,因此两者之间的差异可能可以忽略不计。

由于这是一个性能问题,但我的答案正确的可能性约为 10%(在性能方面,您有 90% 的机会在没有测量的情况下出错)。如果要确定,没办法,只能自己写个小性能测试看看。

x11perf 可能会有所帮助。

您可以在此处找到硬件独立多边形填充的算法:http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/mi/mipolygen.c?rev=HEAD

如果你确定你的多边形是凸的,第二个版本会更快:http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/mi/mipolycon.c?rev=HEAD

第二个版本忽略了填充规则(不适用于凸多边形)。算法评论:http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/mi/mipoly.h?rev=HEAD

算法是这样工作的:它计算轮廓,然后在边缘之间创建跨度对象(只是 x,y 坐标和宽度)。如果使用 EvenOdd 规则,如果有交叉点,则会创建更多的 span 对象。如果没有(例如,当多边形是凸面时),那么您将不会注意到运行时差异,因为填充规则相当于 miFillPolygon 主循环中的布尔变量(即两者的大部分代码都是相同的填充规则)。

尝试通过优化多边形的轮廓来提高性能在一般情况下不会给你带来太多好处,除非你知道你的多边形包含大量不必要的点(例如,你可以去掉一半数量的点)一般情况下的点)。优化具有

但同样:这都是基于直觉或旧文章的知识。如果您想知道 gfx 卡驱动程序中的错误是否会影响结果,您必须亲自动手并编写一个测试来测量每种情况需要多长时间。由于外部因素,无法通过简单地查看任何复杂算法的运行时间来判断它:内存分配例程的速度、可用内存量(何时开始交换)、您可以使用的 CPU 内核数、有多少其他进程会与你争夺 CPU、屏幕上最终多边形的裁剪、实现细节和优化、错误等。

【讨论】:

  • 这仍然没有回答问题的第二部分,填充算法的复杂性是什么
  • @hhafez:这太粗鲁了。 Aaron 给出了一个全面的答案,如果您费心查看他为您挖出的代码,您会发现其复杂性很容易确定。
  • @j_random_hacker 你怎么了?他最初没有这些细节,只是在我发表评论后才添加的。我的评论是在他添加细节之前 1 小时。当他添加它们时,我投票赞成他的答案。所以谢谢亚伦。并且停止浪费我的时间 j_ramdom_hacker。谢谢
  • 我很抱歉。将来我会在出轨之前检查编辑和 cmets 的时间线:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
相关资源
最近更新 更多