我需要绘制一个正方形图像,映射或转换为未知的编译时四边形多边形。我怎么能这样做?
具体问题是渲染具有非矩形地图投影的地图图块。假设我有以下磁贴:
我知道需要有四个角点:
鉴于此,我想获得以下输出:
方形图块可能是:
我认为第二项意味着这需要非仿射变换。
随机附加说明
四面?要完全正确,瓷砖应该是合理的 映射到具有四个以上点的多边形,但出于我们的目的 并且在绘制的比例尺上,正方形 - >其他四角多边形 改造应该足够了。
为什么只选择GDI?到目前为止,所有渲染都是使用GDI完成的,我希望快速保持代码(a),并且(b)需要额外的少量 图书馆尽可能。我知道some support for transformations in GDI并且一直在试验它们 今天,但即使在尝试过它们之后,我也不确定它们是否存在 为此目的足够灵活。如果他们是,我没有成功 搞清楚,所以我真的很感激一些示例代码。
GDI +也可以,因为我们在其他地方使用它,但我知道它可能很慢,速度也是 这里很重要。
另一种选择是Delphi - / C++Builder - 特异性的;这个程序主要是用C ++编写的 VCL和有问题的图形目前都被绘制成了一个 TCanvas混合了TCanvas methods和原始WinAPI / GDI调用。
覆盖图像:最后一点需要注意的是,瓷砖中的一种颜色可能用于颜色键 透明度:即上面瓷砖中的所有白色(说)方块 在绘制在下面的任何东西时应该是透明的。 目前,瓷砖被绘制成方形或轴对齐的矩形 目标使用TransparentBlt。
我很抱歉让这个问题更复杂的所有额外警告 比'我应该使用什么算法?'但我很乐意接受答案 只有算法信息。
答案 0 :(得分:6)
看看3D Lab Vector graphics。 (演示中特别是“足球场”)。
另一个很酷的资源是AggPas,其中包含完整的来源(download)
AggPas是开源和免费的2D矢量图形库。它是Anti-Grain Geometry库的一个Object Pascal原生端口 - AGG,最初由Maxim Shemanarev在C ++中编写。 AggPas不依赖于任何图形API或技术。基本上,您可以将AggPas视为渲染引擎,该引擎从某些矢量数据在内存中生成像素图像。
以下是perspective
演示的样子:
转型后:
答案 1 :(得分:6)
您可能还想查看Graphics32。 下面的屏幕截图显示了GR32中的转换演示如何看起来像
答案 2 :(得分:5)
George Wolberg的“数字图像变形”中描述了一般技术。看起来this abstract包含相关数学,this paper也是如此。您需要创建一个从一个四边形映射到另一个四边形的透视矩阵。以上链接显示了如何创建矩阵。获得矩阵后,您可以扫描输出缓冲区,执行转换(或者可能是逆转 - 取决于它们给你的转换),这将为您提供原始图像中可以复制的点。
使用OpenGL在4个点之间绘制纹理四边形可能更容易,但这并不像你想要的那样使用GDI。