[GDI+] Asteroiden Generator

  • Moin,

    Im Prinzip wollte ich einen Thread im Hilfebereich aufmachen, da ich hier etwas Hilfe (oder eine "zündende" Idee) brauche, aber es gibt schon ein funktionierendes Skript, also sind wir im Skriptbereich.

    Das Tool soll folgendes tun: Einen Asteroiden (in 2D, GDI+) generieren.

    Anforderungen (ein Teil davon ist zum Teil erfüllt, das meiste aber nicht)
    - Der Asteroid soll möglichst nicht "schlecht" aussehen. (z.B. eine einfarbige Fläche wäre nicht sonderlich gut).
    - Die Laufzeit sollte unter 100ms betragen um einen Asteroiden zu generieren (da später mal eine ganze Menge gebraucht werden und niemand 5 Min Ladezeit haben will).
    - Der Asteroid braucht eine Art "Rohstoff" (in diesem Fall Grün, jede andere Farbe geht aber auch) der ohne Formveränderung des Asteroiden bei gleichem Seed Einstellbar sein sollte.
    - ggf eine Beleuchung mit 1-2 Lichtquellen. (Hier habe ich keine Idee, wie soetwas in annehmbarer Zeit via GDI+ machbar ist. Ich glaube aber, dass es hier mal eine kleine GDI+ Demonstration mit Leuchteffekten gab.)

    Natürlich könnte ich jetzt noch stundenlang weiterbasteln bis alles eingebaut ist was ich gerne hätte und anschließend herumoptimieren bis die Zeit (halbwegs) stimmt. Ich möchte aber ggf vorher ein paar Ideen von einigen GDI+ Leuten einholen :)
    Für alle anderen Gilt: Habt Spaß und generiert euch Asteroiden :P (Und falls ihr interessante Farbkombinationen findet könnt ihr sie gerne posten)


    PS: Ich weiß, dass das Skript sehr Spaghetticodeartig ist. Optimierungen sind erstmal nicht nötig, solange das Ergebnis noch nicht stimmt ;)

    lg
    Mars

  • Darüber habe ich auch schon nachgedacht... allerdings ist das ohne eine Dll oder ASM nicht zu bewerkstelligen. Ich wollte erstmal rein in AutoIt bleiben. (und dort sollte die Rechnung in unter 100ms fertig sein).

    Was ich vergessen habe zu erwähnen: Die normale Größe die benötigt wird liegt zwischen 12 und ca. 56 Pixeln. Deshalb ist es nicht soooo schlimm, dass die Asteroiden mit 100+ Pixeln etwas hässlich aussehen.

  • Doppelpostalarm, aber es gibt auch etwas neues :)

    Ich habe mir überlegt lieber auf 3D umzusteigen und später aus den Koordinaten von Punkten auf einer Kugel durch transformation die Asteroidenoberfläche zu bekommen. Nach sehr vielen Ansätzen wie man die Punkte mit bestmöglicher Verteilung platziert habe ich keine mathematische Lösung gefunden und bin auf das Vielkörperproblem umgestiehen, das man ja numerisch mit sehr viel Rechenzeit lösen kann.

    Genutzt wird also eine Einheitskugel mit einer gewissen Anzahl Punkte aus der Oberfläche. Diese stoßen sich gegenseitig ab, sodass sie nach einiger Zeit den größt möglichen Abstand zueinander haben. Die daraus entstehenden Koordinaten kann man für jede Anzahl Punkte abspeichern, sodass diese nur 1x berechnet werden müssen. (Später kann man die Koordinaten im eigentlichen Generator einfach laden und damit weiterarbeiten).

    Anbei ist das Skript welches (mit schöner 3D Animation) die einzelnen Punkte während des Rechenvorgangs anzeigt. (Ein Dank geht hier an die wunderbare 3D GDI+ UDF von Starg aus dem englischen Forum: [Klick mich])

    lg
    M

  • Vielleicht kannst du ja das brauchen.
    Dieses Script erstellt eine Kugel mit einer zufälligen Gleichverteilung:

    Hier noch die "Matrix.au3"


    Da du ja nur die Vorderseite benötigst, reicht es, wenn du "$fTheta = Random(0, $cPI)" schreibst.


    LgE

  • Die Zufallsverteilung bei meinem Skript ist nicht sehr gut (habe ich eben gesehen. Da läuft wohl irgendetwas nicht ganz rund...), das ist aber nicht weiter tragisch, da ja nicht die Zufallsverteilung interessant ist, sondern die "perfekte" Anordnung in der alle Punkte den gleichen minimalen Abstand zu ihrem nächsten Nachbarn haben.

    Das skript aus Post 4 kann jetzt folgendes zusätzlich:
    - Multiplikator: Beschleunigt die Berechnung und erhöht die Ungenauigkeit (vorallem zu Beginn). Später ist man mit einem Wert 1.000 < x < 100.000 gut bedient, höher ist nutzlos, da die Geschwindigkeit durch Rundungsfehler verringert wird. Im Allgemeinen sollte er so eingestellt werden, dass er für die gegebene Verteilung nicht zu ungenau und nicht zu langsam ist.
    - Berechnung pausieren (sodass man wieder eine flüssige Rotation bei normaler Geschwindigkeit hat)
    - Speichern: Speichert die Koordinaten aller Punkte in einer Datei ab. (Obacht, es wird NICHT überschrieben. Also immer eine neue Datei anlegen)
    - Laden: Läd eine vorher abgespeicherte Datei und zeigt die Punkte an.

    Jetzt können Vertielungen berechnet und gespeichert werden. Man kann sie später laden und das Skript etwas weiterrechnen lassen (dann wird die Verteilung nach beliebig langer Zeit beliebig gleichmäßig), oder die gewonnenen Daten für irgendetwas benutzen. (ich habe aber bisher keine Ahnung wozu man soetwas gebrauchen könnte^^).

    Im Anhang sind ein paar Verteilungen für 60, 100, 200, 300, 400 vorberechnet, sodass man sich ein Bild machen kann was dieses Skript bezwecken soll.

    lg
    M

  • Jetzt könnte man die Punkte mit der Warp Funktion von Eukalyptus mit Texturen versehen. Das hatte ich bereits nach dem Sphere Outro vor, ist aber in Vergessenheit geraten.

    So könnte man z.B. eine rotierende Weltkugel darstellen.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯