<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 verschoben.Das geht 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 für die Erstellung der Bitmaps für das Video optimiert.Die angehängte Datei sieht bei der Ausführung möglicherweise etwas besser aus, da der Timer verwendet wird, 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 Hintergrundregenbogen).
// Bild unten).Einige Bilder fügen Alpha als vierten Kanal zur Beschreibung 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 einer Matrix erstellt und mit der J-Funktion zugewiesen
transp = J( nr, nc, 0 );
// Fülle die Pixel mit der Mandelbrot-Funktion.Verwenden Sie die parallele Zuweisung
// statt verschachtelter Schleifen, aus Geschwindigkeitsgründen.
Parallele Zuweisung(
{nr = N Zeilen( transp ), nr2 = N Zeilen( 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 und -spalten auf interessanten Raum skalieren
2 * (r - nr2) / Sqrt( nr * nc ) ) / limit // dividiere durch limit skaliert 0..1
);
// Die nächste Zeile ist die Wichtige.Dieses Bild wird mit 4 Datenkanälen erstellt.
// Rot, Grün, Blau und Alpha.Weil für r,g,b derselbe „transp“-Wert verwendet wird
// Bild ist in Graustufen dargestellt, aber aufgrund der Daten von Mandelbrot() werden Sie nicht viel sehen
// Grau in der Maske...nur Schwarz.Ändern Sie den 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 die flachen Bereiche innerhalb der Mandelbrotmenge, niedrige Werte liegen außerhalb.transp<.5
// ist außen wahr oder 1 und innen falsch oder 0.Dies ergibt ein rechteckiges Array
// Alphas, die 0 oder 1 sind: 1 ist die Maske und 0 ist transparent.(Alpha kann gebrochen sein
// und das wird die Bitmaps verschmelzen.Das wird hier nicht verwendet.)
transpImage = Neues Bild( "rgba", {transp, transp, transp, transp < .5} );
// In diesem Beispiel wird nicht das gespeicherte Bild verwendet, aber Sie können es wie folgt und das PNG verwenden
// Das heißt, save hat Transparenz, wenn man es zum Beispiel mit Gimp öffnet.
// test: transpimage << saveimage( "\\VBOXSVR\windowsShare\transparent\test.png", "png" );
// Erstelle ein Fenster für die Animation und eine Grafikbox für die Bitmaps.
// Die beste Möglichkeit, 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
<
// das erste Bild in den Rahmen einfügen und einen Handle für das Bildsegment erhalten
gb[framebox( 1 )] << addimage( image( transpimage ) );
transpSeg = gb[framebox( 1 )] << childseg;
// positioniere es; Diese „Maske“ wird nur einmal positioniert, und zwar genau hier
transpSeg << move( 50, 50 );
//
//
// ein zweites Regenbogenbild ohne Transparenz erstellen
Hintergrund = J( nr * 2, nc * 2, 0 ); // Extra zum Scrollen.Mach 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 ) )
);
// Pixel in ein Bitmap-Bild umwandeln, zum Rahmen hinzufügen, einen Handle erhalten
backgroundImage = Neues Bild (Hintergrund);
gb[framebox( 1 )] << addimage( image( backgroundImage ) );
backgroundSeg = gb[framebox( 1 )] << childseg;
//
wait(.1);// Stellen Sie sicher, dass sich das Fenster öffnet, bevor die Schleife beginnt
//
Start = 0; // Zeit nutzen, um eine flüssigere Animation zu erstellen
Rahmen=0;
while( start < 30, // 30 Sekunden lang ausführen
Position = Start; // wird als Bogenmaß-Arg für Sin und Cos verwendet...
Start = Start + 1/30;
x = 50 + 50 * Sin( Position * .39 ); // beliebige Skalierung mit
y = 50 + 50 * Cos( Position * .27 ); // künstlerische Lizenz
// OK, das ist ungeschickt; Es scheint, dass die Verschiebungsmethode Hilfe bei der Auswertung benötigt ...
// EvalExpr schaut sich sein Argument an und sucht nach Expr zur Auswertung.
// EvalExpr gibt einen Ausdruck zurück, der noch ausgewertet werden muss
Eval( Eval Expr( backgroundseg << move( Expr( x ), Expr( y ) ) ) );
// gb<
gb << updatewindow; // Dies ist eine sehr flüssige 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):
// Stellen Sie die xscale- und yscale-Werte der Graphbox so ein, dass sie mit der Frame-Größe übereinstimmen
// wenn Sie in präzisen Pixeln arbeiten möchten.
// Experimentieren Sie mit Alpha-Werten um 0,5, um Bilder zu verschmelzen.
// 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 Parallaxen-Idee.
// Verwenden Sie MouseTrap, um eine Maske zu ziehen.
// Versuchen Sie, eine Maske zu drehen, möglicherweise auch mit der MouseTrap, je nachdem, wie weit der Klick entfernt ist
// stammt aus der Mitte der Maske.