Drehbewegungen realisieren mit Borland C++



  • Hallo,

    ich habe ein kleines Projekt mit Borland gestartet und komme nun an einem Punkt nicht weiter. Hintergrund zu diesem Projekt ist, ein Positionierungsroboter soll von einem Fließband eine Felge runter greifen, eine 180° Drehung vollziehen und anschließend die Felge auf einem weiteren Fließband was in entgegengesetzter Richtung verläuft ablegen.

    Ich habe jetzt ein wenig im Internet recherchiert und bin auf einen Quelltext gestoßen, der interessant aussieht, sich aber nicht compilieren lässt... Ich habe die Änderungen auch soweit vorgenommen, wie ich das im Text verstanden habe und wollte einmal hier um Hilfe bitten.

    -----------------------------------------------------------
    
    HBITMAP GetRotatedBitmap(HBITMAP hBitmap, 			//hBitmap ist die Ausgangsbitmap die rotiert werden soll
                             float radians,  
                             COLORREF clrBack )
    {
      CDC sourceDC, destDC;
      sourceDC.CreateCompatibleDC( NULL );
      destDC.CreateCompatibleDC( NULL );
    
      BITMAP bm;
      ::GetObject( hBitmap, sizeof( bm ), &bm );
    
    // Winkelberechnung
    
      float cosine = (float)cos(radians);
      float sine = (float)sin(radians);
    
    //Rotation um 3 Ecken, eine konstant
    
      int x1 = (int)(-bm.bmHeight * sine);
      int y1 = (int)(bm.bmHeight * cosine);
      int x2 = (int)(bm.bmWidth * cosine -   bm.bmHeight * sine);
      int y2 = (int)(bm.bmHeight * cosine + bm.bmWidth * sine);
      int x3 = (int)(bm.bmWidth * cosine);
      int y3 = (int)(bm.bmWidth * sine);
    
      int minx = min(0,min(x1, min(x2,x3)));
      int miny = min(0,min(y1, min(y2,y3)));
      int maxx = max(x1, max(x2,x3));
    
      int maxy = max(y1, max(y2,y3));
    
      int w = maxx - minx;
      int h = maxy - miny;
    
    //Wechsel Abbildungsmodus Hintergrundfarbe ändern
    
      HBRUSH hbrBack = CreateSolidBrush(clrBack);
      HBRUSH hbrOld = (HBRUSH)::SelectObject(destDC.m_hDC, hbrBack);
      destDC.PatBlt(0, 0, w, h, PATCOPY);
      ::DeleteObject( ::SelectObject( destDC.m_hDC, hbrOld ) );
    
    //Koordinatensystem drehen
    
      sourceDC.SetMapMode(MM_ISOTROPIC);
      sourceDC.SetWindowExt(1,1);
      sourceDC.SetViewportExt(1,-1);
      sourceDC.SetViewportOrg(0, bm.bmHeight-1);
    
      destDC.SetMapMode(MM_ISOTROPIC);
      destDC.SetWindowExt(1,1);
      destDC.SetViewportExt(1,-1);
      destDC.SetWindowOrg(minx, maxy);
    
    // Schleife zum durchlaufen der Bildpunkte
    
      for( int y = miny; y < maxy; y++ )
      {
        for( int x = minx; x < maxx; x++ )
        {
          int sourcex = (int)(x*cosine + y*sine);
          int sourcey = (int)(y*cosine - x*sine);
          if( sourcex >= 0 && sourcex < bm.bmWidth && 
              sourcey >= 0 && sourcey < bm.bmHeight )
            destDC.SetPixel(x,y,sourceDC.GetPixel(sourcex,sourcey));
        }
      }
    
    //Kontexte zerstören, Ereignisbitmap als Funktionsergebnus zurückgegeben
    
      ::SelectObject(sourceDC.m_hDC, 
                     hbmOldSource);
      ::SelectObject(destDC.m_hDC, 
                     hbmOldDest);
    
      return hbmResult;
    }
    -----------------------------------------------------------------------
    

    Das ist jetzt der gesamte Quelltext, den ich für die Rotation einer Bitmap benutzen möchte, da ich sonst keine andere Möglichkeit kenne, eine Bitmap rotieren zu lassen.

    Die Fehlermeldung die nun kommt kann ich leider nicht nachvollziehen:

    [C++ Error] myPro_Simu.cpp(33): E2108 Improper use of typedef 'HBITMAP'

    Kann mir hier vielleicht jemand weiterhelfen?
    Vielen Dank für eure Bemühungen!

    Gruß

    schlayter



  • Geht es hier um das alte Borland C++ (von vor 1996) oder um den C++ Builder ?

    Für letzteren, bei Verwendung der VCL, findet eine einfache Google Suche das hier:
    http://www.leunen.com/cbuilder/rotbmp.html

    Und was deine Fehlermeldung angeht, formatiere deine Code ordentlich und benutze Code-Tags. Und wer soll so schon wissen, wo bei dir Zeile 33 ist ...



  • Schön das du den Code jetzt formatiert hast.

    Das erste, was mir jetzt auffällt: CDC ist eine Klasse aus der MFC von Microsoft. Also ist dein Quelltext für Visual C++ gedacht und funktioniert so nicht mit Borland (egal ob alt oder neu).



  • ok das erklärt natürlich einiges, aber ich habe eine andere lösung für das problem gefunden, was ich dann nur noch verfeinern muss 🙂

    gruß


Anmelden zum Antworten