Мне нужно нарисовать квадратное изображение, сопоставленное или преобразованное в неизвестный во время компиляции четырехсторонний многоугольник.Как я могу это сделать?
Более подробное объяснение
Конкретная проблема - рендеринг фрагмента карты с непрямоугольной проекцией карты.Предположим, у меня есть следующий тайл:
, и я знаю, что здесь должны быть четыре угловые точки:
Даночто я хотел бы получить следующий вывод:
Квадратный тайл может быть:
- Поворот;и / или
- быть более узким на одном конце, чем на другом.
I думаю второй элемент означает, что для этого требуется неаффинное преобразование.
Случайные дополнительные заметки
Четырехсторонний? Возможно, чтобы быть полностью правильным, плитка должна отображаться в многоугольник с помощьюболее четырех точек, но для наших целей и в масштабах, которых оно нарисовано, должно быть достаточно квадрата -> другого преобразования четырехугольного многоугольника.
Почему предпочтительно только GDI? Всерендеринг до сих пор выполняется с использованием GDI, и я хочу, чтобы код (а) был быстрым и (б) требовал как можно меньше дополнительных библиотек.Мне известно о некоторой поддержке преобразований в GDI , и я экспериментировал с ними сегодня, но даже после экспериментов с ними я не уверен, достаточно ли они гибки для этой цели.Если это так, мне не удалось это выяснить, и поэтому я был бы очень признателен за пример кода.
GDI + также подходит, поскольку мы используем его где-то еще, но я знаю, что он может быть медленным, издесь важна скорость.
Еще одна альтернатива - это что угодно Delphi - / C ++ Builder -specific;эта программа написана в основном на C ++ с использованием VCL, и соответствующая графика в настоящее время отрисовывается в TCanvas со смесью методов TCanvas и необработанных вызовов WinAPI / GDI.
Наложение изображений: Одно последнее замечание: один цвет в плитке может быть для прозрачности цветовых клавиш: то есть все белые (скажем) квадраты в вышеупомянутой плитке должны быть прозрачными при рисовании поверх того, что находится под ними.В настоящее время плитки рисуются для прямоугольных или выровненных по оси прямоугольных целей с помощью TransparentBlt .
Я прошу прощения за все дополнительные предостережения, которые усложняют этот вопрос, чем «какой алгоритм мне использовать?Но я с радостью приму ответы только с алгоритмической информацией.