【问题标题】:Polygon edge gradient algorithm多边形边缘梯度算法
【发布时间】:2018-04-10 07:07:49
【问题描述】:

我正在尝试创建一个使用不常见的多边形渐变填充的应用程序。这个想法是多边形的每个边缘都有一种颜色,这些边缘颜色用于以平滑渐变填充多边形的其余像素。

我有一个工作程序,它通过确定每个像素与所有多边形边缘的距离并根据到它们的距离对所有边缘的颜色进行加权平均来执行此渐变。这是一个示例输出:

问题在于,当多边形有很多边时,算法非常慢,也就是说,因为对于每个像素,它必须计算到每个边的距离。关于如何加快速度的任何想法?

当前算法:

for pixel in polygon: # predetermined using a basic scan-line polygon-fill algorithm
    edge_distances = {}
    for edge in polygon:
        distance = calc_point_to_line_distance(pixel, edge) # simple formula, constant time            
        edge_distances[edge] = distance
    colour = calc_pixel_colour(edge_distances)  # runs in O(num_edges) time
    set_pixel_colour(pixel, colour)

我省略了细节,因为我正在寻找如何更好地做到这一点的大局想法(即比 O(num_pixels*num_edges) 更好)。欢迎所有想法。

谢谢!

【问题讨论】:

  • 很难优化我们看不到的算法。如果你需要帮助,你将不得不分享一些代码。
  • 上面添加的伪代码。
  • 你需要支持凹多边形,还是只支持凸多边形?
  • 凹多边形,以及带孔的多边形。
  • 看看Diffusion Curves。

标签: algorithm graphics polygon gradient


【解决方案1】:

感谢@SirRaffleBuffle 指出我的答案(抱歉,我没有足够的“声誉点”来支持你)。

我最终采用的是一种颜色扩散算法,结合了多网格求解器以实现巨大的性能提升(在数学上描述为 here、here 和 here;警告,大量不透明的数学术语和希腊字母)。

扩散算法相当简单。您从一个像素画布开始,其中一些像素具有指定的颜色(例如,由您指定)。然后,您开始在画布的其余部分散布颜色,对于每个像素,平均四个相邻(非对角线)像素。然后你一遍又一遍地重复这个过程,直到所有像素都被填充并且它们的颜色稳定。

这个过程本身相当缓慢,但可以通过“多网格求解器”显着加快。在这里,您最初在一个非常小的画布(即低分辨率)上运行扩散,然后将输出颜色映射到分辨率加倍的第二个画布,并在此画布上运行扩散。这个过程可以以越来越高的分辨率重复,直到你得到你想要的。这个想法是用接近最终输出的像素颜色来初始化扩散过程,从而切断算法的大部分工作。

这是一个相当粗略的解释;如果您需要更多详细信息,请告诉我。

【讨论】:

  • 我很高兴这对你有用。我一直认为扩散的结果非常令人愉悦。您为扩散方法提供了如此出色的非数学解释,您应该得到自己的声誉。
  • 在第一次迭代中,指定一些颜色后,我们如何忽略未初始化的像素?否则,在我看来,它主要会收敛到初始背景颜色(黑色或其他)。
【解决方案2】:

距离计算很容易优化:距离(x,y, edge_i) - distance(x+A,y+B, edge_i) 是常数。这部分算法可以简化为每个边缘每个像素的单个加法。进一步的优化(如果有的话)取决于像素颜色确定函数。

【讨论】:

  • 有趣的想法。但除非我的计算是错误的,否则这似乎只有在像素和边缘之间的最短线垂直于边缘时才成立。 (Diagram here -- red lines are perpendicular.) 也就是说,这可以提供一些优化——我会研究一下。
  • 考虑一个以像素中心为中心的边缘的端点。现在计算从 8 个相邻像素的中心到边缘的 perp 距离。这些是您在逐个像素移动过程中需要的更新。
  • 几乎不需要计算,因为 x 增量的梯度只是边缘的 -dy,而 y 增量的 dx=x1-x0。但如上所述,这适用于到任何线段的无限延伸的(正交)距离,而不是到边缘和顶点的最小距离。
猜你喜欢
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多