Jak mogę renderować kwadratową bitmapę na dowolny czworokątny wielokąt przy użyciu GDI?

Muszę namalować kwadratowy obraz, zmapowany lub przekształcony w Nieznany w czasie kompilacji Czterokątny wielokąt. Jak mogę to zrobić?

Dłuższe Wyjaśnienie

Specyficznym problemem jest renderowanie płytki mapy z nie-prostokątną projekcją mapy. Załóżmy, że mam następujący kafelek:

Płytka kwadratowa

I Wiem, że cztery punkty narożne muszą być tutaj:

Cztery zniekształcone narożniki

Biorąc pod uwagę, że chciałbym uzyskać następujące wyjście:

Zniekształcony, odwzorowany obrazowo wielokąt

Kwadrat dachówka może być:

  • obrócony; i / lub
  • być węższe na jednym końcu niż na drugim.

I myślę drugi element oznacza, że wymaga to transformacji nie-afinicznej.

Losowe dodatkowe uwagi

czterostronny? jest prawdopodobne, że aby być całkowicie poprawnym, płytka powinna być odwzorowane na wielokąt z więcej niż czterema punktami, ale dla naszych celów a w skali jest narysowany kwadrat - > inne czworokąt-wielokąt transformacja powinna wystarczyć.

dlaczego najlepiej tylko GDI? wszystkie renderowanie do tej pory odbywa się przy użyciu GDI, i chcę zachować kod (a) szybki i (b) wymagający jak mało dodatkowych biblioteki jak to możliwe. Zdaję sobie sprawę z pewnego wsparcia dla transformacje w GDI i eksperymentowali z nimi dzisiaj, ale nawet po eksperymentach z nimi nie jestem pewien, czy są wystarczająco elastyczny do tego celu. Jeśli tak, to nie udało mi się. wymyśl coś, więc będę wdzięczny za przykładowy kod.

GDI+ też jest ok, ponieważ używamy go gdzie indziej, ale wiem, że może być wolny, a prędkość jest ważne.

Inną alternatywą jest cokolwiek Delphi - / C++Builder -specyficzny; ten program jest napisany głównie w C++ za pomocą VCL, a omawiane grafiki są obecnie malowane do Tcanvas z mieszanką metod TCanvas i surowych wywołań WinAPI/GDI.

nakładanie obrazów: Ostatnie zastrzeżenie jest takie, że jeden kolor w kafelku może być dla klucza koloru przezroczystość: czyli wszystkie białe (powiedzmy) kwadraty na powyższym kafelku powinien być przezroczysty po narysowaniu tego, co jest pod spodem. Obecnie płytki są rysowane na kwadrat lub prostokątne wyrównane do osi cele za pomocą TransparentBlt.

Przepraszam za wszystkie dodatkowe zastrzeżenia, które komplikują to pytanie niż " jakiego algorytmu powinienem użyć?'Ale będę chętnie przyjmuj odpowiedzi z tylko informacje algorytmiczne.

Author: NGLN, 2012-03-08

3 answers

Możesz też rzucić okiem na Graphics32 . Zrzut ekranu pokazuje jak wygląda demo transfrom w GR32

 6
Author: iamjoosy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-08 14:51:51

Spójrz na grafika wektorowa 3D Lab. (Specjalnie "boisko piłkarskie" w demo).


Kolejnym fajnym zasobem jest AggPas z pełnym źródłem (download )

AggPas jest otwartoźródłową i bezpłatną biblioteką grafiki wektorowej 2D. Jest to natywny port Object Pascala Biblioteki anty-Grain Geometry - AGG, pierwotnie napisany przez Maksima Szemanarewa w C++. AggPas nie zależy od żadnego graficznego API ani technologii. Zasadniczo można myśleć AggPas od silnika renderującego, który wytwarza Pikselowe obrazy w pamięci z niektórych danych wektorowych.

Oto jak wygląda demo perspective:

Tutaj wpisz opis obrazka

Po transformacji:

Tutaj wpisz opis obrazka

 6
Author: kobik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-08 12:13:37

Ogólna technika jest opisana w "Digital Image Warping"George' a Wolberga. Wygląda na to, że Ten abstrakt zawiera odpowiednią matematykę, podobnie jak Ten artykuł. Musisz stworzyć matrycę perspektywiczną, która odwzorowuje z jednego quada na drugi. Powyższe linki pokazują jak stworzyć macierz. Po uzyskaniu macierzy można zeskanować bufor wyjściowy, wykonać transformację (lub ewentualnie odwrotną - w zależności od tego, co dają), a to da punkty w oryginalny obraz, z którego można skopiować.

Łatwiej byłoby użyć OpenGL, aby narysować teksturowany kwadrat między 4 punktami, ale to nie używa GDI, tak jak chciałeś.

 5
Author: user1118321,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-02 06:52:56