【发布时间】:2012-03-25 09:37:48
【问题描述】:
我需要绘制一个正方形图像,映射或转换为编译时未知的四边多边形。我该怎么做?
更长的解释
具体问题是使用非矩形地图投影渲染地图图块。假设我有以下磁贴:
我知道四个角点需要在这里:
鉴于此,我想得到以下输出:
方块可能是:
- 已旋转;和/或
- 一端比另一端窄。
我认为第二项意味着这需要非仿射变换。
随机附注
四面? 完全正确,瓷砖应该是 映射到具有四个以上点的多边形,但出于我们的目的 并按照绘制的比例,一个正方形->其他四角多边形 改造应该就够了。
为什么最好只使用 GDI? 到目前为止,所有的渲染都是使用 GDI 完成的,我希望保持代码 (a) 快速和 (b) 只需要很少的额外代码 图书馆尽可能。我知道some support for transformations in GDI 并一直在尝试它们 今天,但即使在对它们进行试验之后,我也不确定它们是否 为此目的足够灵活。如果他们是,我还没有设法 弄清楚,所以我真的很感激一些示例代码。
GDI+ 也可以,因为我们在其他地方使用它,但我知道它可能很慢,而且速度是 这里很重要。
另一种选择是Delphi- / C++Builder-特定;这个程序主要是用 C++ 编写的 VCL,并且有问题的图形当前被绘制到 混合了TCanvas methods 和原始 WinAPI/GDI 调用的 TCanvas。
叠加图像: 最后一个警告是图块中的一种颜色可能是颜色键 透明度:即上面图块中的所有白色(比方说)方块 当绘制在下面的任何东西上时应该是透明的。 目前,瓷砖被绘制成正方形或轴对齐的矩形 目标使用TransparentBlt。
对于让这个问题变得更加复杂的所有额外警告,我深表歉意 而不是“我应该使用什么算法?”但我会很乐意接受答案 也只有算法信息。
【问题讨论】:
-
@NGLN:看起来很完美。我要么忘记了,要么从来不知道这个功能!我明天会尝试它(这里是深夜。)同时,您介意添加它作为答案吗?
-
糟糕,抱歉:PlgBlt 只能生成平行四边形。
-
如果速度很重要,您应该放弃 GDI 并开始使用 OpenGL。 Delphi 附带
OpenGL单元,因此您可以快速入门。 (GDI 可能很快足够,但既然你提到速度的重要性......) -
@AndreasRejbrand,是的... OpenGL 会更快,当然为此。不过,我正在添加到现有视图中,并且不想重写整个内容,因此我更愿意与现有代码集成。但谢谢你的想法!我们实际上是considering using OpenGL elsewhere in the program 很快...
-
@DavidM,我真的不明白你还想要什么......你有完整的来源、项目名称和所需的输出。看看
Graphics32的优秀demo:这不是“具体库如何解决问题的具体例子”吗?
标签: delphi graphics gdi+ transform gdi