  | 
					
						Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!   
						
						
					 | 
				 
			 
			 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	 
	
	
		| Autor | 
		Nachricht | 
	 
	
		arduno
 
 
  Anmeldungsdatum: 12.05.2011 Beiträge: 252
 
  | 
		
			
				 Verfasst am: 10.04.2012, 12:14    Titel: Rotate: PlgBlt(ihdc, @Vert(0), shdc, 0, 0, wi, hi, 0, 0, 0)? | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		 | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		nemored
 
  
  Anmeldungsdatum: 22.02.2007 Beiträge: 4712 Wohnort: ~/
  | 
		
			
				 Verfasst am: 10.04.2012, 12:49    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Wollte ich auch gerade sagen, war ein bisschen zu langsam   _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		arduno
 
 
  Anmeldungsdatum: 12.05.2011 Beiträge: 252
 
  | 
		
			
				 Verfasst am: 11.04.2012, 09:05    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 11.04.2012, 11:36    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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?    
 
 
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 | 
		 | 
	 
	
		  | 
	 
	
		St_W
 
  
  Anmeldungsdatum: 22.07.2007 Beiträge: 958 Wohnort: Austria
  | 
		
			
				 Verfasst am: 12.04.2012, 12:54    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		28398
 
 
  Anmeldungsdatum: 25.04.2008 Beiträge: 1917
 
  | 
		
			
				 Verfasst am: 12.04.2012, 16:43    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		arduno
 
 
  Anmeldungsdatum: 12.05.2011 Beiträge: 252
 
  | 
		
			
				 Verfasst am: 13.04.2012, 14:29    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		arduno
 
 
  Anmeldungsdatum: 12.05.2011 Beiträge: 252
 
  | 
		
			
				 Verfasst am: 21.05.2012, 16:56    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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, 22:52, insgesamt einmal bearbeitet | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 21.05.2012, 17:37    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		arduno
 
 
  Anmeldungsdatum: 12.05.2011 Beiträge: 252
 
  | 
		
			
				 Verfasst am: 21.05.2012, 22:47    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hmm..., durch "angle", welches übergeben wird.
 
Und dann : Radians = Angle * Pi / 180 
 
 
Oder was meinst du?
 
 
Danke.
 
 
Gruss | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ThePuppetMaster
 
  
  Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
  | 
		
			
				 Verfasst am: 22.05.2012, 00:58    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | 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 | 
		 | 
	 
	
		  | 
	 
	
		arduno
 
 
  Anmeldungsdatum: 12.05.2011 Beiträge: 252
 
  | 
		
			
				 Verfasst am: 22.05.2012, 07:47    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hmm.., jetzt habe ich die Frage verstanden.
 
 
Es soll im normalen Freebasic ohne Timer gehen.
 
 
Danke.
 
 
Gruss | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
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.
  | 
   
 
     |