<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Die folgende JSL erstellt zwei Bitmaps: einen regenbogenfarbenen Hintergrund und eine Mandelbrot-förmige Maske.Die beiden Bitmaps werden zu einem Diagramm hinzugefügt und der Regenbogen wird unter der Maske herumbewegt.Es ist sehr schnell, da die Bitmaps nur einmal erstellt werden und das Betriebssystem das transparente Loch der Maske unterstützt.
Das transparente Loch in der Maske wird mit der Alpha-Ebene erstellt, die den roten, grünen und blauen Ebenen ähnelt.Alpha ist eine Zahl zwischen null und eins, die bestimmt, wie transparent/undurchsichtig ein Pixel ist, wenn es über einem zuvor gezeichneten Pixel gerendert wird.In diesem Beispiel ist Alpha Null (transparent) oder Eins (undurchsichtig).Sie können Bitmaps mit Zwischenwerten mischen.
Diese Inline-Version der JSL wurde optimiert, um die Bitmaps für das Video zu erstellen.Die angehängte Datei sieht während der Ausführung möglicherweise etwas besser aus, da sie den Timer verwendet, um zu bestimmen, welcher Frame als nächstes angezeigt wird.
Craige Hales – YouTube
https://www.youtube.com/watch?v=NA-O0YbehpQ
// Dieses Beispiel zeigt eine Möglichkeit, ein Bild mit einem Loch zu erstellen.
// Die meisten Bilder verwenden nur Rot, Grün und Blau (wie der Regenbogen im Hintergrund
// Bild unten).Einige Bilder fügen Alpha als vierten beschreibenden Kanal hinzu
// Undurchsichtigkeit oder Transparenz.JMP verwendet 1 für undurchsichtig.
//
Skala = 35; // gesamte Größe
nr = 20 * Skala; // Seitenverhältnis
nc = 25 * Skala; // Seitenverhältnis
// Pixel werden zunächst in eine Matrix eingebaut, mit der J-Funktion zuweisen
transp = J( nr, nc, 0 );
// Füllen Sie die Pixel mit der Mandelbrot-Funktion.Parallelzuweisung verwenden
// eher als verschachtelte Schleifen, für Geschwindigkeit.
Parallele Zuweisung(
{nr = N Reihen( transp ), nr2 = N Reihen( transp ) / 2,
nc = N Cols( transp ), nc3 = N Cols( transp ) / 1,3333, limit = 1000},
transp[r, c] = Mandelbrot( limit, 4, // gibt ganzzahlige Antworten von 1..limit zurück
2 * (c - nc3) / Sqrt( nr * nc ), // Matrixzeilen,Spalten auf interessanten Raum skalieren
2 * (r - nr2) / Sqrt( nr * nc ) ) / limit // Division durch Limit Skalen 0..1
);
// die nächste Zeile ist die wichtige.Dieses Bild wird mit 4 Datenkanälen erstellt,
// Rot, Grün, Blau und Alpha.Da für r,g,b der gleiche "transp"-Wert verwendet wird
// Bild ist Graustufen, aber wegen der Daten von Mandelbrot() sieht man nicht viel
// grau in der Maske...nur schwarz.Ändern Sie die 2. Transp in 1-Transp und Sie werden sehen
// eine grüne Maske.Aber der wichtige Parameter ist transp<.5, der das Alpha erzeugt
// Kanal.transp ist eine rechteckige Matrix mit Werten zwischen 0 und 1; hohe Werte
// sind der flache Bereich innerhalb der Mandelbrot-Menge, niedrige Werte sind außerhalb.transp<.5
// ist wahr oder 1, außen und falsch, oder 0, innen.dies macht ein rechteckiges Array von
// Alphas, die 0 oder 1 sind: 1 ist die Maske und 0 ist transparent.(alpha kann gebrochen sein
// und das wird die Bitmaps mischen.Wird hier nicht verwendet.)
transpImage = New Image( "rgba", {transp, transp, transp, transp < .5} );
// In diesem Beispiel wird das gespeicherte Bild nicht verwendet, aber Sie können so und das PNG
// Das heißt, es ist transparent, wenn Sie es zum Beispiel mit Gimp öffnen.
// test: transpimage << saveimage( "\\VBOXSVR\windowsShare\transparent\test.png", "png" );
// Erstellen Sie ein Fenster für die Animation und eine Grafikbox für die Bitmaps.
// Ihre beste Wahl, um transparente Bitmaps in JMP zur Geltung zu bringen, ist ein Diagramm
// weil andere Displayboxen mit Bitmaps sich nicht wirklich überlappen wollen.
Neues Fenster ("Transparenz",
gb = Graph Box( framesize( nc + 20, nr + 20 ), // 10 Pixel Regenbogenrand rundherum
<
// füge das erste Bild in den Frame ein und erhalte ein Handle für das Bildsegment
gb[framebox( 1 )] << addimage( image( transpimage ) );
transpSeg = gb[framebox( 1 )] << childseg;
// positioniere es; diese "Maske" wird nur einmal, genau hier, positioniert
transpSeg << move( 50, 50 );
//
//
// ein zweites Regenbogenbild ohne Transparenz erstellen
Hintergrund = J (nr * 2, nc * 2, 0); // extra zum Scrollen.mache ein paar Regenbogenpixel ...
Parallele Zuweisung(
{nr = N Zeilen (Hintergrund), nc = N Spalten (Hintergrund)},
Hintergrund[r, c] = RGB-Farbe ((Sin(r / 70 ) + 1) / 2, (Sin( c / 50 ) + 1) / 2, Sin( (r + c) / 60 ) )
);
// die Pixel in ein Bitmap-Bild umwandeln, zum Rahmen hinzufügen, ein Handle erhalten
backgroundImage = Neues Bild (Hintergrund);
gb[framebox( 1 )] << addimage( image( backgroundImage ) );
backgroundSeg = gb[framebox( 1 )] << childseg;
//
wait(.1);// Stellen Sie sicher, dass das Fenster geöffnet wird, bevor die Schleife beginnt
//
Anfang = 0; // Verwenden Sie die Zeit, um eine flüssigere Animation zu erstellen
Rahmen=0;
while( start < 30, // 30 Sekunden lang laufen lassen
Position = Anfang; // wird als Bogenmaß für sin und cos verwendet ...
Start = Start + 1/30;
x = 50 + 50 * Sin( position * .39 ); // willkürliche Skalierung mit
y = 50 + 50 * Cos( Position * .27 ); // künstlerische Freiheit
// OK, das ist ungeschickt; Es scheint, dass die Move-Methode Hilfe bei der Bewertung benötigt ...
// EvalExpr betrachtet sein Argument und sucht nach auszuwertendem Expr.
// EvalExpr gibt einen Ausdruck zurück, der noch ausgewertet werden muss
Eval( Eval Ausdr( backgroundseg << move( Ausdr( x ), Ausdr( y ) ) ) );
// gb<
gb << Aktualisierungsfenster; // Dies ist eine sehr glatte Animation, aber nicht interaktiv
//bild erstellen: gb << savepicture("\\VBOXSVR\windowsShare\transparent\v\v"||right(char(frame++,9),9,"0")||.png", "png" );
);
//
// weitere Ideen (nicht getestet, lassen Sie uns wissen, was passiert):
// xscale und yscale der Graphbox so einstellen, dass sie der Framegröße entsprechen
// wenn Sie pixelgenau arbeiten möchten.
// Experimentieren Sie mit Alpha-Werten um 0,5, um Bilder zu mischen.
// andere Segmente im zu zeichnenden Diagramm vor dem Maskensegment anordnen;
// Ein Markierungssegment kann durch das Loch in der Maske erscheinen.Filmfernglas.
// Verschiebe die Maske anstelle der Daten.
// mehrere Ebenen mit Transparenz.Side-Scroller mit Parallax-Idee.
// Verwenden Sie MouseTrap, um eine Maske zu ziehen.
// versuche eine Maske zu drehen, vielleicht auch mit der MouseTrap, je nachdem wie weit der Klick geht
// ist von der Mitte der Maske.