Ответ 1
Вы также можете посмотреть Graphics32.
Экранный снимок bewlow показывает, как демоверсия transfrom в GR32 выглядит как
Мне нужно рисовать квадратное изображение, отображаться или преобразовываться в четырехсторонний многоугольник с неизвестным в момент компиляции. Как я могу это сделать?
Конкретная проблема заключается в рендеринге плитки карты с непрямоугольной проекцией карты. Предположим, у меня есть следующая плитка:
и я знаю, что четыре угловых точки должны быть здесь:
Учитывая это, я хотел бы получить следующий вывод:
Квадратная плитка может быть:
Я думаю, что второй пункт означает, что для этого требуется неаффинное преобразование.
Случайные дополнительные заметки
четырехсторонний? Правдоподобно, что, чтобы быть полностью правильным, плитка должна быть сопоставляется с многоугольником с более чем четырьмя точками, но для наших целей и в масштабе, который он рисует, квадрат → другой четырехугольный-многоугольник трансформации должно быть достаточно.
Почему желательно только GDI? Весь рендеринг до сих пор выполняется с использованием GDI, и я хочу быстро сохранить код (a) и (b) потребовать как можно меньше библиотеки. Я знаю некоторую поддержку для преобразования в GDI и экспериментировали с ними сегодня, но даже после экспериментов с ними я не уверен, что они достаточно гибкой для этой цели. Если они есть, мне не удалось выяснить это, и поэтому я действительно ценю образец кода.
GDI + тоже нормально, поскольку мы используем его в другом месте, но я знаю, что он может быть медленным, а скорость - важно здесь.
Еще одна альтернатива - это Delphi -/ С++ Builder - специфический; эта программа написана в основном на С++, используя VCL и соответствующая графика в настоящее время окрашены в TCanvas с сочетанием TCanvas методы и необработанные вызовы WinAPI/GDI.
Наложение изображений: одно последнее предостережение состоит в том, что один цвет в плитке может быть для цветной клавиши прозрачность: то есть все белые (скажем) квадраты в вышеупомянутой плитке должны быть прозрачными при наведении на все, что находится внизу. В настоящее время плитки нарисованы прямоугольными или прямоугольными цели с использованием TransparentBlt.
Прошу прощения за все лишние оговорки, которые усложняют этот вопрос чем "какой алгоритм я должен использовать?" Но я с радостью соглашусь с ответами только алгоритмическая информация.
Вы также можете посмотреть Graphics32.
Экранный снимок bewlow показывает, как демоверсия transfrom в GR32 выглядит как
Взгляните на 3D Lab Vector graphics. (Специально "Футбольное поле" в демо).
Еще один классный ресурс AggPas с полным исходным кодом (скачать)
AggPas - это Open Source и бесплатная 2D-графическая библиотека. Это родной порт Object Pascal библиотеки Anti-Grain Geometry - AGG, первоначально написанный Максимом Шеманаревым в С++. AggPas не зависит от какого-либо графического API или технологии. В принципе, вы можете думать об AggPas как о механизме рендеринга, который создает пиксельные изображения в памяти из некоторых векторных данных.
Вот как выглядит демон perspective
:
После преобразования:
Общая техника описана Джорджем Вольбергом "Цифровое искажение изображения". Это выглядит как этот абстрактный содержит соответствующую математику, как и этот документ. Вам нужно создать перспективную матрицу, которая отображает один квадрат на другой. В приведенных выше ссылках показано, как создать матрицу. После того, как у вас есть матрица, вы можете сканировать выходной буфер, выполнить преобразование (или, возможно, обратное - в зависимости от того, что они вам дают), и это даст вам очки в исходном изображении, которое вы можете скопировать.
Может быть проще использовать OpenGL, чтобы нарисовать квадрат с четырьмя точками, но он не использует GDI, как вы хотели.