Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Rotate: PlgBlt(ihdc, @Vert(0), shdc, 0, 0, wi, hi, 0, 0, 0)?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 10.04.2012, 13:14    Titel: Rotate: PlgBlt(ihdc, @Vert(0), shdc, 0, 0, wi, hi, 0, 0, 0)? Antworten mit Zitat

Hallo, wie kann man bitte mit dieser Routine in Freebasic ein Bild drehen?
Darstellen in einem normalen Freebasic-Fenster.

Danke.

Gruss

Code:

Procedure RotateIm(ImNr.i, wkl.f)
  Dim Vert.POINT(2)
 
  wi.i = ImageWidth(ImNr)
  hi.i = ImageHeight(ImNr)
  ; Vert(0) = linke obere Ecke
  ; Vert(1) = rechte obere Ecke
  ; Vert(2) = linke untere Ecke der gedrehten Image berechnen
  Vert(0)\x = 0
  Vert(0)\y = 0
  Vert(1)\x = wi * Cos(wkl)
  Vert(1)\y = wi * Sin(wkl)
  Vert(2)\x = -1 * hi * Sin(wkl)
  Vert(2)\y = hi * Cos(wkl)
  ; Die nächsten 4 If - Bedingungen dienen nur dazu, das die Ecken des Bildes nicht aus den sichtbaren Bereich herausrutschen
  If Vert(1)\x < 0
    Vert(0)\x = -1 * Vert(1)\x
    Vert(2)\x - Vert(1)\x
    Vert(1)\x = 0
  EndIf
  If Vert(2)\x < 0
    Vert(0)\x = -1 * Vert(2)\x
    Vert(1)\x - Vert(2)\x
    Vert(2)\x = 0
  EndIf
  If Vert(1)\y < 0
    Vert(0)\y = -1 * Vert(1)\y
    Vert(2)\y - Vert(1)\y
    Vert(1)\y = 0
  EndIf
  If Vert(2)\y < 0
    Vert(0)\y = -1 * Vert(2)\y
    Vert(1)\y - Vert(2)\y
    Vert(2)\y = 0
  EndIf
  CreateImage(1, 700, 600)
  ihdc = StartDrawing(ImageOutput(1))
  shdc = CreateCompatibleDC_(ihdc)
  obm.i = SelectObject_(shdc, ImageID(0))
  PlgBlt_(ihdc, @Vert(0), shdc, 0, 0, wi, hi, 0, 0, 0)
  DeleteDC_(shdc)
  StopDrawing()
  CopyImage(1, 0)
EndProcedure
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 10.04.2012, 13:48    Titel: Antworten mit Zitat

Hi,
warum sollte man diese alte Routine aus Purebasic (http://www.purebasic.fr/german/viewtopic.php?p=225337#p225337) für FB umsetzen? mit den Augen rollen

In FB gibt es eigene sehr gute Routinen für Rotation von Bildern!
(http://www.freebasic-portal.de/code-beispiele/grafik-und-fonts/rotation-skalierung-mit-multiput-241.html)
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4703
Wohnort: ~/

BeitragVerfasst am: 10.04.2012, 13:49    Titel: Antworten mit Zitat

Wollte ich auch gerade sagen, war ein bisschen zu langsam neutral
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 11.04.2012, 10:05    Titel: Antworten mit Zitat

Die von Freebasic ist sehr langsam und die Pixel werden beim Drehen ungenau an den Kannten gesetzt, die Kannten sind Teilweise ausgefranst.


Danke.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 11.04.2012, 12:36    Titel: Antworten mit Zitat

Hi,
dir ist doch schon GDI+ zu langsam (http://www.freebasic.net/forum/viewtopic.php?p=171204#p171204) und da glaubst du das die alte PlgBlt schneller ist? Kopf schütteln

Zudem muss noch jede Menge Beicode für ein FB-Image geprogt werden.
Wenn du viel Langeweile hast mach mal (lernen kann man dabei).
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 12.04.2012, 13:54    Titel: Antworten mit Zitat

RotateScaleHQ ist mein Favorit:
http://www.freebasic.net/forum/viewtopic.php?f=8&t=14735

Übrigens: Kopieren allein bringt nichts, du musst auch lernen fremden Code zu verstehen und diesen anzuwenden.
Und ganz wichtig beim einbinden von fremden Code: sich nicht für den fremden Code rühmen und ursprüngliche Autorenangabe und Copyright dabei lassen; denn sonst nennt man das Plagiat und das sollte eigentlich bestraft werden.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 12.04.2012, 17:43    Titel: Antworten mit Zitat

GDI ist ja auch so unfassbar langsam. Geeenau.

Wenn du's schnell haben willst, musst du halt Systeme für Echtzeitdarstellung (OpenGL, DirectX) nehmen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 13.04.2012, 15:29    Titel: Antworten mit Zitat

Mit dem GDI bekommst du keine scharfen Kannten, weil alles dort weich gezeichnet wird. Wenn du bei GDI dann Transparent machst, dann sieht man an den Rändern immer noch die Farbreste der transparenten Farbe.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 21.05.2012, 17:56    Titel: Antworten mit Zitat

Hallo, guten Tag.
Ich habe mal eine Bitte.
Wer kann mir das mal für ein normaes Freebasicfenster umstellen ohne Timer, nur das die Rotation funktioniert.
Danke.

Gruss

Code:

#Include "window9.bi"

    #Ifndef PI
    #define PI 3.14159265358979323846
    #EndIf

    Declare Sub DrawRotated(DC As HDC, Bitmap As HBITMAP, X As Integer, Y As Integer ,width_ As Integer, height As Integer, Angle As Single )
    Declare Sub timerRotate()
    Dim Shared As HBITMAP bmp
    Dim Shared As hwnd hwnd
    Dim Shared angle As Single
   
    hwnd =OpenWindow("Draw",100,100,320,240)
    bmp=Create_Image(50,50)
    Var hdc = ImageStartDraw(bmp)
    BoxDraw(10,10,30,30,255,255)
    StopDraw


    SetTimer(hwnd,1,1,Cast(TIMERPROC,@timerRotate()))
    Do : Loop Until WaitEvent=EventClose

    Sub timerRotate()
    Var hdc = WindowStartDraw(hwnd)
    FillRectDraw( 10 , 10 ,&hf0f0f0  )
    angle+=1
    DrawRotated(hdc,bmp,130,70,50,50,angle)
    StopDraw
    End Sub
   
    Sub DrawRotated(DC As HDC, Bitmap As HBITMAP, X As Integer, Y As Integer ,width_ As Integer, height As Integer, Angle As Single )
       Dim As HDC TempDC
       Dim As SIZE BmpSize
       Dim As Single Radians
       Dim As Point Points(0 To 2)
       Dim As Integer  Xc, Yc

       TempDC = CreateCompatibleDC(DC)
       SelectObject(TempDC, Bitmap)

       BmpSize.cx=width_
       BmpSize.cy=height
       Radians = Angle * Pi / 180

       With BmpSize
          'find center.
          Xc = X + (.cX \ 2)
          Yc = Y + (.cY \ 2)
          'calc.
          Points(0).X = (X - Xc) * Cos(Radians) - (Y - Yc) * Sin(Radians) + Xc
          Points(0).Y = (Y - Yc) * Cos(Radians) + (X - Xc) * Sin(Radians) + Yc

          Points(1).X = (X + .cX - Xc) * Cos(Radians) - (Y - Yc) * Sin(Radians) + Xc
          Points(1).Y = (Y - Yc) * Cos(Radians) + (X + .cX - Xc) * Sin(Radians) + Yc

          Points(2).X = (X - Xc) * Cos(Radians) - (Y + .cY - Yc) * Sin(Radians) + Xc
          Points(2).Y = (Y + .cY - Yc) * Cos(Radians) + (X - Xc) * Sin(Radians) + Yc

          'draw.
          PlgBlt(DC, @Points(0), TempDC, 0, 0, .cX, .cY, 0, 0, 0)
          DeleteDC(TempDC)
       End With
    End Sub


Zuletzt bearbeitet von arduno am 21.05.2012, 23:52, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 21.05.2012, 18:37    Titel: Antworten mit Zitat

Hi,
wodurch soll denn die Rotation ausgelöst werden??
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 21.05.2012, 23:47    Titel: Antworten mit Zitat

Hmm..., durch "angle", welches übergeben wird.
Und dann : Radians = Angle * Pi / 180

Oder was meinst du?

Danke.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 22.05.2012, 01:58    Titel: Antworten mit Zitat

Code:

'...
    'SetTimer(hwnd,1,1,Cast(TIMERPROC,@timerRotate()))
    Do
        timerRotate()
        sleep 1, 1
    Loop 'Until WaitEvent=EventClose
'...



MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 22.05.2012, 08:47    Titel: Antworten mit Zitat

Hmm.., jetzt habe ich die Frage verstanden.

Es soll im normalen Freebasic ohne Timer gehen.

Danke.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz