我需要绘制一个正方形的图像,映射或变换成一个在编译时不知道的四边形。如何做到这一点?
更长的解释
具体问题是使用非矩形地图投影渲染地图瓦片。假设我有以下瓦片:
我知道这四个角点需要在这里: 鉴于此,我希望获得以下输出:方形瓷砖可能会:
- 旋转; 和/或者
- 一端比另一端更窄。
我认为第二项意味着这需要进行非仿射变换。
随机额外笔记
四边形? 可能为了完全正确,瓷砖应该被映射到具有多于四个点的多边形上,但对于我们的目的并且在绘制的比例下,一个正方形 -> 其他四角多边形转换应该足够了。
为什么最好只使用GDI? 到目前为止,所有渲染都是使用GDI完成的,并且我想保持代码(a)快速和(b)需要尽可能少的额外库。我知道GDI中有一些支持变换的支持,今天我一直在尝试它们,但即使在尝试它们之后,我也不确定它们是否足够灵活以适应此目的。如果可以,我还没有设法弄清楚,因此我真的很需要一些示例代码。
GDI+也可以,因为我们在其他地方使用它,但我知道它可能会很慢,速度在这里很重要。
另一种选择是任何Delphi- / C++Builder-特定的内容;这个程序主要是使用C++编写的,使用VCL,并且目前正在使用TCanvas方法和原始的WinAPI / GDI调用绘制图形。
叠加图像:最后一个警告是瓷砖中的一种颜色可能是用于颜色键透明度:也就是说,上面瓷砖中的所有白色(例如)正方形在绘制到任何下面的东西时都应该是透明的。目前,使用TransparentBlt将瓷砖绘制到正方形或轴对齐的矩形目标上。
对于使这个问题比“我应该使用什么算法?”更复杂的所有额外警告,我感到很抱歉。但是,我也会欣然接受只包含算法信息的答案。
Graphics32
的出色演示:这难道不是“一个特定库如何解决问题的具体示例”吗? - kobik