Как с помощью GDI преобразовать квадратное растровое изображение в произвольный четырехсторонний многоугольник?

Мне нужно нарисовать квадратное изображение, сопоставленное или преобразованное в неизвестный во время компиляции четырехсторонний многоугольник. Как я могу это сделать?

Более подробное объяснение

Конкретная проблема заключается в рендеринге фрагмента карты с непрямоугольной картографической проекцией. Предположим, у меня есть следующий тайл:

Square tile

и я знаю, что здесь должны быть четыре угловые точки:

Four distorted corners

Учитывая это, я хотел бы получить следующий вывод:

Distorted, image-mapped polygon

Квадратный тайл может быть:

  • Повернутый ; и/или
  • Быть уже на одном конце, чем на другом.

Я думаю, что второй пункт означает, что для этого требуется неаффинное преобразование.

Случайные дополнительные примечания

Четырёхсторонняя?Вероятно, чтобы быть полностью правильным, плитка должна быть сопоставляется с многоугольником с более чем четырьмя точками, но для наших целей а в масштабе нарисовано, квадрат -> другой четырехугольник-многоугольник трансформации должно быть достаточно.

Почему предпочтительнее использовать только GDI?До сих пор весь рендеринг выполнялся с использованием GDI, и я хочу, чтобы код (а) работал быстро и (б) требовал как можно меньше дополнительных библиотеки, насколько это возможно. Я знаю о некоторой поддержке преобразования в GDIи экспериментировали с ними сегодня, но даже поэкспериментировав с ними, я не уверен, достаточно гибкий для этой цели.Если они есть, мне не удалось разберитесь с этим, и поэтому я был бы очень признателен за пример кода.

GDI+ также подходит, так как мы используем его в других местах, но я знаю, что он может быть медленным, а скорость важно здесь.

Другой альтернативой может быть что угодно Delphi- / C++Builder- специфичный; эта программа написана в основном на C++ с использованием VCL, и рассматриваемая графика в настоящее время окрашена в TCanvas со смесью методов TCanvasи необработанных вызовов WinAPI/GDI.

Наложение изображений:Последнее предостережение заключается в том, что один цвет в плитке может использоваться для цветового ключа. прозрачность: то есть все белые (скажем) квадраты в плитке выше должен быть прозрачным при рисовании над тем, что находится под ним. В настоящее время плитки рисуются в виде квадрата или прямоугольника с выравниванием по осям. цели с помощью TransparentBlt.

Прошу прощения за все дополнительные предостережения, которые усложняют этот вопрос. чем «какой алгоритм мне использовать?» Но я с радостью приму ответы с только алгоритмическая информация тоже.

15
задан NGLN 7 March 2012 в 21:23
поделиться