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