<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Il JSL sottostante crea due bitmap: uno sfondo color arcobaleno e una maschera a forma di Mandelbrot.Le due bitmap vengono aggiunte a un grafico e l'arcobaleno viene spostato sotto la maschera.È molto veloce perché le bitmap vengono create solo una volta e il sistema operativo fornisce il supporto per il foro trasparente della maschera.
Il foro trasparente nella maschera viene creato con il livello alfa, che è simile ai livelli rosso, verde e blu.Alpha è un numero compreso tra zero e uno che determina quanto è trasparente/opaco un pixel quando viene eseguito il rendering sopra un pixel disegnato in precedenza.In questo esempio, alfa è zero (trasparente) o uno (opaco).È possibile fondere bitmap con valori intermedi.
Questa versione in linea del JSL è stata ottimizzata per creare le bitmap per il video.Il file allegato potrebbe avere un aspetto leggermente migliore durante l'esecuzione perché utilizza il timer per determinare quale fotogramma mostrare successivamente.
Craige Hales - YouTube
https://www.youtube.com/watch?v=NA-O0YbehpQ
// questo esempio mostra un modo per creare un'immagine con un buco.
// La maggior parte delle immagini usa solo rosso, verde e blu (come l'arcobaleno di sfondo
// immagine sotto).Alcune immagini aggiungono Alpha come quarto canale descrittivo
// opacità o trasparenza.JMP utilizza 1 per opaco.
//
scala = 35; // dimensione complessiva
nr = 20 * scala; // proporzioni
nc = 25 * scala; // proporzioni
// i pixel sono inizialmente costruiti in una matrice, allocati con la funzione J
transp = J( nr, nc, 0 );
// popolare i pixel con la funzione mandelbrot.Usa l'assegnazione parallela
// piuttosto che cicli nidificati, per velocità.
Assegna parallela(
{nr = N Righe( transp ), nr2 = N Righe( transp ) / 2,
nc = N Cols( transp ), nc3 = N Cols( transp ) / 1.3333, limite = 1000},
transp[r, c] = Mandelbrot( limit, 4, // restituisce risposte intere da 1..limit
2 * (c - nc3) / Sqrt( nr * nc ), // ridimensiona le righe della matrice, le colonne allo spazio interessante
2 * (r - nr2) / Sqrt( nr * nc ) ) / limite // divide per limite scale 0..1
);
// la riga successiva è quella importante.questa immagine è creata con 4 canali di dati,
// Rosso, Verde, Blu e Alfa.Poiché lo stesso valore "transp" viene utilizzato per r,g,b the
// l'immagine è in scala di grigi, ma a causa dei dati di Mandelbrot() non vedrai molto
// grigio nella maschera...solo nero.cambia il 2° transp in 1-transp e vedrai
// una maschera verde.Ma il parametro importante è transp<.5 che crea l'alfa
// canale.transp è una matrice rettangolare di valori compresi tra 0 e 1; alti valori
// sono l'area piatta all'interno dell'insieme di mandelbrot, i valori bassi sono all'esterno.trasp<.5
// è vero, o 1, esterno e falso, o 0, interno.questo crea una matrice rettangolare di
// alfa che sono 0 o 1: 1 è la maschera e 0 è trasparente.(l'alfa può essere frazionario
// e questo mescolerà le bitmap.Non lo uso qui.)
transpImage = Nuova immagine( "rgba", {transp, transp, transp, transp < .5} );
// questo esempio non usa l'immagine salvata, ma puoi, come questo, e il file png
// cioè salva ha trasparenza se lo apri con Gimp, per esempio.
// test: transpimage << saveimage( "\\VBOXSVR\windowsShare\transparent\test.png", "png" );
// crea una finestra per contenere l'animazione e un graphbox per contenere le bitmap.
// la soluzione migliore per mettere in mostra bitmap trasparenti in JMP è in un grafico
// perché altri displaybox con bitmap non vogliono davvero sovrapporsi l'un l'altro.
Nuova finestra( "trasparenza",
gb = Graph Box( framesize( nc + 20, nr + 20 ), // Bordo arcobaleno di 10 pixel tutt'intorno
<
// inserisce la prima immagine nel frame e ottiene un handle per il segmento dell'immagine
gb[framebox( 1 )] << addimage( image( transpimage ) );
transpSeg = gb[framebox( 1 )] << childseg;
// posizionalo; questa "maschera" è posizionata solo una volta, proprio qui
transpSeg << sposta( 50, 50 );
//
//
// crea una seconda immagine arcobaleno senza alcuna trasparenza
sfondo = J( nr * 2, nc * 2, 0 ); // extra per lo scorrimento.crea dei pixel arcobaleno...
Assegna parallela(
{nr = N righe( sfondo ), nc = N colonne( sfondo )},
background[r, c] = Colore RGB( (Sin( r / 70 ) + 1) / 2, (Sin( c / 50 ) + 1) / 2, Sin( (r + c) / 60 ) )
);
// trasforma i pixel in un'immagine bitmap, aggiungi al frame, ottieni un handle
backgroundImage = Nuova immagine( sfondo );
gb[framebox( 1 )] << addimage( image( backgroundImage ) );
backgroundSeg = gb[framebox( 1 )] << childseg;
//
wait(.1);// assicurati che la finestra si apra prima che inizi il ciclo
//
inizio = 0; // usa il tempo per creare un'animazione più fluida
cornice=0;
while( start < 30, // eseguito per 30 secondi
posizione = inizio; // usato come radiante arg per sin e cos...
inizio = inizio + 1/30;
x = 50 + 50 * Sin( posizione * .39 ); // ridimensionamento arbitrario utilizzando
y = 50 + 50 * Cos( posizione * .27 ); // licenza artistica
// OK, questo è goffo; sembra che il metodo di spostamento abbia bisogno di aiuto per valutare...
// EvalExpr esamina il suo argomento e cerca Expr da valutare.
// EvalExpr restituisce un'espressione che deve ancora essere valutata
Eval( Eval Expr( backgroundseg << move( Expr( x ), Expr( y ) ) ) );
// gb<
gb << finestra di aggiornamento; // questa è un'animazione molto fluida, ma non interattiva
// crea immagine: gb << savepicture("\\VBOXSVR\windowsShare\transparent\v\v"||right(char(frame++,9),9,"0")||".png", "png" );
);
//
// altre idee (non testate, facci sapere cosa succede):
// imposta xscale e yscale del graphbox in modo che corrispondano alla dimensione del frame
// se vuoi lavorare in pixel precisi.
// sperimenta valori alfa intorno a 0,5 per unire le immagini.
// dispone altri segmenti nel grafico da disegnare prima del segmento della maschera;
// un marcatore seg può apparire attraverso il foro nella maschera.Binocolo cinematografico.
// sposta la maschera invece dei dati.
// più livelli con trasparenza.Scroller laterali che utilizzano l'idea di parallasse.
// usa MouseTrap per trascinare una maschera.
// prova a ruotare una maschera, magari anche con la MouseTrap, a seconda di quanto è lontano il clic
// è dal centro della maschera.