我正在尝试创建一个使用不常见的多边形渐变填充的应用程序。该想法是多边形的每个边缘具有单一颜色,并且这些边缘颜色用于以平滑渐变填充多边形的其余像素。
我有一个工作程序,通过为每个像素确定距离所有多边形边缘的距离并对所有边缘进行加权平均来执行此渐变。颜色取决于它们的距离。这是一个示例输出:
问题是当多边形有很多边时算法非常慢,即因为对于每个像素,它必须计算到每个边的距离。有关如何加快这一点的任何想法?
当前算法:
O(num_pixels*num_edges)
我遗漏了细节,因为我正在寻找关于如何更好地做到这一点的全局图(即优于List.join
)。欢迎所有想法。
谢谢!
答案 0 :(得分:2)
感谢@SirRaffleBuffle指出我的答案(抱歉,我没有足够的“声望点”来支持你)。
我最后使用的是一种颜色扩散算法,结合多网格解算器以获得巨大的性能提升(数学上here,here和here;警告,很多不透明的数学术语和希腊字母)。
扩散算法相当简单。您从一个像素画布开始,其中一些像素具有指定的颜色(例如由您指定)。然后,开始在画布的其余部分中分散颜色,对于每个像素,对四个相邻(非对角)像素求平均值。然后反复重复此过程,直到所有像素都填满并且颜色稳定。
这个过程本身很慢,但可以通过“多网格求解器”大大加快。在这里,您最初在非常小的画布上运行扩散(即低分辨率),然后将输出颜色映射到具有两倍分辨率的第二个画布,并在此画布上运行扩散。这个过程可以在更高和更高的分辨率下重复,直到你得到你想要的。我们的想法是使用接近最终输出的像素颜色初始化扩散过程,从而切断算法的大部分工作。
这是一个非常粗略的解释;如果您想要更多细节,请告诉我。
答案 1 :(得分:0)
距离计算易于优化:距离(x,y,edge_i) - 距离(x + A,y + B,edge_i)是常数。算法的这一部分可以减少为每个像素每个边缘的单个加法。进一步优化(如果有的话)取决于像素颜色确定功能。