Langen AutoIt Code bitte als Spoiler mit Code Highlight posten:
Quellcode ->
->
-> STRG-V
Langen AutoIt Code bitte als Spoiler mit Code Highlight posten:
Quellcode ->
->
-> STRG-V
Der Support / die Refrenz für Perseus 2.6 ist eingestellt. Den Download lasse ich noch so lange wie möglich verfügbar, bevor bald Perseus++ herausgegeben wird.
Du kannst dafür ebenso die Excel UDF von water (?) nutzen. Ist deutlich zuverlässiger als die Tasten zu "drücken" und wahrscheinlich auch um einiges schneller.
Ich such mir gerade nen Wolf....
Wir brauchen Mond & Sterne. Mond ist Sonne in weiß + Halo aus einem anderen weißen Kreis, der radial transparenter wird. Sterne müssen auch blinken ![]()
Eine LUT empfiehlt sich zumindest (pre-generiert, nicht hard-gecodet). Damit kann man schon 400*60 Berechnungen sparen, wenn man nur ein sin(x) ersetzt.
Macht bei mir keinen Unterschied ![]()
Ich habe übrigens Width und Height ganz bewusst entfernt, da in den Formeln viele konstante Zahlen sind, die von 400 als festen Wert ausgehen.
Der Deal hier ist wohl eher die Mathematik. ASM empfiehlt sich ![]()
Die AutoIt Versionen sind alle sauber. Die Dateien im Archiv sind alle auch nochmal geprüft.
Wahrscheinlich lauert ein Scherzvirus auf deiner Platte, der irgendwie AutoIt als Runtime braucht.
Skript und Formeln sind nun auf neuestem Stand.
//1: Dann lassen wir die fancy Ladebalken gleich weg, sonst siehts sch**** aus ![]()
//2: Sinnvolle Variablen-Namen
#include <WindowsConstants.au3>
#include <WinAPI.au3>
Opt("WinTitleMatchMode", 2)
Global $nFrames = 60
Global $nFPS = 30
If $nFrames < $nFPS Then $nFrames = $nFPS
Global $aBitmaps[$nFrames][4]
For $i = 0 To $nFrames - 1
$aBitmaps[$i][2] = _WinAPI_CreateCompatibleDC(0)
$tBMI = DllStructCreate($tagBITMAPINFO)
DllStructSetData($tBMI, 1, DllStructGetSize($tBMI) - 4)
DllStructSetData($tBMI, 2, 400)
DllStructSetData($tBMI, 3, 400)
DllStructSetData($tBMI, 4, 1)
DllStructSetData($tBMI, 5, 32)
$aDIB = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$aBitmaps[$i][1] = $aDIB[0]
$aBitmaps[$i][0] = $aDIB[4]
_WinAPI_SelectObject($aBitmaps[$i][2], $aBitmaps[$i][1])
$aBitmaps[$i][3] = DllStructCreate("dword[160000]", $aBitmaps[$i][0])
Next
Global $fPi = 4 * ATan(1)
$hGUI = GUICreate("Animated Landscape")
$hDC = _WinAPI_GetDC($hGUI)
GUISetState()
For $iFrame = 1 To $nFrames
$SunX = -14 + ((39 / ($nFrames - 1)) * ($iFrame - 1))
$SunY = -(27 / 380) * $SunX ^ 2 + (297 / 380) * $SunX + (945 / 38)
$fAmbientLight = ($SunY / 27)
$iFrameTimer = TimerInit()
$iSunRedSaturation = Int(0.111 * $iFrame ^ 2 - 6.667 * $iFrame + 100)
For $fy = 0 To 400
$y = -15 + $fy * 0.125
For $fx = 0 To 400
$x = -20 + $fx * 0.125
$fDirectionalLight = Int((Abs($SunX - ($x + 6)) / 39) * 60)
$iColorARGB = RGB(2 * $iSunRedSaturation, 200 - $iSunRedSaturation, 200 - $iSunRedSaturation)
If $y > Sin($x) And $y > Cos($x) And $y < Tan($x) And $y < Sin($fPi * $x) + 7 And $x < 9 Then
$iColorARGB = RGB(2 * $iSunRedSaturation, 0, 0)
ElseIf ((Mod(Abs($x) - $fPi / 2, 2 * $fPi) - $fPi) ^ 2 + ($y - 8.5 + $x ^ 2 / 250) ^ 2) < 5 And $x < 8 Then
$iColorARGB = RGB(2 * $iSunRedSaturation, 87 + Int(87 * $fAmbientLight) - $fDirectionalLight, 0)
ElseIf ((Mod(Abs($x) + $fPi / 2, 2 * $fPi) - $fPi) ^ 2 + ($y - 7.5 + $x ^ 2 / 280) ^ 2) < 5 And $x < 11 Then
$iColorARGB = RGB(2 * $iSunRedSaturation, 41 + Int(41 * $fAmbientLight) - $fDirectionalLight, 0)
ElseIf $y <= ATan(10 - $x) Then
$iColorARGB = RGB(2 * $iSunRedSaturation, 87 + Int(87 * ($fAmbientLight)) - $fDirectionalLight, 0)
ElseIf $y < ($iFrame / 75) * Sin($x * 2) ^ 2 + 0.5 And $y < $x - 9 Then
$iColorARGB = RGB(2 * $iSunRedSaturation, 0, 87 + Int(87 * $fAmbientLight) - $fDirectionalLight)
ElseIf Abs(30 - ($x - $SunX) ^ 2 - ($y - $SunY) ^ 2) = 30 - ($x - $SunX) ^ 2 - ($y - $SunY) ^ 2 Then
$iColorARGB = RGB(0xFF, 0xFF - 2 * $iSunRedSaturation, 0);0x00FFFF00
EndIf
DllStructSetData($aBitmaps[$iFrame - 1][3], 1, $iColorARGB, $fy * 400 + $fx + 1)
Next
Next
WinSetTitle("Animated Landscape", "", "Animated Landscape Frame " & $iFrame & "/" & $nFrames & " (" & Round((TimerDiff($iFrameTimer) / 1000) * ($nFrames - $iFrame)) & "s remaining)")
_WinAPI_BitBlt($hDC, 0, 0, 400, 400, $aBitmaps[$iFrame - 1][2], 0, 0, $srccopy)
Next
AdlibRegister("DrawScene", 1000 / $nFPS)
$iFrame = 0
$iAnimator = 1
While GUIGetMsg() <> -3
WEnd
Func RGB($R, $G, $B)
If $R <= 0 Then $R = 0
If $G <= 0 Then $G = 0
If $B <= 0 Then $B = 0
Return '0x00' & Hex($R, 2) & Hex($G, 2) & Hex($B, 2)
EndFunc ;==>RGB
Func DrawScene()
$iFrame += $iAnimator
If $iFrame = $nFrames - 1 Or $iFrame = 0 Then $iAnimator *= -1
_WinAPI_BitBlt($hDC, 0, 0, 400, 400, $aBitmaps[$iFrame][2], 0, 0, $srccopy)
EndFunc ;==>DrawScene
Gerendertes Bild hinzugefügt.
Wer die Frames selbst speichern möchte:
[autoit]$hImage = _GDIPlus_BitmapCreateFromHBITMAP($aBitmaps[$iFrame-1][1])
_GDIPlus_ImageSaveToFile($hImage, @MyDocumentsDir & "\Landscape_Frame_" & $iFrame-1 & ".bmp")
Ich habe das nur getan um mit der aktuellen "Stable" kompatibel zu bleiben. Ansonsten würde mir das nie in den Sinn kommen (Es ist übrigens: Width, -Height, .., Bits) ![]()
Andy hat gestern Quick'n'Dirty das hier in AutoIt umgesetzt.
Was hab ich noch verbessert:
Baumstämme: [Blockierte Grafik: http://r21.img-up.net/trunks665e.gif]
Helle Baumkronen: [Blockierte Grafik: http://e76.img-up.net/leavded6e.gif]
Dunkle Baumkronen: [Blockierte Grafik: http://k12.img-up.net/leavh0f27.gif]
Boden: [Blockierte Grafik: http://g00.img-up.net/ground19fa.gif]
Wasser: [Blockierte Grafik: http://r14.img-up.net/water239a.gif]
Kreis der Sonne: [Blockierte Grafik: http://j11.img-up.net/suneb32.gif]
Bewegung der Sonne auf der Parabel: [Blockierte Grafik: http://h12.img-up.net/sun2eb42.gif]
Rot-Sättigung der Pixel durch die Sonne (Andy): [Blockierte Grafik: http://i82.img-up.net/srs2dee.gif]
Berechnung der Farbwerte:
[Blockierte Grafik: http://g13.img-up.net/trunkrgb1ee0.gif]
[Blockierte Grafik: http://g36.img-up.net/llrgb3852.gif]
[Blockierte Grafik: http://i78.img-up.net/dlrgb29a3.gif]
[Blockierte Grafik: http://d61.img-up.net/eqw908c.gif]
[Blockierte Grafik: http://u82.img-up.net/ebwre7b3.gif]
[Blockierte Grafik: http://o83.img-up.net/avbwjbwc73b.gif]
Das Skripte muss die Szene berechnen, dazu braucht es etwa 5 Minuten.
#include <WindowsConstants.au3>
#include <WinAPI.au3>
Opt("WinTitleMatchMode", 2)
Global $nFrames = 60
Global $nFPS = 30
If $nFrames < $nFPS Then $nFrames = $nFPS
Global $aBitmaps[$nFrames][4]
For $i = 0 To $nFrames - 1
$aBitmaps[$i][2] = _WinAPI_CreateCompatibleDC(0)
$tBMI = DllStructCreate($tagBITMAPINFO)
DllStructSetData($tBMI, 1, DllStructGetSize($tBMI) - 4)
DllStructSetData($tBMI, 2, 400)
DllStructSetData($tBMI, 3, 400)
DllStructSetData($tBMI, 4, 1)
DllStructSetData($tBMI, 5, 32)
$aDIB = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$aBitmaps[$i][1] = $aDIB[0]
$aBitmaps[$i][0] = $aDIB[4]
_WinAPI_SelectObject($aBitmaps[$i][2], $aBitmaps[$i][1])
$aBitmaps[$i][3] = DllStructCreate("dword[160000]", $aBitmaps[$i][0])
Next
Global $fPi = 4 * ATan(1)
$hGUI = GUICreate("Animated Landscape")
$hDC = _WinAPI_GetDC($hGUI)
GUISetState()
For $iFrame = 1 To $nFrames
$SunX = -14 + ((39 / ($nFrames - 1)) * ($iFrame - 1))
$SunY = -(27 / 380) * $SunX ^ 2 + (297 / 380) * $SunX + (945 / 38)
$fAmbientLight = ($SunY / 27)
$iFrameTimer = TimerInit()
$iSunRedSaturation = Int(0.111 * $iFrame ^ 2 - 6.667 * $iFrame + 100)
For $fy = 0 To 400
$y = -15 + $fy * 0.125
For $fx = 0 To 400
$x = -20 + $fx * 0.125
$fDirectionalLight = Int((Abs($SunX - ($x + 6)) / 39) * 60)
$iColorARGB = RGB(2 * $iSunRedSaturation, 200 - $iSunRedSaturation, 200 - $iSunRedSaturation)
If $y > Sin($x) And $y > Cos($x) And $y < Tan($x) And $y < Sin($fPi * $x) + 7 And $x < 9 Then
$iColorARGB = RGB(2 * $iSunRedSaturation, 0, 0)
ElseIf ((Mod(Abs($x) - $fPi / 2, 2 * $fPi) - $fPi) ^ 2 + ($y - 8.5 + $x ^ 2 / 250) ^ 2) < 5 And $x < 8 Then
$iColorARGB = RGB(2 * $iSunRedSaturation, 87 + Int(87 * $fAmbientLight) - $fDirectionalLight, 0)
ElseIf ((Mod(Abs($x) + $fPi / 2, 2 * $fPi) - $fPi) ^ 2 + ($y - 7.5 + $x ^ 2 / 280) ^ 2) < 5 And $x < 11 Then
$iColorARGB = RGB(2 * $iSunRedSaturation, 41 + Int(41 * $fAmbientLight) - $fDirectionalLight, 0)
ElseIf $y <= ATan(10 - $x) Then
$iColorARGB = RGB(2 * $iSunRedSaturation, 87 + Int(87 * ($fAmbientLight)) - $fDirectionalLight, 0)
ElseIf $y < ($iFrame / 75) * Sin($x * 2) ^ 2 + 0.5 And $y < $x - 9 Then
$iColorARGB = RGB(2 * $iSunRedSaturation, 0, 87 + Int(87 * $fAmbientLight) - $fDirectionalLight)
ElseIf Abs(30 - ($x - $SunX) ^ 2 - ($y - $SunY) ^ 2) = 30 - ($x - $SunX) ^ 2 - ($y - $SunY) ^ 2 Then
$iColorARGB = RGB(0xFF, 0xFF - 2 * $iSunRedSaturation, 0);0x00FFFF00
EndIf
DllStructSetData($aBitmaps[$iFrame - 1][3], 1, $iColorARGB, $fy * 400 + $fx + 1)
Next
Next
WinSetTitle("Animated Landscape", "", "Animated Landscape Frame " & $iFrame & "/" & $nFrames & " (" & Round((TimerDiff($iFrameTimer) / 1000) * ($nFrames - $iFrame)) & "s remaining)")
_WinAPI_BitBlt($hDC, 0, 0, 400, 400, $aBitmaps[$iFrame - 1][2], 0, 0, $srccopy)
Next
AdlibRegister("DrawScene", 1000 / $nFPS)
$iFrame = 0
$iAnimator = 1
While GUIGetMsg() <> -3
WEnd
Func RGB($R, $G, $B)
If $R <= 0 Then $R = 0
If $G <= 0 Then $G = 0
If $B <= 0 Then $B = 0
Return '0x00' & Hex($R, 2) & Hex($G, 2) & Hex($B, 2)
EndFunc ;==>RGB
Func DrawScene()
$iFrame += $iAnimator
If $iFrame = $nFrames - 1 Or $iFrame = 0 Then $iAnimator *= -1
_WinAPI_BitBlt($hDC, 0, 0, 400, 400, $aBitmaps[$iFrame][2], 0, 0, $srccopy)
EndFunc ;==>DrawScene
Mich interessiert eher das Halftoning bei dem Sphere-Beispiel. Damit kann man ja 3D darstellen ohne jemals 3D-relevante Berechnungen durchzuführen. Vielleicht eine neue Art von Engine ![]()
Die Hilfe bleibt erhalten, ist aber noch nicht Bug-Frei und deshalb sollte sie noch nicht benutzt werden. (Sie hat bereits einen Spam Schutz, also nicht rumspielen
)
»In der Zeichentabelle«
Nein, ich entschuldige mich dafür. Mein Client hat gesponnen, während ich geschlafen habe. Sorry für den Spam und sorry an alle, die es genervt hat. Kommt nicht wieder vor (ist jetzt entfernt) ![]()
Das ist mir bei AutoIt noch nie passiert. Es wird immer nur ein Kern ausgelastet (das Skript läuft ja auch nur auf einem Thread -> einem Kern).
Würde ich eher als Arbeit rechnen: An der Uni zum Massenberechnen und zum Erstellen von Großen Datensaätzen als Input. Sowie zur Steuerung eines kleinen Clusters.
Und natürlich zum Spaß für alle möglichen Dinge ![]()