....ganz bestimmt! ![]()
![]()
![]()
![]()
![]()
![]()
Beiträge von Andy
-
-
Nice!
[autoit]
Fehlt nur noch ein Timer/Schlangenlänge/Punktezähler perwinsettitle()
[/autoit]und ein Netzwerk-Mehrspielermodus auf einem großen Spielfeld und es ist perfekt

-
Zitat von progandy
Naja, da kann man ja die Bildschirmtastatur verwenden
kaum versucht man, die Botkiddies erfolgreich davon zu überzeugen dass es nicht geht, kommt wieder so ein crack daher und verpetzt die versteckten Features
Naja, wenigstens hast du nicht das Tastaturkürzel verraten, daran scheitern dann wieder 98,7%
-
Zitat
Denn wer es wirklich nötig hätte, könnte aus dem bestehenden es leicht umschreiben.
Die die es nötig haben, sind (wie auch unser ehenmaliger Verteidigungsminister) C&P-Künstler, die genau wie dieser eben NICHT "leicht umschreiben" können^^.
Wzbw...BTT: Bugreports und weitere Ideen sind natürlich gerne gesehen^^
-
Hi,
wenn du dein Array am Anfang des Scriptes mit einer unbekannten Anzahl von Werten füllen möchtest, würde ich den umgekehrten Weg gehen.
Das Array überdimensionieren (z.B. 200000), dann in einer Schleife mit z.B. 87600 Werten füllen, und dann EINMAL ein Redim machen. Das ist wesentlich schneller, als 87600 mal zu ReDim-en. -
Hi,
ggf bringt dich eine Ähnlichkeitssuche weiter. Bei Strings bietet sich die Levenshtein-Distanz an, um möglichst ähnliche Strings zu finden.
Hier im Forum wirst du sicher fündig, Bernd hat imho eine dll dazu geschrieben.
Schau mal hier [ offen ] Strings vergleichen und hier [ gelöst ] Strings vergleichen -
Gezoomt wird mit dem Mausrad im Clientfenster, dabei wird um die Position des Mauscursers herum zentriert!
Linke und rechte Mausklicks werden aus dem Clientfenster an den Server weitergereicht.Auch wenn schon einige gefragt haben, NEIN, eine Tastaturübertragung egal in welche Richtung wird NICHT implementiert. Wer Interesse und reichlich Kleingeld hat, kann diese bei mir anfragen. Ich behalte mir wie üblich vor, Angebote in welcher Höhe auch immer, abzulehnen.
-
ja, Sourcecode steht in der *.EXE
-
Zitat von Jautois
Mein Skript leitet nun Funktionen ab:
sehr schön!
Solltest du nur die Funktionswerte der n-ten Ableitung bei komplexeren Funktionen suchen, bieten sich auch numerische Verfahren an! Weiter so!
-
Hi Jautois,
so ganz ist mir ehrlich gesagt noch nicht klar, wo du im Endeffekt hin willst.
Soll das ganze eine Art "Formelparser" werden, der ggf fehlende Klammern usw. bemängelt, oder möchtest du einfach nur einen Gleichungslöser?
Gleichungslöser billig:Spoiler anzeigen
[autoit]#include <String.au3>
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit]
$formel_org = InputBox("Funktion y=f(x)", "Bitte die Funktion und die Variable eingeben, z.b f(4)=x^3-2x+4", "f(4)=x^2-3x+5")
Until Not @error$a = StringSplit($formel_org, "=", 3) ;splitten vor und hinter =-Zeichen
[/autoit] [autoit][/autoit] [autoit]
$x = _StringBetween($a[0], "(", ")") ;variable (argument) steht in der klammer$formel = StringReplace(StringStripWS($a[1], 8), "x", "*x") ;ggf *-Zeichen einsetzen vor das x
[/autoit] [autoit][/autoit] [autoit]
$formel = StringReplace($formel, "**", "*") ;ggf doppelte *-Zeichen löschen
If StringLeft($formel, 1) = "*" Then $formel = StringTrimLeft($formel, 1);ggf führendes *-Zeichen löschen$formel = StringReplace($formel, "x", $x[0]) ;x durch variable ersetzen
[/autoit] [autoit][/autoit] [autoit]$ergebnis = Execute($formel) ;ausrechnen....
[/autoit]
If @error Then $ergebnis = "nicht feststellbar!" ;....oder auch nicht
MsgBox(0, "Ergebnis: ", $formel_org & @CRLF & $a[0] & "=" & $ergebnis);ergebnis ausgeben -
Glücklichen Herzwunsch und alles Gute!
Mach weiter so und gib uns immer wieder Scripte zum Staunen und Neidischsein^^
-
@ hellboy, was meinst du mit "Storage"?
500 Gig, 5 Terabyte? Völlig egal, da HFS eine Art "Virtuelles Dateisystem" inkl Ordnern einrichtet und darüber auf die Hardware zugreift. Mit jedenfalls reicht es völlig, andererseits habe ich auf allen Rechnern Opera laufen, der hat einen eigenen Webserver (im Browser integriert), incl. sehr simplem Dateiaustausch. Möglichkeiten gibts viele, aber wie schon gesagt, um ein paar Dateien auszutauschen würde ich mir kein NAS oder einen Server in Hardware aufsetzen.
Welchen Server willst du denn als Privatmann auch nur zu 1% auslasten, wenn du nicht permanent Filesharing betreibst oder sonstwie tonnenweise illegalen Krempel aus dem Netz lädst? -
Hi, ich habe supersimpel HFS im Einsatz, ein "Eine-Datei"-Webserver (tatsächlich nur ein Standalone-EXE-File)
Für Datenaustausch völlig ausreichend und dank Webinterface von jedem Rechner aus anzusprechen, auf dem ein Browser läuft, incl Handys usw.Und ehrlich gesagt würde ich mir nicht die Mühe machen, für ein bissl Vorlagen auszutauschen ein NAS oder einen "echten" Server (in Hardware) aufzusetzen. Eine VM tuts da sicher genausogut, >=4GIG an Speicher vorrausgesetzt, da gibts Linux-Server-Systeme fix und fertig vorkonfiguriert als Image...
-
*Leiche ausgrab*
Hi, hab mal gewühlt und eins meiner Chaos-Scripte gefunden, Jauitois fragte gerade in der SB danach....
Nur, um das Lösungs-Prinzip zu verdeutlichen!
Die Messageboxen innerhalb der Funktionen sind auskommentiert, schaltet die jeweils 2-3 Zeilen ein, um zu sehen, wie der Algorithmus funktioniert.Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <GUIConstantsEx.au3>
;Travelling Salesman Problem TSP$anzahl = 80
[/autoit] [autoit][/autoit] [autoit]
Dim $a[$anzahl] ;anzahl knoten
Global $x[$anzahl] ;x-koordinate knoten
Global $y[$anzahl] ;y-koordinate knoten
Global $abstand[$anzahl][$anzahl] ;abstand Punkt_x zu Punkt_y
Global $Ameisenmatrix[$anzahl][$anzahl]
Global $ameisenbackup[$anzahl][$anzahl]
Dim $kuerzester[$anzahl] ;kürzeste strecke zwischen Punkt_x und allen anderen Punkten
Dim $nachfolger[$anzahl] ;nächster punkt, der mit dem geringsten Weg zu erreichen ist
Dim $nachfolgerbackup[$anzahl] ; -1 an alle punkte
Dim $nachfolgerminimum[$anzahl] ; bisher kleinste strecke
;dim $nachfolger_mini[$anzahl]
;Global $l ;länge der gesamten strecke$max_x_gui = 500
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$max_y_gui = 500
$new = 0 ;wenn 1, dann neue koordinaten, wenn 0, dann koordinaten aus datei
$minimum = 2.3e22$hgui = GUICreate("TSP", $max_x_gui + 20, $max_y_gui + 20, 1, 1)
[/autoit] [autoit][/autoit] [autoit]
GUISetState(); Zeichnet eine Linie
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui)
$hPen = _GDIPlus_PenCreate()
$hPen2 = _GDIPlus_PenCreate(0xFFFF0000) ;rot
$hPen3 = _GDIPlus_PenCreate(0xFF0000FF) ;blau
If $new Then
FileDelete("TSP.dat") ;datei enthält die koordinaten
;koordinaten
For $i = 0 To $anzahl - 1
$x[$i] = Random(1, $max_x_gui, 1)
$y[$i] = Random(1, $max_y_gui, 1)
;_GDIPlus_GraphicsDrawEllipse($hGraphic, $x[$i],$y[$i],5,5, $hPen)
_GDIPlus_GraphicsDrawString($hGraphic, $i, $x[$i], $y[$i])
FileWriteLine("TSP.dat", $x[$i] & "," & $y[$i] & @CRLF) ;koordinaten in datei schreiben
Next
Else ;koordinaten aus datei lesen
For $i = 0 To $anzahl - 1
$line = StringSplit(FileReadLine("TSP.dat", $i + 1), ",", 3)
$x[$i] = $line[0]
$y[$i] = $line[1]
;_GDIPlus_GraphicsDrawEllipse($hGraphic, $x[$i],$y[$i],5,5, $hPen)
_GDIPlus_GraphicsDrawString($hGraphic, $i, $x[$i], $y[$i])
NextEndIf
[/autoit] [autoit][/autoit] [autoit];alle abstände punkt zu punkt festlegen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $p1 = 0 To $anzahl - 1
;$nachfolger[$p1]=$p1+1
For $p2 = 0 To $anzahl - 1
If $p2 = $p1 Then ContinueLoop
$dx = $x[$p1] - $x[$p2] ;s=punkt z=nächster punkt
$dy = $y[$p1] - $y[$p2]
;_GDIPlus_GraphicsDrawLine ($hGraphic,$x[$s],$y[$s] , $x[$z],$y[$z], $hPen)
$abstand[$p1][$p2] = Int(Sqrt(($dx * $dx) + ($dy * $dy)))
Next
Next
;$nachfolger[$anzahl-1]=0
;_arraydisplay($nachfolger)For $i = 0 To $anzahl - 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$nachfolgerbackup[$i] = -1 ;füllen, damit beim nachfolger prüfen die 0 nicht standard ist
Next
$step = 1
;If $anzahl>100 then $step=3
;If $anzahl>1000 then $step=5;verfahren Nearest-Neighbour-Heuristik
[/autoit] [autoit][/autoit] [autoit]
For $e = 5 To $anzahl - 1 Step $step ;jeden punkt einmal als startpunkt wählen
; inkuerzestepunkteinbauen($e)
randomneighbour($e)
nearestneighbour($e)
_GDIPlus_GraphicsClear($hGraphic, 0xFFFFFFFF)
$lang = laenge()
;msgbox(0,$lang,0)
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $l = ' & $l & @crlf & '>Error code: ' & @error & @crlf) ;### Debug ConsoleIf $new = 1 And $e = 0 And $anzahl < 10 Then
[/autoit] [autoit][/autoit] [autoit]
$combi = _ArrayPermute($nachfolger, ",")
_ArrayDisplay($combi)
$pp = 2.3e12
For $i = 1 To $combi[0]
$q = laenge_perm($combi[$i])
If $q < $pp Then
ConsoleWrite($combi[$i] & " " & $q & @CRLF)
$pp = $q ;kürzestes merken
$k = $i ;combi merken
EndIf
NextMsgBox(0, $pp, "minimum brute = " & $combi[$k])
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndIf$lang = tauschen($lang)
[/autoit] [autoit][/autoit] [autoit]$lang1 = $lang
[/autoit] [autoit][/autoit] [autoit]
;msgbox(0,"kantentauschen los",$lang)
While 1 ;so lange kanten tauschen und punkte einbauen, bis kürzeste strecke erreicht ist
$lang = kantentauschen($lang)
If $lang < $lang1 Then
$lang1 = $lang
WinSetTitle($hgui, "", "TSP L=" & $lang & " e=" & $e & " mini=" & $minimum)
; msgbox(0,"kürzere gefunden",$lang1)
Else
$lang = naherpunktinkanteeinbauen($lang)
If $lang < $lang1 Then
$lang1 = $lang
Else
ExitLoop
EndIf
EndIf
WEnd
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $l = ' & $lang &" "&$e&" altes mini= "&$minimum&" "&$ltest& @crlf & '>Error code: ' & @error & @crlf) ;### Debug ConsoleIf $lang < $minimum Then
[/autoit] [autoit][/autoit] [autoit]
$minimum = $lang
laenge()
MsgBox(0, "neues minimum", $minimum, 1)
Eintragenmatrix(1 / $lang / $lang) ;trägt jede Kante in eine von/nach-Matrix ein
$nachfolgerminimum = $nachfolger
Else
Eintragenmatrix(1 / $lang / $lang) ;trägt jede Kante in eine von/nach-Matrix ein
EndIf
;MsgBox(0, $l, "kürzeste Strecke gefunden!")
Next
MsgBox(0, $minimum, "kürzeste Strecke gefunden!")
_ArrayDisplay($Ameisenmatrix)
$ameisenbackup = $Ameisenmatrix
;kürzester ameisenweg
$lamg1 = 2.2e22
;For $start = 0 To $anzahl - 1
;For $i = 0 To $anzahl - 1For $v = 0 To $anzahl - 1
[/autoit] [autoit][/autoit] [autoit]
$maximum = 0
For $n = 0 To $anzahl - 1
If $n = $v Then ContinueLoop
$kante = $Ameisenmatrix[$v][$n]
If $kante > $maximum Then
$maximum = $kante
$v_max = $v
$n_max = $n
;$nachfolger[$v] = $n
;For $t = 0 To $anzahl - 1
;$Ameisenmatrix[$v][$n] = 0 ;spalte löschen
;Next
;
;$Ameisenmatrix[$n][$v]=0
EndIf
Next
Next
$nachfolger[$v_max] = $n_max
$Ameisenmatrix[$v_max][$n_max] = 0
;Next$lang = laenge()
[/autoit] [autoit][/autoit] [autoit]
; _ArrayDisplay($nachfolger)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $lang = ' & $lang & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
If $lang < $lang1 Then
;MsgBox(0, $lang, "Ameisenweg kürzeste Strecke gefunden! bei startpunkt " & $i)
$lang1 = $langEndIf
[/autoit] [autoit][/autoit] [autoit]
$Ameisenmatrix = $ameisenbackup
;NextMsgBox(0, $lang, "Ameisenweg kürzeste Strecke gefunden! bei startpunkt " & $i)
[/autoit] [autoit][/autoit] [autoit]
$nachfolger = $nachfolgerminimum
laenge();_ArrayDisplay($Ameisenmatrix)
[/autoit] [autoit][/autoit] [autoit]Func tauschen($lang)
[/autoit] [autoit][/autoit] [autoit]
Local $p, $v, $w
DoFor $zz = 0 To 1 ;sicherheitsrunden
[/autoit] [autoit][/autoit] [autoit]
; ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $zz = ' & $zz & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$i = 0
$flag = 0
For $z = 0 To $anzahl - 1
$i = $nachfolger[$i]
$p = $i
$v = $nachfolger[$p]
$w = $nachfolger[$v]
$k = $nachfolger[$w]
$u = $nachfolger[$k]
$t = tauschen2($p, $v, $w, $k, $lang) ;2 punkte tauschen und schauen, ob die strecke kürzer wirdIf $t < $lang Then ;wenn die länge nach dem tauschen kleiner ist, dann
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsDrawLine($hGraphic, $x[$p], $y[$p], $x[$v], $y[$v], $hPen3)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$v], $y[$v], $x[$w], $y[$w], $hPen3)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$w], $y[$w], $x[$k], $y[$k], $hPen3)_GDIPlus_GraphicsDrawLine($hGraphic, $x[$p], $y[$p], $x[$w], $y[$w], $hPen2)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$v] + 1, $y[$v] + 1, $x[$w] + 1, $y[$w] + 1, $hPen2)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$v], $y[$v], $x[$k], $y[$k], $hPen2)
;~ MsgBox(0, "tauschen2", $p & " " & $w & " " & $v & " " & $k & " mit L= "&$t&@crlf& _
;~ "ist kleiner als " & @crlf& _
;~ $p & " " & $v & " " & $w & " " & $k & " mit L= "&$lang,1)
_GDIPlus_GraphicsClear($hGraphic, 0xFFFFFFFF)
;$ltest=laenge()
$lang = $t
$flag = 1
EndIf
$p = $i
$v = $nachfolger[$p]
$w = $nachfolger[$v]
$k = $nachfolger[$w]
$u = $nachfolger[$k]$t = tauschen3links($p, $v, $w, $k, $u, $lang) ;3 punkte tauschen und schauen, ob die strecke kürzer wird
[/autoit] [autoit][/autoit] [autoit]
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $t = ' & $t & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
If $t < $lang Then ;wenn die länge nach dem tauschen kleiner ist, dann
;vorher
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$p], $y[$p], $x[$v], $y[$v], $hPen3)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$v], $y[$v], $x[$w], $y[$w], $hPen3)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$w], $y[$w], $x[$k], $y[$k], $hPen3)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$k], $y[$k], $x[$u], $y[$u], $hPen3)
;nachher_GDIPlus_GraphicsDrawLine($hGraphic, $x[$p], $y[$p], $x[$w], $y[$w], $hPen2)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$w] + 1, $y[$w] + 1, $x[$k] + 1, $y[$k] + 1, $hPen2)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$k], $y[$k], $x[$v], $y[$v], $hPen2)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$v], $y[$v], $x[$u], $y[$u], $hPen2)
;~ MsgBox(0, "tauschen2links", $p & " " & $w & " " & $k & " " & $v & " " & $u &" mit L= "&$t&@crlf& _
;~ "ist kleiner als " & @crlf& _
;~ $p & " " & $v & " " & $w & " " & $k & " " & $u &" mit L= "&$lang,1 )
_GDIPlus_GraphicsClear($hGraphic, 0xFFFFFFFF)
;$ltest=laenge()$lang = $t
[/autoit] [autoit][/autoit] [autoit]
$flag = 1
EndIf
$p = $i
$v = $nachfolger[$p]
$w = $nachfolger[$v]
$k = $nachfolger[$w]
$u = $nachfolger[$k]
$t = tauschen3rechts($p, $v, $w, $k, $u, $lang) ;3 punkte tauschen und schauen, ob die strecke kürzer wird
If $t < $lang Then ;wenn die länge nach dem tauschen kleiner ist, dann
;vorher
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$p], $y[$p], $x[$v], $y[$v], $hPen3)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$v], $y[$v], $x[$w], $y[$w], $hPen3)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$w], $y[$w], $x[$k], $y[$k], $hPen3)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$k], $y[$k], $x[$u], $y[$u], $hPen3)
;nachher_GDIPlus_GraphicsDrawLine($hGraphic, $x[$p], $y[$p], $x[$k], $y[$k], $hPen2)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$k], $y[$k], $x[$v], $y[$v], $hPen2)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$v] + 1, $y[$v] + 1, $x[$w] + 1, $y[$w] + 1, $hPen2)
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$w], $y[$w], $x[$u], $y[$u], $hPen2)
;~ MsgBox(0, "tauschen3rechts", $p & " " & $k & " " & $v & " " & $w & " " & $u &" mit L= "&$t&@crlf& _
;~ "ist kleiner als " & @crlf& _
;~ $p & " " & $v & " " & $w & " " & $k &" " & $u &" mit L= "&$lang,1)
_GDIPlus_GraphicsClear($hGraphic, 0xFFFFFFFF)
;$ltest=laenge()
$lang = $t
$flag = 1
EndIf
Next
Next
Until $flag = 0
Return $lang
EndFunc ;==>tauschen;erste Methode
[/autoit] [autoit][/autoit] [autoit]
;vom ersten Punkt an den jeweils nächsten Punkt mit dem kleinsten Abstand anfahren
Func laenge()
Local $l = 0
_GDIPlus_GraphicsClear($hGraphic, 0xFFFFFFFF)
For $s = 0 To $anzahl - 1
Local $p = $abstand[$s][$nachfolger[$s]]
$l += $p
_GDIPlus_GraphicsDrawString($hGraphic, $s, $x[$s], $y[$s])
_GDIPlus_GraphicsDrawLine($hGraphic, $x[$s], $y[$s], $x[$nachfolger[$s]], $y[$nachfolger[$s]], $hPen)
Next
WinSetTitle($hgui, "", "TSP L=" & $l & " e=" & $e & " mini=" & $minimum)
Return $l
EndFunc ;==>laengeFunc laenge_perm($array) ;länge aller permutationen
[/autoit] [autoit][/autoit] [autoit]
Local $l = 0
$liste = StringSplit($array, ",", 3)
ReDim $liste[$anzahl + 1]
$liste[$anzahl] = $liste[0]
For $s = 0 To $anzahl - 1
Local $p = $abstand[$liste[$s]][$liste[$s + 1]]
$l += $p
Next
Return $l
EndFunc ;==>laenge_permFunc tauschen2($p, $v, $w, $k, $h) ;vertauscht die beiden nachfolger und berechnet die neue länge
[/autoit] [autoit][/autoit] [autoit]
;p = punktnr v=nachfolger von p w=nachfolger von v
$l1 = $abstand[$p][$v]
$l3 = $abstand[$w][$k]
$l_vorher = $l1 + $l3
$ln1 = $abstand[$p][$w]
$ln3 = $abstand[$v][$k]
$l_nachher = $ln1 + $ln3
If $l_nachher < $l_vorher Then ;wenn getauschte länge kleiner, dann tauschen
$nachfolger[$v] = $k
$nachfolger[$w] = $v
$nachfolger[$p] = $w
$h = $h - $l_vorher + $l_nachher
EndIfReturn $h
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>tauschen2Func tauschen3links($p, $v, $w, $k, $u, $h) ;vertauscht die beiden nachfolger und berechnet die neue länge
[/autoit] [autoit][/autoit] [autoit];p = punktnr v=nachfolger von p w=nachfolger von v
[/autoit] [autoit][/autoit] [autoit]
$l1 = $abstand[$p][$v]
$l2 = $abstand[$v][$w]
$l3 = $abstand[$w][$k]
$l4 = $abstand[$k][$u]
$l_vorher = $l1 + $l2 + $l3 + $l4
$ln1 = $abstand[$p][$w]
$ln2 = $abstand[$w][$k]
$ln3 = $abstand[$k][$v]
$ln4 = $abstand[$v][$u]
$l_nachher = $ln1 + $ln2 + $ln3 + $ln4
If $l_nachher < $l_vorher Then ;wenn getauschte länge kleiner, dann tauschen
$nachfolger[$v] = $u
$nachfolger[$k] = $v
$nachfolger[$w] = $k
$nachfolger[$p] = $w
$h = $h - $l_vorher + $l_nachher
EndIfReturn $h
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>tauschen3linksFunc tauschen3rechts($p, $v, $w, $k, $u, $h) ;vertauscht die beiden nachfolger und berechnet die neue länge
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$l1 = $abstand[$p][$v]
$l2 = $abstand[$v][$w]
$l3 = $abstand[$w][$k]
$l4 = $abstand[$k][$u]
$l_vorher = $l1 + $l2 + $l3 + $l4
$ln1 = $abstand[$p][$k]
$ln2 = $abstand[$k][$v]
$ln3 = $abstand[$v][$w]
$ln4 = $abstand[$w][$u]
$l_nachher = $ln1 + $ln2 + $ln3 + $ln4
If $l_nachher < $l_vorher Then ;wenn getauschte länge kleiner, dann tauschen
$nachfolger[$w] = $u
$nachfolger[$v] = $w
$nachfolger[$k] = $v
$nachfolger[$p] = $k
$h = $h - ($l_vorher - $l_nachher)
EndIf
Return $h
EndFunc ;==>tauschen3rechts; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
[/autoit] [autoit][/autoit] [autoit]
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE; Ressourcen freigeben
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_PenDispose($hPen)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()Func schnittpunkt($p1, $p2, $p3, $p4) ;schneiden sich die strecken, wird 1 zurückgegeben
[/autoit] [autoit][/autoit] [autoit]
; if $m1=$m2 then return 0 ;parallelEndFunc ;==>schnittpunkt
[/autoit] [autoit][/autoit] [autoit]Func kantentauschen($h) ;vertauscht die start- und endpunkte zweier kanten und berechnet die neue länge
[/autoit] [autoit][/autoit] [autoit]
Local $aswap[$anzahl] ;hilfsarray zum tauschen der reihenfolge
; _arraydisplay($nachfolger)
$v = 0For $kante1 = 0 To $anzahl - 3
[/autoit] [autoit][/autoit] [autoit]
; ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $kante1 = ' & $kante1 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$p = $v
$v = $nachfolger[$p]
$w = $v
;msgbox(0,"aussenschleife",$p&" "&$v)
For $kante2 = $kante1 + 2 To $anzahl - 1
$w = $nachfolger[$w]
$k = $nachfolger[$w]$l_nachher = $abstand[$v][$k] + $abstand[$p][$w]
[/autoit] [autoit][/autoit] [autoit]
$l_vorher = $abstand[$p][$v] + $abstand[$w][$k];if $p=9 and $v=14 Then msgbox(0,$w&" "&$k,$l_vorher&" "&$l_nachher)
[/autoit] [autoit][/autoit] [autoit]
If $l_nachher < $l_vorher Then ;wenn getauschte länge kleiner, dann tauschen
$aswap[0] = $v
For $i = 1 To $anzahl ;alle nachfolger speichern in array von v bis w
$aswap[$i] = $nachfolger[$aswap[$i - 1]]
If $aswap[$i] = $w Then ExitLoop
Next
$nachfolger[$v] = $k
For $m = $i To 1 Step -1
$nachfolger[$aswap[$m]] = $aswap[$m - 1]
Next
$nachfolger[$p] = $w
; _arraydisplay($nachfolger)
$v1 = $v ;v und w umbenennen
$v = $w
$w = $v1
;laenge()
$h = $h - ($l_vorher - $l_nachher)
EndIfNext
[/autoit] [autoit][/autoit] [autoit]
NextReturn $h ;neue länge zurückgeben
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>kantentauschenFunc naherpunktinkanteeinbauen($h)
[/autoit] [autoit][/autoit] [autoit]
;return $h
$v = 0For $kante1 = 0 To $anzahl - 3
[/autoit] [autoit][/autoit] [autoit]
; ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $kante1 = ' & $kante1 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$p = $v
$v = $nachfolger[$p]
$w = $v
;msgbox(0,"aussenschleife",$p&" "&$v)
For $kante2 = $kante1 + 2 To $anzahl - 2
$w = $nachfolger[$w]
$k = $nachfolger[$w]
$u = $nachfolger[$k] ;wenn ein punkt näher an der kante liegt, dann diesen punkt in die kante einbauen
If $abstand[$p][$k] + $abstand[$k][$v] + $abstand[$w][$u] < $abstand[$p][$v] + $abstand[$w][$k] + $abstand[$k][$u] Then
laenge()
_GDIPlus_GraphicsDrawEllipse($hGraphic, $x[$k], $y[$k], 20, 20, $hPen2);msgbox(0,"naher punkt= "&$k,$p&"--->"&$v)
[/autoit] [autoit][/autoit] [autoit]
$nachfolger[$p] = $k
$nachfolger[$k] = $v
$nachfolger[$w] = $u
$p = $k
$h = laenge()
;msgbox(0,"punkt eingebaut","nf von "&$k&" = "&$nachfolger[$k])
EndIfNext
[/autoit] [autoit][/autoit] [autoit]
NextReturn $h
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>naherpunktinkanteeinbauenFunc eintragenmatrix($o)
[/autoit] [autoit][/autoit] [autoit]
$von = 0
For $i = 0 To $anzahl - 1
$nach = $nachfolger[$von]
;if $von<$nach then
$Ameisenmatrix[$von][$nach] += $o
;Else
;$Ameisenmatrix[$nach][$von] += $o
;endif
;$Ameisenmatrix[$nach][$von] += 1
;msgbox(0,"von "&$von,"nach "&$nach)
;_arraydisplay($Ameisenmatrix)
$von = $nachfolger[$von]
;$Ameisenmatrix[$nach][$]+=1 ;ggf weglassen
Next
; _ArrayDisplay($Ameisenmatrix)
EndFunc ;==>eintragenmatrixFunc nearestneighbour($e)
[/autoit] [autoit][/autoit] [autoit]
Dim $kuerzester[$anzahl] ;kürzeste strecke zwischen Punkt_x und allen anderen Punkten
Dim $nachfolger[$anzahl] ;nächster punkt, der mit dem geringsten Weg zu erreichen ist
$nachfolger = $nachfolgerbackup
;Global $l ;länge der gesamten strecke
$nachfolger[$e] = $e
$s = $e;Array auffüllen und mit der "gierigen" Methode (der näheste mögliche punkt) das nachfolger-array aufbauen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $t = 0 To $anzahl - 1 ;punkte nacheinander abarbeiten
$s = $nachfolger[$s]
;MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$s' & @lf & @lf & 'Return:' & @lf & $s) ;### Debug MSGBOX
$nachfolger[$s] = $e ;erster punkt= letzter punkt
; _arraydisplay($nachfolger)
$kuerzester[$s] = Int(Sqrt($max_x_gui ^ 2 + $max_y_gui ^ 2)) ;maximal mögliche Strecke = diagonale der gui
For $z = 0 To $anzahl - 1 ;abstände vom punkt zu allen möglichen anderen punkten bestimmen
If $z = $e Then ContinueLoop ;punkt kann nicht den abstand zu sich selbst bestimmen
If $abstand[$s][$z] <= $kuerzester[$s] Then ;falls es einen kleineren abstand zw 2 punkten gibt, dann
For $r = 0 To $anzahl - 1 ;alle bisherigen nachfolger prüfen
If $nachfolger[$r] = $z Then ContinueLoop 2
Next
$kuerzester[$s] = $abstand[$s][$z] ;diesen abstand merken
$nachfolger[$s] = $z ;punkt, welcher am nächsten zum untersuchten punkt liegt
EndIf
Next
Next
EndFunc ;==>nearestneighbourFunc randomneighbour($e) ;mit einem punkt starten, zufällig den nächsten bestimmen, die kürzeste strecke bestimmen, den nächsten zufälligen punkt einbauen usw
[/autoit] [autoit][/autoit] [autoit]
$restanzahl = $anzahl
Dim $rest[$anzahl] ;array für die punkte, die noch nicht abgearbeitet sind
For $i = 0 To $anzahl - 1 ;restarray füllen mit allen punkten
$rest[$i] = $i
Next
_ArrayDelete($rest, $e) ;$e aus dem array löschen
;_ArrayDisplay($rest)
$t = $e
While 1 ;solange, bis keine zahl übrig bleibt
$restanzahl = UBound($rest) - 1 ;restliche anzahl
If $restanzahl = 0 Then ExitLoop ;keine zahl mehr übrig
$naechster = Random(0, $restanzahl, 1) ;nächste zahl
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $naechster = ' & $naechster & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$nachfolger[$t] = $rest[$naechster] ;aus dem restarray herausholen
$t = $rest[$naechster]
; _arraydisplay($nachfolger)
For $i = 0 To $restanzahl
If $rest[$i] = $t Then
_ArrayDelete($rest, $i)
ExitLoop
EndIf
Next
;_arraydisplay($rest)WEnd
[/autoit] [autoit][/autoit] [autoit]
$nachfolger[$t] = $rest[0]
$nachfolger[$rest[0]] = $e
;msgbox(0,0,0)
;_arraydisplay($nachfolger)
EndFunc ;==>randomneighbourFunc inkuerzestepunkteinbauen($e)
[/autoit] [autoit][/autoit] [autoit]
;while 1 ;so lange, bis alle punkte verbaut sind
If $e < 6 Then ;5 punkte ermitteln und verbinden
;$restanzahl=$e
Dim $rest[$anzahl] ;array für die punkte, die noch nicht abgearbeitet sind
For $i = 0 To $anzahl - 1 ;restarray füllen mit allen punkten
$rest[$i] = $i
Next
_ArrayDelete($rest, $e) ;$e aus dem array löschen
;_ArrayDisplay($rest)
$t = $e
While 1 ;solange, bis keine zahl übrig bleibt
$restanzahl = UBound($rest) - 1 ;restliche anzahl
If $restanzahl = 0 Then ExitLoop ;keine zahl mehr übrig
$naechster = Random(0, $restanzahl, 1) ;nächste zahl
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $naechster = ' & $naechster & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$nachfolger[$t] = $rest[$naechster] ;aus dem restarray herausholen
$t = $rest[$naechster]
; _arraydisplay($nachfolger)
For $i = 0 To $restanzahl
If $rest[$i] = $t Then
_ArrayDelete($rest, $i)
ExitLoop
EndIf
Next
;_arraydisplay($rest)WEnd
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$nachfolger[$t] = $rest[0]
$nachfolger[$rest[0]] = $e
EndIf
$lang1 = laenge()
$lang = tauschen($lang1)MsgBox(0, 0, 0)
[/autoit]
;_arraydisplay($nachfolger)
EndFunc ;==>inkuerzestepunkteinbauen
Habe noch einige mehr Optimierungsfunktionen (die letzte Version hat >50kB) , aber ggf gibts ja doch noch nen µ-It^^Übrigens habe ich mit diesem Script einige der Karten von HIER durchlaufen lassen....
Wer übrigens etwas seltsam guckt, weil er nicht versteht, was das mit "Ameisen" zu tun hat....GidF.de
-
Zitat
/edit: mann bin ich dumm VPN braucht auch offene ports -.-
Ich glaube nicht, dass du "dumm" bist, nur weil du einige Sachen nicht weisst....Dumm ist einer, der davon weiss und es trotzdem nicht anwendet:D
Zitatwas macht dann eigentlich die named pipe funktion die oben genannt wurde ?
schau mal, was
[autoit]_NamedPipes_ConnectNamedPipe()
[/autoit]macht....
Alles derselbe Schmodder! Irgendwo sitzt ein Anbieter und bietet Dienste an, und diese Dienste müssen (in diesem Fall dem Router) mitgeteilt, d.h. freigegeben werden! -
Schau mal, was
[autoit]FileRead()
[/autoit]macht...
-
Zitat
2 Sekunden Video aufnehmen (in einen Buffer) versenden.
geht nur dann, wenn du reichlich Bandbreite zur Verfügung hast, um auch mal lost frames (wären dann 2 Sekunden^^) aufzufangen bzw auszugleichen.
Wenn man vom einfachsten Videostream ~ 3 MBit mit MPEG2 ausgeht, wird es auf einer 10MBit-Leitung schon eng. Datenmüll empfangen, Paket nochmal anfordern und nochmal gesendet bekommen frisst bei nur einem einzigen Fehler sofort den gesamten Puffer von 2 Sekunden auf!
Video-Streamen würde ich daher mit einem dafür ausgelegten Programm, den Datenstrom in kleine Bröckchen zu packen und "zu Fuss" per AutoIt zu verschicken halte ich für suboptimal.Im DeskStream haben Sprenger120 und ich uns am streamen eines Desktops versucht, für "normale" Fensteranwendungen gibts da keinerlei Probleme mit der Geschwindigkeit im Fullscreen, aber bei Video (große aufeinanderfolgende, stark unterschiedliche Bilddaten) wirds kritisch. Und zwar haben wir dort nur die Differenzen zum vorhergehenden Frame gepackt, komprimiert und versendet. Frame für Frame....
Im 100MBit-internen Netz werden auch Videos bei erträglichen Frameraten mit Grössen von 500x400 Pixel übertragen, ohne Ton natürlich.
Im 10MBit-Netz (etwa Internetgeschwindigkeit) sind bei Videogrössen ab 300x200 Pixeln noch 25FPS machbar, bei doppelt so grossen Videos sinkt entsprechend die Framerate
Aber das halte ich für die Gegebenheiten, 350 Zeilen Code für Client und Server, schon völlig in Ordnung! Aber kein Vergleich zu einer professionellen Videostreaming-Software, welche natürlich auch mit völlig anderm Hintergrund arbeitet. Stream <> Stream^^ -
Zitat
Im Prinzip würde ich das viel lieber nur mit GDI-Funcs bauen.
So scheiden sich die Geister^^, ich würde viel lieber den Hintern hochbekommen und fit für den OpenGL-Kram werden...
Dann ist es niucht mehr weit zu OpenCl, da sehe ich echtes Potenzial. Die Grafikkarten heutzutage sind derart brutal schnell durch massives Parallelisieren (wenn es der Algorithmus her gibt), da gewinnt ein Desktop-Prozessor nicht mal nen Blumenpott....ZitatIch wollte das so aufbauen: *snip*
Im Endeffekt braucht man die Kacheln nicht, in der kleinsten Version ist eine Kachel = ein Pixel! Wenn es ganz hart wird, ist jede Kachel 2x2 Pixel gross und man lässt anschliessend einen Filter drüberlaufen^^
Eigentlich hängt es "nur" an der Höhenkarte, ob eine mehr oder weniger realistische Landschaft erzeugt wird, den "Höhen" dann Farben zuzuordnen ist dann wieder eine andere Sache.
Die Beleuchtung bzw Schatten sind viel komplizierter, spätestens dann kommt man um einen Raytracer nicht mehr drumrum.
Der "wandert" dann Pixel für Pixel vom aktuellen Pixel aus in Richtung "Sonne" und schaut auf diesem Weg (Linie) nach, ob das Pixel auf der Linie "höher" ist als die aktuelle Höhe des Pixels auf der Linie (urghs^^, muss mal ne Zeichnung machen^^) -
zunächst OT
Zitat von OscarMan programmiert viel hardwarenäher und die Sprünge sind meist nicht sehr "weit".
Hehe, genau! Far Jumps und near Jumps, die übrigens heute noch ihre Berechtigung haben!
Zitat von peethebeeAn eine beliebige Stelle springen zu können, hat z.B. auch große Nachteile bei der automatischen Optimierung des Assembler-Codes, den ein Compiler erzeugt
Das ist eine der grossen Vorteile der Optimierungen "richtig" schneller Compiler, die erzeugen nämlich (abhängig von der Hardware) keine "direkten" Sprünge an eine Adresse, sondern springen z.B. XXX Bytes im Code zurück und "zwingen" so die branch-prediction-Unit im Prozessor, da (je nach Prozessor) der eine oder andere Fall als "wahrscheinlicher" angesehen und somit schneller ausgeführt wird. Aber dieser Code ist überhaupt nicht mehr nachzuvollziehen, wird daher noch gerne und oft von Virenprogrammierern verwendet, genau wie mittlerweile von sämtlichen Compilerherstellern verpönter selbstmodifizierender Code.
Übrigens fasse ichZitatAssembler-Code braucht deshalb für die meisten Programmierer noch mehr Kommentare (Andy macht sie glaube ich zeilenweise )
als Kompliment auf
, aber unter uns Klosterschwestern, ich spreche JEDEM Programmierer ab, nach Jahren seinen Code ohne Kommentare schneller verstehen zu können als mit Kommentaren, unabhängig von der Programmiersprache 
*whispermode ON* ....habe hier viele Kilobytes Assemblercode ohne einen einzigen Kommentar, aber der wird wohl nie "veröffentlicht"
...*whispermode OFF*
Wobei natürlich infolge fortschreitendem Alter und somit immer heftigeren Alzheimer-Anfällen die Kommentare die "Krücke" sind, welche auch beim körperlichen Verfall ab und zu hilfreich ist
Nun BTT

GOTO, ick liebe Dir!
Hach war das schön, da hat einer deinen Programmcode geklaut und du hast es gemerkt und musstest nur 1-2 GOTOS umbiegen, um den kompletten Code unbrauchbar zu machen
Zitat von OscarMan musste Zeilennummern anspringen. Wenn man nachträglich einen Befehl einfügte, musste man von Hand alle GOTOs entsprechend anpassen. Grausam!
Du NOOB!
Zeilennummern im ersten Programmierdurchgang in 10er Schritten, wenn dann was eingefügt werden musste hat man in die 5er Zeilennummern eingefügt, und ganz zum Schluss hat man dann die Einer-(Zeilennummern) ausgefüllt.
Und wenn dann immer noch einige Zeilen gefehlt haben, konnte man dank GOTO über den kompletten restlichen Code zweihundert Zeilen nach vorne springen und dort weitermachen
Jetzt ohne Witz, die ersten kommerziellen BASIC-Programme waren die, welche bestehende BASIC-Programme an 10er-Zeilennummern ausgerichtet hatten, und natürlich sämtliche GOTOs anpassten!
A propos Spaghetticode, für den braucht man kein GOTO, das schaff ich auch ohne
(und SEHR viele andere auch)....Zitat von progandyIch möchte wissen, wer so einen Schwachsinn erfunden hat.
Die Typen sitzen heute auf 60m langen Yachten in der Südsee und lassen sich den Wanst kraulen
Aber mal im Ernst, setz dich an einen 80x25 Zeichen Monochrom-Monitor, angeschlossen an einen 8-Bit-Rechner mit einer Handvoll Bytes Arbeitsspeicher. Die Programme werden auf Magnetbändern gespeichert und du verdienst als 08/15 Programmierer JEDEN TAG 1000€ Netto damit, Programme für eine Versicherung, Bank usw zu schreiben. Und du bist heilfroh, endlich mit einem GOTO zu Zeilennummern in deinem Programm zu springen, statt für Sprünge die Bytes der Opcodes zu zählen
-
Ich merk schon, hier geht was^^
Eine 3d-(Render)-Engine zu schreiben ist wahrscheinlich garnicht das grosse Problem, in einigen 4k-Demos wurde das in 200-300 Byte realisiert...Ich hatte einen einfachen Raytracer mal in AutoIt geschrieben, der war, ausser dass er sehr kompakt war, schnarchlangsam^^. Und die 3d-"Modelle" waren auch nicht von der Stange....In Assembler fehlt mir da zzt bissl der Antrieb und viel mehr noch der Background. Da haben es die OpenGL (und Konsorten)-Jungs und Mädels natürlich viel besser, Funktion aufrufen, fertig! Die eigentliche Arbeit macht dann die Grafikkarte.
ZitatIch arbeite lieber direkt in einer Bitmap, das hat sich als schneller herausgestellt.
hehe, so siehts aus, da hat man eine einfache Reihe hintereinanderliegender dwords und kann(muss) sich was einfallen lassen^^
Ich habe mein Landschaft-Script mal testweise dahingehend abgeändert, dass die "senkrechten Linien" nur noch aus den 3 "obersten" aufeinandergestapelten Pixeln bestehen, nicht mehr aus dem kompletten "Pfeiler".
[autoit]
Also einfach so_GDIPlus_GraphicsDrawLine($hGraphic, $iwidth + $w, 150 + $h / 4-$high+3, $iwidth + $w, 150 + $h / 4 - $high, $hPen)
[/autoit]
Das hat eigentlich einwandfrei funktioniert, allerdings natürlich nur, wenn keine "steilen" Übergänge entstehen.In asm sollte es kein Thema sein, aus der Perlin-Höhenkarte das komplette 3D-Bild in einigen Millisekunden zu erstellen. Die üblichen 3d-Funktionen wie bspw. rotieren, zoomen usw. wären dazu noch einigermassen billig, aber für Beleuchtung, Schatten, Nebel usw. wirds dann schon aufwendiger. Da haben dann die c++-er wesentlich bessere Karten, denn dafür gibts schon fix-und fertige Funktionen!