Mal wieder was in GDI+: Echtzeit Projektion und Rotation einer Earth Map (600x300) auf eine Kugel.
Earth4_600x300.jpg ==> Rotating Earth.jpg
Leider ist die Animation nicht besonders performant, aber sieht dafür hübsch aus.
Inspiriert durch Eukalyptus' Black Hole Code. U
Source Code ist nicht vollständig!
AutoIt
;coded by UEZ build 2017-02-25
#pragma compile(Icon, "c:\Program Files (x86)\AutoIt3\Icons\au3.ico")
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/so /pe /rm
#AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3"
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
_GDIPlus_Startup()
Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit
Global Const $iW = 800, $iH = 500, $iWh = $iW / 2, $iHh = $iH / 2, $sTitle = "GDI+ Rotating Earth coded by UEZ 2017"
Global Const $fPi = ACos(-1), $fRad = $fPi / 180, $fDeg = 180 / $fPi
AutoItSetOption("GUIOnEventMode", 1)
GDIPlus_RotatingEarth()
AutoItSetOption("GUIOnEventMode", 0)
_GDIPlus_Shutdown()
Func GDIPlus_RotatingEarth()
$bExit = False
$hGUI = GUICreate($sTitle, $iW, $iH) ;, 0, 0, $WS_POPUP)
GUISetState(@SW_SHOW, $hGUI)
;~ GUISetCursor(16, 1)
;create canvas elements
Local Const $hDC = _WinAPI_GetDC($hGUI)
Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
Local Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC)
Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap)
Local Const $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer)
_GDIPlus_GraphicsSetSmoothingMode($hCanvas, $GDIP_SMOOTHINGMODE_HIGHQUALITY)
_GDIPlus_GraphicsSetPixelOffsetMode($hCanvas, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)
Local Const $hBrush_Clr = _GDIPlus_BrushCreateSolid(0xFF000000), _
$hBrush_FPS = _GDIPlus_BrushCreateSolid(0xFFF0F0F0), _
$hFormat_FPS = _GDIPlus_StringFormatCreate(), _
$hFamily_FPS = _GDIPlus_FontFamilyCreate("Arial"), _
$hFont_FPS = _GDIPlus_FontCreate($hFamily_FPS, 8), _
$tLayout_FPS = _GDIPlus_RectFCreate(0, 0, 60, 16), _
$hImage_Earth = _GDIPlus_BitmapCreateFromMemory(_Earth()), _
$hImage_Galaxy = _GDIPlus_BitmapCreateFromMemory(_Galaxy()), _
$hMatrix = _GDIPlus_MatrixCreate(), $hPath = _GDIPlus_PathCreate()
Local $aDim = _GDIPlus_ImageGetDimension($hImage_Earth)
Local Const $hGfx = _GDIPlus_ImageGetGraphicsContext($hImage_Earth)
_GDIPlus_GraphicsDrawStringEx($hGfx, "Coded by UEZ 2017 ;-)", $hFont_FPS, _GDIPlus_RectFCreate(0, $aDim[1] / 2 - 4, 120, 12), $hFormat_FPS, $hBrush_FPS)
_GDIPlus_ImageDispose($hGfx)
Local Const $hTexture_Earth = _GDIPlus_TextureCreate($hImage_Earth)
DllCall($__g_hGDIPDll, "int", "GdipTranslateTextureTransform", "ptr", $hTexture_Earth, "float", -200, "float", 0, "long", 0)
Local $iDiameter = $aDim[0] < $aDim[1] ? $aDim[0] : $aDim[1], _
$iDiameter2 = $iDiameter / 2, _
$fDX = ($iW - $iDiameter) / 2, $fDY = ($iH - $iDiameter) / 2
_GDIPlus_PathAddEllipse($hPath, $fDX - 1, $fDY - 1, $iDiameter + 2, $iDiameter + 2)
Local Const $hBrush = _GDIPlus_PathBrushCreateFromPath($hPath)
_GDIPlus_PathBrushSetCenterColor($hBrush, 0x04000008)
_GDIPlus_PathBrushSetCenterPoint($hBrush, $fDX + $iDiameter2 + 1, $fDY + $iDiameter2 + 1)
_GDIPlus_PathBrushSetSurroundColor($hBrush, 0xF0000000)
_GDIPlus_PathBrushSetGammaCorrection($hBrush, 1)
_GDIPlus_PathBrushSetFocusScales($hBrush, 0.5, 0.5)
$iFPS = 0
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About")
AdlibRegister("CalcFPS", 1000)
Local $fScale, $fTmp, $iStep = 2 ;the higher $iStep is the faster the animation & lower the quality.
Do
;~ DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush_Clr, "float", 0, "float", 0, _
;~ "float", $iW, "float", $iH) ;erase canvas background
;~ _WinAPI_BitBlt($hDC_backbuffer, 0, 0, $iW, $iH, $hDC_backbuffer, 0, 0, $BLACKNESS)
_GDIPlus_GraphicsDrawImageRect($hCanvas, $hImage_Galaxy, 0, 0, $iW, $iH)
DllCall($__g_hGDIPDll, "int", "GdipTranslateTextureTransform", "ptr", $hTexture_Earth, "float", 0.75, "float", 0, "long", 0)
For $i = 1 To $iDiameter2 Step $iStep
$fScale = 1 + $i / $iDiameter2
_GDIPlus_MatrixSetElements($hMatrix, 1, 0, 0, 1, 0, 0)
_GDIPlus_MatrixTranslate($hMatrix, $fDX + $iDiameter2, $fDY + $iDiameter2)
_GDIPlus_MatrixScale($hMatrix, $fScale, $fScale)
_GDIPlus_MatrixTranslate($hMatrix, -$iDiameter2, -$iDiameter2)
_GDIPlus_GraphicsSetTransform($hCanvas, $hMatrix)
DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hCanvas, "handle", $hTexture_Earth, _
"float", $i, "float", $i, "float", $iDiameter - $i * 2, "float", $iDiameter - $i * 2)
Next
_GDIPlus_MatrixSetElements($hMatrix, 1, 0, 0, 1, 0, 0)
_GDIPlus_GraphicsSetTransform($hCanvas, $hMatrix)
_GDIPlus_GraphicsFillRect($hCanvas, $fDX, $fDY, $iDiameter, $iDiameter, $hBrush)
_GDIPlus_GraphicsDrawStringEx($hCanvas, "FPS: " & $iShowFPS, $hFont_FPS, $tLayout_FPS, $hFormat_FPS, $hBrush_FPS) ;draw background message text
_WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hDC_backbuffer, 0, 0, $SRCCOPY) ;blit drawn bitmap to GUI
$iFPS += 1
If $bExit Then ExitLoop
Until Not Sleep(10)
AdlibUnRegister("CalcFPS")
;release resources
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_PathDispose($hPath)
_GDIPlus_MatrixDispose($hMatrix)
_GDIPlus_ImageDispose($hImage_Earth)
_GDIPlus_ImageDispose($hImage_Galaxy)
_GDIPlus_BrushDispose($hTexture_Earth)
_GDIPlus_FontDispose($hFont_FPS)
_GDIPlus_FontFamilyDispose($hFamily_FPS)
_GDIPlus_StringFormatDispose($hFormat_FPS)
_GDIPlus_BrushDispose($hBrush_Clr)
_GDIPlus_BrushDispose($hBrush_FPS)
_GDIPlus_GraphicsDispose($hCanvas)
_WinAPI_SelectObject($hDC_backbuffer, $DC_obj)
_WinAPI_DeleteDC($hDC_backbuffer)
_WinAPI_DeleteObject($hHBitmap)
_WinAPI_ReleaseDC($hGUI, $hDC)
GUIDelete($hGUI)
EndFunc ;==>GDIPlus_RotatingEarth
Func _Exit_About()
$bExit = True
EndFunc ;==>_Exit_About
Func CalcFPS() ;display FPS
$iShowFPS = $iFPS
$iFPS = 0
EndFunc ;==>CalcFPS
;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2016-12-01
...
Alles anzeigen
Bitte Dateianhang herunterladen!
Mit der Variable $iStep in Zeile 73 kann man die Geschwindigkeit anpassen. Je höher desto schneller, aber die Qualität wird auch schlechter.