polygon | polygon



  • hallo!

    Wie kann ich von zwei mit CreatePolygonRgn() erstellen Polygonen
    ein "OR-Polygon" erstellen? sprich: eine dritte Fläche mit allen
    Pixeln die die zwei anderen Flächen NICHT gemeinsam haben.

    ich hoffe ich habe mich halbwegs verständlich ausgedrückt..

    danke für eure hilfe

    maTTYhias



  • Hm, müsste mit CombineRgn() gehen. Tipp: Das ist nicht OR, sondern XOR, was du meinst.

    [ Dieser Beitrag wurde am 03.01.2003 um 00:37 Uhr von WebFritzi editiert. ]



  • In der MSDN steht bei CombineRgn, dass es nur
    Drei Parameter benötigt (Region1, 2, und AND/OR...)
    Unter VC++ braucht es aber komischerweise vier!?
    3 Regions und die Combine Mode.

    Ich möchte doch einfach nur in eine Region zwei andere
    Regions reinkombinieren.

    Beispiel:

    ...
    POINT r[4];
    HRGN hRgn;
    HBRUSH hBrush;
    
    HRGN allRgn;
    HRGN oldRgn;
    
    for (int i = 0; i < 6; i++)
    {
       r[0].x = (int)currCube->cube->rect[i].p0.sx;
       r[0].y = (int)currCube->cube->rect[i].p0.sy;
       r[1].x = (int)currCube->cube->rect[i].p1.sx;
       r[1].y = (int)currCube->cube->rect[i].p1.sy;
       r[2].x = (int)currCube->cube->rect[i].p2.sx;
       r[2].y = (int)currCube->cube->rect[i].p2.sy;
       r[3].x = (int)currCube->cube->rect[i].p3.sx;
       r[3].y = (int)currCube->cube->rect[i].p3.sy;
    
       hRgn   = CreatePolygonRgn(r, 4, ALTERNATE);
       hBrush = CreateSolidBrush(currCube->cube->rect[i].color);
       FillRgn(dc, hRgn, hBrush);
    
       // Alle flächen zusammensammeln und in allRgn speichern
       CombineRgn(???????????, RGN_OR);
    
       DeleteObject(hBrush);
       DeleteObject(hRgn);
    }
    
    // Alte Rgn mit neuer XORn und ergebnisfläche mit hintergrundfarbe
    // übermalen
    CombineRgn(???????????, RGN_XOR);
    ...
    

    ERLÄUTERUNG:

    Der obige Code ist ein ausschnitt aus meiner kleinen
    3D Anwendung. Er dient dazu (besser: sollte später mal dazu dienen),
    alle Seiten eines Würfels hinzumalen und die Gesamtfläche in allRgn
    zu speichern. Beim nächsten Zeichen des (inzwischen um ein paar
    Grad rotierten Würfels), wird wieder ein Rgn der neuen gesamtfläche
    erstellt, mit der vorigen Region ge-XORT und somit weiß ich was
    ich mit der Hintergrundfarbe übermalen muss, um die "Reste" des
    vorigen Würfels wegzukriegen. mit dieser Methode, müsste ich doch
    das flackern umgehen können, dass auftritt, wenn ich einfach
    den ganzen Bildschirm vor jedem neuzeichnen des Würfels refreshe,
    oder?



  • int CombineRgn(
    
        HRGN hrgnDest,  // handle to destination region 
        HRGN hrgnSrc1,  // handle to source region 
        HRGN hrgnSrc2,  // handle to source region 
        int fnCombineMode   // region combining mode 
       );
    

    Wo ist dein Problem? Das erste ist die Region, wo am Ende die beiden "Ausgangs-Regionen" enthalten sind.

    cu para
    😃



  • Das flackern kannst du auch mit BackBuffering bzw. DoubleBuffering verhindern!
    Dabei zeichnest du einfach immer alles in einen DC im Speicher und Blittest diesen dann in WM_PAINT auf den normalen DC deines Client-Bereichs!

    [ Dieser Beitrag wurde am 03.01.2003 um 14:45 Uhr von flenders editiert. ]


Anmelden zum Antworten